Lab 5 - ADC, PWM - Prática 70% da nota do lab
Neste laboratório iremos usar um joystick analógico para implementar um "mouse".
Para isso, você vai precisar de:
| Lista de Materiais | Valor |
|---|---|
| 1x JY-023 (joystick) | R$ 8,00 |
Requisitos
Fazer a leitura de um joystick, formatar os dados corretamente e enviar via serial para a leitura do programa python.

Python
Para executar esse laboratório, você terá que utilizar um programa Python localizado em:
INFO
Consulte o README do repositório para informações de como instalar e executar o programa.
No repositório está sendo fornecido um programa Python (python/main.py) que faz a leitura da porta UART e processa os dados para movimentar o mouse. Para que isso funcione corretamente, será necessário enviar os dados no seguinte formato:
AXIS VAL_1 VAL_0 EOPOnde cada um dos termos do datagrama é composto por 8 bits que indica:
AXIS: 0 ou 1 para indicar eixoXou eixoY.VAL_0: Byte ==menos significativo== (LSB) do valor do movimento do eixoVAL_1: Byte ==mais significativo== (MSB) do valor do movimento do eixoEOP: -1 indica fim de pacote
Exemplo:
- Movimentar o mouse no eixo X para a posição 845 (direita)
00000000 01001101 00000011 11111111
Notem que o valor de 845 em binário é:
00000011 01001101!
- Movimentar o mouse no eixo Y para a posição -55 (baixo)
00000001 11001001 11111111 11111111
Notem que o valor de -55 em binário é:
11111111 11001001!
Firmware
Para garantir a integridade do sinal analógico, você deve aplicar uma média móvel antes de enviarem o dado para a uart. Para isso iremos estruturar o firmware da seguinte maneira:

Onde:
x_taskey_task: Fazem a leitura e implementam a média móvel do valor analógicoxQueueADC: ID (1/0) e dados filtrados para serem transmitidosuart_task: Faz o envio dos dados pela UART
Dicas
A seguir, dicas sobre como executar o lab:
Conexão
Alimentar o módulo com ADC_VREF da PICO.

Dados
Para o mouse funcionar corretamente, devemos obter um valor 0 quando ele estiver parado e um valor positivo para mover, por exemplo, para a direita (se for o eixo x) e um valor negativo para mover para a esquerda. Ou seja, vamos ter que mudar a escala da leitura analógica de 0 ... 4095 para -255 ... +255 e com uma zona morta, como indicado a seguir:

"Zona morta"
A zona morta define um valor que não deve ser enviado para o Python, ou, se enviado, o valor deve ser sempre 0. Isso é necessário devido às variações mecânicas que o potenciômetro possui, pois quando solto, seu valor não é necessariamente 2095.
xQueueADC
A fila xQueueADC deverá ser uma fila de structs para que possamos separar se os dados pertencem ao eixo x ou y. Para isso, sugerimos criar a seguinte struct:
typedef struct adc {
int axis;
int val;
} adc_t;INFO
Não sabe como enviar uma struct para a fila? Consulte a página da disciplina: