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.

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ê
| Placa | Resolução | Faixa de leitura |
|---|---|---|
| Arduino Nano | 10 bits | 0 a 1023 |
| ESP32 | 12 bits | 0 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:
- 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.
- 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.
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.