Aula — 03 de Novembro (Segunda feira) - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki
Aula — 03 de novembro — Montagem do protótipo no protoboard e Firmwares testados no ESP32
Resumo:
Registro da aula do dia 03/11 — montagem do protótipo no protoboard, firmwares testados no ESP32 e a versão do módulo de kernel (joy_driver_module.c.save) usada para testes com evtest. Este documento descreve o material, montagem, firmwares, driver, procedimentos de build/instalação e logs de teste.
Objetivo da Aula
Documentar o estado do protótipo físico do joystick e validar a leitura dos botões e d-pad (analógico) pelo ESP32, bem como testar a captura desses dados no Linux via driver de kernel que interpreta um protocolo serial/bit-banged.
Material Utilizado
- ESP32 DevKit v1
- Protoboard
- Joystick analógico (módulo)
- 4 botões push (mais botões START / SELECT / ANALOG)
- Resistores 10 kΩ (pull-down ou pull-up conforme montagem)
- Cabos jumper
- Máquina com Linux / Raspberry Pi / Orange Pi para testes do driver
Esquemático / Montagem (Fritzing)
- Arquivo do projeto Fritzing:
Joystick02.fzz - Imagem da montagem:
JoystickDevTitans_bb.png
Firmwares testados (principais versões utilizadas)
1. firmware.ino — versão 02/11 (bit-banged sync + envio 16 bits)
Trechos principais / comportamento:
Define pinos de controle:
- Define pinos de controle:
#define TX_PIN 5 #define CLK_PIN 4 #define SYNC_PIN 2
- Pinos dos botões e eixos:
const int PIN_UP = 36; const int PIN_RIGHT = 39; const int PIN_DOWN = 34; const int PIN_LEFT = 35; const int PIN_START = 32; const int PIN_SELECT = 33; const int PIN_ANALOGB = 25;
const int PIN_AXIS_X = 26; const int PIN_AXIS_Y = 27;
- Leitura com debounce (DEBOUNCE_MS = 25) e consolidação em allStates[11] (7 botões + 4 dpad).
- Envio: sendJoystickData() monta dataToWrite com 11 bits usados e chama write_2_bytes(dataToWrite) — write_2_bytes implementa bit-banging sincronizado via SYNC_PIN e escreve bits em TX_PIN enquanto alterna CLK_PIN.
- Serial: imprime 0/1 enquanto transmite (útil para debug).
Comportamento observado no Serial Monitor:
Joystick ESP32 iniciado.
UP,RIGHT,DOWN,LEFT,START,SELECT,ANALOG,DPAD_UP,DPAD_DOWN,DPAD_LEFT,DPAD_RIGHT
0000000010100000
0000000010100000
...
2. ControlJoystick02.ino — versão 03/11 (envia apenas quando há mudança)
Principais diferenças:
-
Usa pinos digitais A0/A1 para eixos (ou ports analógicos em uma placa diferente).
-
Mantém lastStates[11] e só transmite quando algo muda (stateChanged).
-
Protocolo serial simplificado: envia linha com prefixo J e valores separados por vírgula:
Serial.print("J");
for (i=0;i<7;i++){ Serial.print(allStates[i]); Serial.print(","); }
for (i=7;i<11;i++){ Serial.print(allStates[i]); Serial.print(","); }
Serial.println();
-
Baud de teste: 115200 (dependendo da versão)
-
Ajuda a reduzir tráfego serial e facilita parsing no lado do kernel/usuário.
Driver de Kernel (versão driver/joy_driver_module.c.save usada em 03/11)
Arquivos relevantes:
-
driver/joy_driver_module.c.save (versão de teste)
-
Arquivo contém: inicialização de input_device, timer, rotina read_2_bytes_uart_module() bit-banging para ler 16 bits via GPIO, processamento de bits para input_report_key().
Pontos chave do driver:
- Define máscaras de botões e mapeia para códigos do input subsystem:
{A_BUTTON_MASK, BTN_SOUTH},
{B_BUTTON_MASK, BTN_EAST},
...
-
Usa gpio_to_desc(RX_GPIO_NUM) e gpiod_to_irq() para configurar interrupção no pino RX (borda de descida = start bit).
-
read_2_bytes_uart_module() — faz leitura bit-a-bit com udelay() (tempo por bit calculado a partir de BAUD_RATE).
-
processData() — compara input_data vs previous_data e emite input_report_key(...); input_sync(...);
-
Usa timer (joy_timer) com LOOP_INTERVAL_MS para loop periódico.
Resumo: Driver tenta decodificar a transmissão bit-banged enviada pelo ESP32 e transformar em eventos de botão do kernel.
Build e Instalação (passo a passo)
Firmware (ESP32)
1. Abrir o sketch correspondente no Arduino IDE (firmware.ino ou ControlJoystick02.ino).
2. Selecionar placa: ESP32 Dev Module (ou Node32s conforme versão).
3. Selecionar porta serial correta.
4. Upload (Ctrl+U).
Driver de Kernel (modo teste, em máquina Linux com headers)
OBSERVAÇÃO: Para compilar e inserir módulos no kernel do AOSP/Raspberry exige compatibilidade de versão. Além de uma máquina Linux com headers do kernel compatíveis.
1. Navegue até a pasta do driver:
cd driver
make
2. Inserir o módulo: sudo insmod joy_driver_module.ko
3. Verificar mensagens: dmesg | tail -n 40
4. Remover: sudo rmmod joy_driver_module
Testes e Logs
1. Serial Monitor (ESP32)
-
Serial prints mostram pacotes binários como 0000000010100000 (cada caractere é bit enviado por write_2_bytes() ou por Serial).
-
Nas versões com prefixo J, as linhas ficam no formato:
J1,0,0,0,0,0,0,1,0,1,0,
2. evtest / dmesg (driver)
- Ao carregar o driver e executando evtest /dev/input/eventX, foram observados eventos:
Event: time 1762286395.933030, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 1
Event: time 1762286396.153005, ---- SYN_REPORT ----
Event: time 1762286396.703015, type 1 (EV_KEY), code 305 (BTN_EAST), value 1
...
- O terminal mostrou repetidamente joy_driver_module: Dados Síncronos Recebidos: 1280 = 0x0500 (mensagens de debug do driver).
O driver está recebendo dados e gerando eventos EV_KEY para os botões mapeados (BTN_SOUTH, BTN_EAST, BTN_NORTH, BTN_WEST, DPAD_* etc). O evtest confirma que eventos chegam ao subsistema de input.
Mudanças / Changelog (versão antiga → versão atual)
Firmware: firmware.ino (24/09) → firmware.ino (02/11) → ControlJoystick02.ino (03/11)
24/09 (versão inicial)
- Leitura analógica e digital básica:
readAnalogs()faziaanalogRead()e reportava valores X/Y (divididos por 10).readButtons()faziadigitalRead()e imprimia mudanças (Serial.print("A:"), etc).
- Baud em 115200 (debug rápido).
- Envio contínuo de eventos (cada mudança era logada em serial indiscriminadamente).
- Foco em debug dos valores analógicos e estados dos botões (linhas tipo
X:,Y:,A:1).
02/11 (introdução do protocolo bit-banged)
Principais mudanças introduzidas:
-
Implementado protocolo bit-banged sincronizado com pinos:
#define TX_PIN 5 #define CLK_PIN 4 #define SYNC_PIN 2 -
Novo método de transmissão write_2_bytes(uint16_t data) que:
- Sincroniza com SYNC_PIN (espera bordas para garantir alinhamento).
- Alterna CLK_PIN e escreve bits em TX_PIN.
- Imprime 0/1 no Serial para debug durante a escrita (útil para análise temporal).
-
Estrutura de leitura:
- readButtons() com debounce (25 ms).
- readDPadFromAnalog() que converte eixos analógicos em 4 estados D-Pad.
- readAllStates() consolida 11 sinais (7 botões + 4 dpad) em allStates[].
-
Envio: sendJoystickData() monta dataToWrite com bits e chama write_2_bytes(dataToWrite).
-
Comportamento observado: Serial mostra strings binárias como 0000000010100000 (debug do pacote enviado).
-
Objetivo: criar protocolo robusto para que o host (driver) leia bit-a-bit via GPIO.
Impacto: Introduziu sincronização por hardware e timing sensível; tornou o link mais determinístico, mas dependente do timing (baud) e da estabilidade do SYNC_PIN.
03/11 (ControlJoystick02.ino) — versão usada em aula Principais mudanças em relação à 02/11:
- Envio somente quando há mudança de estado:
- Mantém lastStates[11] e só chama sendJoystickData() se stateChanged == true.
- Reduz tráfego serial e processamento no host.
- Formato de saída textual:
- Envia linhas com prefixo J e valores separados por vírgula:
J1,0,0,0,0,0,0,1,0,1,0, - Facilita parsing do lado do host
- Envia linhas com prefixo J e valores separados por vírgula:
- Pinos e constantes adaptados:
- Usa pinos digitais simples (ex.: const int PIN_UP = 2; ...) e PIN_AXIS_X = A0 etc — versão mais portátil para placas que exponham A0/A1.
- Baud e debounce:
- Serial em 115200 no exemplo; debounce mantém 25 ms; delay reduzido a 10 ms no loop.
- Objetivo: tornar comunicação mais eficiente (menos ruído) e facilitar parsing no host sem exigir bit-bang sincronizado.