Aula — 17 de Novembro (Segunda feira) - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki
Integração Final, Testes e Ajustes do Firmware + Driver
Nesta aula avançamos de forma significativa na integração entre o firmware do ESP32, o driver de kernel Linux e o AOSP rodando no Raspberry Pi 4B.
Principais Conquistas do Dia
- Driver carregado com sucesso no AOSP
O módulo nesjoy.ko foi finalmente instalado no Android e registrado pelo InputFlinger.
O Android reconheceu o joystick como um gamepad nativo.
- Aplicativo Android recebendo inputs
Rodamos um jogo no AOSP e os botões do controle funcionaram corretamente, confirmando toda a cadeia:
ESP32 → GPIOs → Driver Kernel → Input Subsystem → InputFlinger → App Android
Problemas Identificados
- Analógico não funciona no Android (D-Pad analógico)
O driver recebe o pacote de 16 bits, mas os bits referentes ao eixo analógico não são interpretados corretamente.
Possíveis causas identificadas:
-
Ordem dos bits pode não coincidir com a ordem esperada pelo driver.
-
Bits do eixo podem não estar sendo montados corretamente no dataToWrite.
-
Mapeamento no driver pode estar diferente do firmware atual.
- Analógico gera lixo mesmo parado
Mesmo estando em posição neutra, o ESP32 continua enviando valores que disparam DOWN/LEFT/RIGHT/UP irregularmente.
Hipóteses:
-
Ruído nos ADCs do ESP32.
-
Centro dos eixos pode estar descalibrado.
-
AXIS_THRESHOLDestá pequeno demais. -
Conversão dos eixos foi invertida para adequar o jogo (veja o novo mapeamento).
Alterações realizadas no Firmware (17/11)
- Reordenação dos botões
Foi modificada a ordem do array buttons[]:
Button buttons[] = {
{"RIGHT", PIN_RIGHT, false, HIGH, HIGH, 0},
{"DOWN", PIN_DOWN, false, HIGH, HIGH, 0},
{"UP", PIN_UP, false, HIGH, HIGH, 0},
{"LEFT", PIN_LEFT, false, HIGH, HIGH, 0},
{"SELECT",PIN_SELECT,true, HIGH, HIGH, 0},
{"START", PIN_START, true, HIGH, HIGH, 0},
};
Essa ordem influencia diretamente o bit que cada botão ocupa em dataToWrite.
- Remoção temporária do botão ANALOG
O botão ANALOG estava causando conflitos e foi comentado.
- Novo mapeamento do D-Pad analógico
A ordem agora está assim:
dpadStates[0] = down_active;
dpadStates[1] = right_active;
dpadStates[2] = up_active;
dpadStates[3] = left_active;
- Enviar dados apenas quando houver mudança
Foi adicionada uma lógica para evitar enviar pacotes redundantes:
static uint16_t lastSent = 0;
if (lastSent != dataToWrite) {
lastSent = dataToWrite;
write_2_bytes(dataToWrite);
}
Isso ajuda muito:
-
reduz ruído no CLK,
-
diminui carga no driver,
-
facilita debugging no kernel.
Próximas Ações
1.Validar se o driver Linux interpreta os bits na mesma ordem que o firmware envia
-
Conferir máscaras (MASK_UP, MASK_DOWN, etc.)
-
Ajustar ordenação dos bits 0..9 para coincidir com o driver.
2.Recalibrar o analógico
-
Ajustar AXIS_CENTER_VAL_X/Y
-
Testar thresholds maiores (ex: 400 ou 450)
-
Considerar filtragem (média móvel)
- Revisar o PR do Jefferson e comparar com o código enviado à main
Foi identificado que:
-
PR e modificações locais alteram as mesmas áreas
-
Possível conflito de abordagem
Evidências
https://github.com/user-attachments/assets/e9139741-1885-480f-b321-ffec92f803e6