ESP32 - Joystick
Neste tutorial, vamos aprender como usar o Joystick com o ESP32. Em detalhes, vamos aprender:
- Como o Joystick funciona
- Como conectar o Joystick ao ESP32 e programá-lo
- Como converter os valores do Joystick em valores controláveis, como coordenadas XY, a direção do motor para cima/baixo/esquerda/direita...

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Sensor Joystick
Você provavelmente já viu o Joystick em algum lugar, como em um controle de videogame, controle de brinquedo ou até em uma grande máquina real, como o controle de uma escavadeira.
O joystick é composto por dois potenciômetros posicionados em ângulo reto entre si e um botão de pressão. Por isso, ele fornece as seguintes saídas:
- Um valor analógico (de 0 a 4095) correspondente à posição horizontal (chamada de coordenada X)
- Um valor analógico (de 0 a 4095) correspondente à posição vertical (chamada de coordenada Y)
- Um valor digital de um botão de pressão (HIGH ou LOW)
A combinação dos dois valores analógicos pode criar coordenadas 2D, cujo centro são os valores quando o joystick está na posição de repouso. A direção real das coordenadas pode ser identificada facilmente quando você executa um código de teste (na próxima parte).
Algumas aplicações podem usar todas as três saídas, outras podem usar apenas algumas delas.
Pinagem
Um Joystick tem 5 pinos:
- Pino GND: precisa ser conectado ao GND (0V)
- Pino VCC: precisa ser conectado ao VCC (5V)
- Pino VRX: fornece um valor analógico correspondente à posição horizontal (chamada de coordenada X).
- Pino VRY: fornece um valor analógico correspondente à posição vertical (chamada de coordenada Y).
- Pino SW: é a saída do botão de pressão dentro do joystick. Ele é normalmente aberto. Se usarmos um resistor de pull-up neste pino, o pino SW ficará em HIGH quando não estiver pressionado e em LOW quando estiver pressionado.

Como Funciona
- Quando você empurra a alavanca do joystick para a esquerda/direita, a tensão no pino VRX muda. A faixa de tensão vai de 0 a 5V (0 na esquerda e 5v na direita). O valor da tensão é proporcional à posição da alavanca ⇒ O valor lido no pino analógico do ESP32 vai de 0 a 4095
- Quando você empurra a alavanca do joystick para cima/baixo, a tensão no pino VRY muda. A faixa de tensão vai de 0 a 5V (0 em cima e 5v embaixo). O valor da tensão é proporcional à posição da alavanca ⇒ O valor lido no pino analógico do ESP32 vai de 0 a 4095
- Quando você empurra a alavanca do joystick em qualquer direção, a tensão nos pinos VRX e VRY muda proporcionalmente à projeção da posição em cada eixo
- Quando você pressiona a alavanca do joystick de cima para baixo, o botão de pressão dentro do joystick é fechado. Se usarmos um resistor de pull-up no pino SW, a saída do pino SW mudará de 5V para 0V ⇒ O valor lido no pino digital do ESP32 muda de HIGH para LOW
Diagrama de Ligação
- Como conectar o ESP32 e o joystick usando uma protoboard

This image is created using Fritzing. Click to enlarge image
Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.
- Como conectar o ESP32 e o joystick usando uma placa breakout com bornes de parafuso

Como Programar o Joystick
O joystick tem duas partes: analógica (eixos X, Y) e digital (botão de pressão)
- Para as partes analógicas (eixos X, Y), basta ler o valor do pino de entrada analógica usando a função analogRead().
- Para a parte digital (botão de pressão): é um botão. A maneira mais simples e prática é usar a biblioteca ezButton. Essa biblioteca oferece debounce para botões e também ativa um resistor de pull-up interno. Você pode ver mais sobre o botão no tutorial ESP32 - Botão. O código será apresentado na próxima seção deste tutorial.
Depois de ler os valores dos pinos analógicos, talvez precisemos convertê-los em alguns valores controláveis. A próxima parte vai fornecer os códigos de exemplo para isso.
Código ESP32
Esta seção vai fornecer os seguintes códigos de exemplo para ESP32:
- Código de exemplo: lê os valores analógicos do joystick
- Código de exemplo: lê os valores analógicos e o estado do botão do joystick
- Código de exemplo: converte o valor analógico nos comandos MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
- Código de exemplo: converte os valores analógicos em ângulos para controlar dois servo motores (por exemplo, em uma câmera pan-tilt)
Lê os valores analógicos do joystick
Passos Rápidos
- Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para o ESP32 na Arduino IDE.
- Faça a ligação conforme a imagem acima.
- Conecte a placa ESP32 ao seu PC usando um cabo USB Type-C
- Abra a Arduino IDE no seu PC.
- Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
- Copie o código acima e abra-o na Arduino IDE
- Clique no botão Upload na Arduino IDE para carregar o código no ESP32
- Empurre a alavanca do joystick ao máximo até o limite e depois gire-a em círculo (no sentido horário ou anti-horário)
- Veja o resultado no Serial Monitor.
- Enquanto gira a alavanca do joystick, continue observando o Serial Monitor
- Se o valor de X for 0, marque ou memorize a posição atual como esquerda ⇒ a direção oposta é a direita
- Se o valor de Y for 0, marque ou memorize a posição atual como cima ⇒ a direção oposta é baixo
- Clique no ícone Libraries na barra lateral esquerda da Arduino IDE.
- Pesquise por “ezButton” e depois encontre a biblioteca de botão da ArduinoGetStarted.com
- Clique no botão Install para instalar a biblioteca ezButton.
- Copie o código acima e abra-o na Arduino IDE
- Clique no botão Upload na Arduino IDE para carregar o código no ESP32
- Empurre a alavanca do joystick para a esquerda/direita/cima/baixo
- Pressione a alavanca do joystick a partir do topo
- Veja o resultado no Serial Monitor.
- Copie o código acima e abra-o na Arduino IDE
- Clique no botão Upload na Arduino IDE para carregar o código no ESP32
- Empurre a alavanca do joystick para a esquerda/direita/cima/baixo ou em qualquer direção
- Veja o resultado no Serial Monitor.
- O ADC do ESP32 não é perfeitamente preciso e pode precisar de calibração para obter resultados corretos. Cada placa ESP32 pode ser um pouco diferente, então você precisa calibrar o ADC para cada placa individualmente.
- A calibração pode ser difícil, especialmente para iniciantes, e nem sempre vai dar exatamente os resultados que você deseja.
Você pode ter notado que o valor analógico não é proporcional ao movimento do joystick. Esse problema não é causado pelo joystick em si, mas sim pelo ADC do ESP32. O final deste tutorial vai explicar por que isso acontece.
Lê os valores analógicos e o estado do botão de um joystick
Passos Rápidos

Converte o valor analógico em comandos MOVE LEFT/RIGHT/UP/DOWN
Passos Rápidos
※ Nota:
Em um determinado momento, pode não haver nenhum comando, haver um comando ou dois comandos (por exemplo, UP e LEFT ao mesmo tempo)
Converte os valores analógicos em ângulos para controlar dois servo motores
Os detalhes são apresentados no tutorial ESP32 - Joystick controla Servo Motor
※ Nota:
Este tutorial usa a função analogRead() para ler valores de um ADC (Conversor Analógico-Digital) conectado a um joystick. O ADC do ESP32 é bom para projetos que NÃO precisam de alta precisão. No entanto, para projetos que precisam de medições precisas, observe:
Para projetos que precisam de alta precisão, considere usar um ADC externo (por exemplo, ADS1115) com o ESP32 ou usar um Arduino, que tem um ADC mais confiável. Se você ainda quiser calibrar o ADC do ESP32, consulte o ESP32 ADC Calibration Driver