Arduino Nano ESP32 - Joystick
Neste tutorial, vamos aprender como usar o Joystick com o Arduino Nano ESP32. Em detalhes, vamos aprender:
- Como o Joystick funciona
- Como conectar o Joystick ao Arduino Nano 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 Sensor Kit (18 sensors/displays) |
Sobre o Sensor Joystick
Você provavelmente já viu o Joystick em algum lugar, como em um controle de videogame, um controle de brinquedo ou até mesmo em uma máquina real grande, como o controle de uma escavadeira.
O joystick é composto por dois potenciômetros 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 2-D, com o centro sendo os valores quando o joystick está na posição de repouso. A direção real das coordenadas pode ser identificada simplesmente ao executar um código de teste (na próxima parte).
Algumas aplicações podem usar as três saídas, e outras podem usar apenas algumas das três saídas.
Pinagem
Um Joystick tem 5 pinos:
- Pino GND: precisa ser conectado ao GND (0V)
- Pino VCC: precisa ser conectado ao VCC (3.3V)
- 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 pull-up neste pino, o pino SW ficará HIGH quando não estiver pressionado e LOW quando estiver pressionado.

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

This image is created using Fritzing. Click to enlarge image
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 forma mais simples e conveniente é usar a biblioteca ezButton. Esta biblioteca oferece suporte a debounce para botões e também habilita um resistor pull-up interno. Você pode ver mais sobre botões no tutorial Arduino Nano 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 seja necessário convertê-los em valores controláveis. A próxima parte fornecerá exemplos de código para isso.
Código Arduino Nano ESP32
Esta seção fornecerá os seguintes exemplos de código para o Arduino Nano ESP32:
- Código de exemplo: lê valores analógicos do joystick
- Código de exemplo: lê valores analógicos e lê o estado do botão do joystick
- Código de exemplo: converte o valor analógico em comandos MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
- Código de exemplo: converte valores analógicos em ângulos para controlar dois servo motores (por exemplo, em uma câmera pan-tilt)
Lê valores analógicos do joystick
Passos Rápidos
Para começar com o Arduino Nano ESP32, siga estes passos:
- Se você é novo no Arduino Nano ESP32, consulte o tutorial sobre como configurar o ambiente para o Arduino Nano ESP32 na Arduino IDE.
- Ligue os componentes de acordo com o diagrama fornecido.
- Conecte a placa Arduino Nano ESP32 ao seu computador usando um cabo USB.
- Abra a Arduino IDE no seu computador.
- Selecione a placa Arduino Nano ESP32 e a porta COM correspondente.
- Copie o código acima e abra com a Arduino IDE
- Clique no botão Upload na Arduino IDE para fazer upload do código para o Arduino Nano ESP32
- Empurre o manche do joystick até o limite máximo e depois gire-o em círculo (no sentido horário ou anti-horário)
- Veja o resultado no Serial Monitor.
- Enquanto gira o manche do joystick, continue observando o Serial Monitor
- Se o valor X for 0, marque ou memorize a posição atual como esquerda ⇒ a direção oposta é a direita
- Se o valor Y for 0, marque ou memorize a posição atual como cima ⇒ a direção oposta é baixo
- Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda da Arduino IDE
- Pesquise “ezButton” e 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 com a Arduino IDE
- Clique no botão Upload na Arduino IDE para fazer upload do código para o Arduino Nano ESP32
- Empurre o manche do joystick para a esquerda/direita/cima/baixo
- Pressione o manche do joystick por cima
- Veja o resultado no Serial Monitor.
- Copie o código acima e abra com a Arduino IDE
- Clique no botão Upload na Arduino IDE para fazer upload do código para o Arduino Nano ESP32
- Empurre o manche do joystick para a esquerda/direita/cima/baixo ou para qualquer direção
- Veja o resultado no Serial Monitor.
- O ADC do Arduino Nano ESP32 não é perfeitamente preciso e pode exigir calibração para resultados corretos. Cada placa Arduino Nano ESP32 pode variar um pouco, então a calibração é necessária para cada placa individualmente.
- A calibração pode ser difícil, especialmente para iniciantes, e nem sempre pode dar os resultados exatos que você quer.
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 Arduino Nano ESP32. O final deste tutorial explicará por que isso acontece.
Lê valores analógicos e lê 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 dado momento, pode não haver nenhum comando, um comando ou dois comandos (por exemplo, UP e LEFT ao mesmo tempo)
Converte valores analógicos em ângulos para controlar dois servo motores
Os detalhes são apresentados no tutorial Arduino Nano 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 sensor ou componente. O ADC do Arduino Nano ESP32 é adequado para projetos que não exigem alta precisão. No entanto, para projetos que precisam de medições precisas, tenha em mente o seguinte:
Para projetos que exigem alta precisão, considere usar um ADC externo (por exemplo, ADS1115) com o Arduino Nano ESP32 ou usar outro Arduino, como o Arduino Uno R4 WiFi, que tem um ADC mais confiável. Se você ainda quiser calibrar o ADC do Arduino Nano ESP32, consulte o ESP32 ADC Calibration Driver.