Aula — 29 de Setembro (Segunda‐feira) - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki

Aula — 29/09 (Segunda-feira)

Foi desenvolvido o ControlJoystick02.ino, uma versão mais aprimorada do firmware do joystick, com debounce, leitura analógica e envio estruturado dos dados em array serial.

Este firmware implementa a leitura completa de um joystick customizado para ESP32, incluindo:

  • 7 botões digitais (UP, RIGHT, DOWN, LEFT, START, SELECT, ANALOG)
  • Eixo analógico duplo (X e Y)
  • Geração de D-Pad digital a partir dos eixos analógicos
  • Envio contínuo dos estados via comunicação Serial
  • Filtro de debounce por software para leituras estáveis

Objetivo: permitir que o ESP32 envie ao sistema host (Raspberry Pi) o estado completo de todos os botões e direções.

Pinos utilizados

Função Pino Tipo Observações
UP D2 Digital Entrada direta (sem pull-up)
RIGHT D3 Digital Entrada direta
DOWN D4 Digital Entrada direta
LEFT D5 Digital Entrada direta
START D6 Digital Entrada com pull-up interno
SELECT D7 Digital Entrada com pull-up interno
Botão D8 Digital Entrada com pull-up interno
Eixo X A0 Analógico Leitura horizontal
Eixo Y A1 Analógico Leitura vertical

Estrutura de botões

Cada botão é representado por uma estrutura que armazena:

  • Pino associado
  • Modo de entrada (INPUT ou INPUT_PULLUP)
  • Estado atual e anterior
  • Tempo da última mudança (para debounce)

Essa estrutura permite:

  • Aplicar debounce por tempo (DEBOUNCE_MS = 25 ms)
  • Identificar mudanças de estado estáveis
  • Armazenar informações do pino e modo de entrada

Funções principais

setup()

Responsável por:

  • Inicializar a comunicação Serial (115200 bps)
  • Configurar todos os pinos conforme o tipo de botão
  • Exibir cabeçalho explicativo no monitor Serial

readButtons()

  • Lê cada botão e aplica debounce baseado em tempo
  • Gera um vetor de 7 posições (valores 0 ou 1)

readDPadFromAnalog()

Transforma os eixos analógicos em sinais digitais de D-Pad:

  • Lê analogRead(A0) e analogRead(A1)
  • Calcula deslocamento em relação ao centro (AXIS_CENTER_VAL_X/Y)
  • Define UP, DOWN, LEFT, RIGHT conforme o limiar (AXIS_THRESHOLD = 300)
  • Resultado: 4 valores binários representando o D-Pad

readAllStates()

Combina as leituras:

  • Botões digitais → posições 0 a 6
  • D-Pad analógico → posições 7 a 10

Gera um array completo de 11 elementos, representando todo o joystick.

sendJoystickData()

  • Envia pela Serial o pacote completo
  • Começa com o prefixo J
  • Usa vírgulas como separadores
  • Finaliza com \n (nova linha)

loop()

Executa continuamente:

  • Lê todos os estados (readAllStates)
  • Envia o pacote (sendJoystickData)
  • Espera 50 ms antes da próxima leitura

Histórico

Alteração
Criação da versão base (firmware.ino) — leitura simples e logs individuais
Atualização para ControlJoystick02.ino — envio de array binário + debounce + D-Pad analógico