iotdata, por Data Frontieriot
data
Programação em blocos

Joystick analógico: como ler os eixos X e Y e o botão

Como funciona o módulo de joystick com dois potenciômetros e um botão, as faixas de leitura no Arduino Nano e no ESP32, por que calibrar o centro e usar zona morta, e como ligar o botão sem resistor.

Engenharia Data Frontier· Publicado em 22 de outubro de 2026

O módulo de joystick dos kits de robótica é, por dentro, muito simples: dois potenciômetros e um botão. Um potenciômetro mede o movimento para os lados (eixo X), o outro mede para a frente e para trás (eixo Y). Apertar a alavanca para baixo fecha o botão.

Os cinco pinos

  • GND e VCC (alimentação).
  • VRx e VRy: as saídas analógicas dos dois eixos.
  • SW: o botão.

Cada potenciômetro funciona como um divisor de tensão. Alavanca num extremo, a saída fica perto de 0 V; no outro, perto da tensão de alimentação; no meio, mais ou menos na metade.

O que a placa lê

PlacaResoluçãoFaixa de leitura
Arduino Nano10 bits0 a 1023
ESP3212 bits0 a 4095

No Nano, o joystick é alimentado em 5 V e os eixos vão em entradas analógicas, de A0 a A7. A6 e A7 são uma boa escolha para eixos, porque só servem para leitura analógica e deixam os outros pinos livres.

No ESP32, alimente o joystick em 3,3 V, nunca em 5 V: a saída do eixo não pode passar da tensão do pino. E use os pinos do ADC1 (GPIO 32 a 39), porque o ADC2 não funciona com o Wi-Fi ligado. Em MicroPython, a atenuação de 11 dB permite ler a faixa inteira. O conversor do ESP32 é menos linear perto das pontas: para um joystick isso não atrapalha, mas não espere precisão de medidor.

O centro nunca é exatamente o meio

Com a alavanca solta, o Nano raramente lê 512. Lê 498, 521, 507, e o valor muda de joystick para joystick. Se o programa trata "diferente de 512" como movimento, o braço anda sozinho.

Duas providências resolvem:

  1. Calibrar o centro ao ligar. Nos primeiros instantes, com a alavanca solta, o programa lê o eixo algumas vezes e guarda a média como o centro daquele joystick.
  2. Zona morta. Qualquer leitura a menos de uma margem do centro (por exemplo, 40 unidades no Nano) conta como "parado".

Os cartões de joystick da IDE de blocos já fazem as duas coisas.

O botão sem resistor

O botão do módulo liga o pino SW ao GND quando apertado. Solto, ele fica desligado, e um pino de entrada "flutuando" lê valores aleatórios. A solução é o pull-up interno da placa:

  • No Arduino, o modo INPUT_PULLUP.
  • No MicroPython, Pin.PULL_UP.

Com o pull-up, o pino lê 1 com o botão solto e 0 com o botão apertado: a lógica é invertida, e o código precisa levar isso em conta.

No ESP32, cuidado: os GPIO 34 a 39 não têm pull-up interno. O botão vai em outro pino.

Repique

Um botão mecânico não fecha de uma vez: o contato "quica" por alguns milissegundos e a placa pode ler vários apertos. Esperar de 20 ms a 50 ms depois da primeira mudança e confirmar a leitura evita que um aperto grave três posições no braço.

Na IDE de blocos

Na IDE de blocos, o cartão de joystick pede os pinos de X, Y e botão e oferece o eixo já centrado, de -100 a 100. Para o que fazer com esse valor no braço, veja os dois jeitos de controle em braço robótico com quatro mini servos.

Na prática

A IoTData faz o cadastro e o envio por você.

Um engenheiro nosso responde: qual rede chega até o poço, o que o IGAM ou a ANA vão pedir, quanto custa e quem cuida do cadastro de operador.