Arduino Nano ESP32 - Joystick

Neste tutorial, vamos aprender como usar o Joystick com o Arduino Nano ESP32. Em detalhes, vamos aprender:

Pinagem do Joystick

Hardware Necessário

1×Arduino Nano ESP32
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×Joystick
1×Protoboard
1×Fios Jumper
1×(Opcional) Conector de Alimentação DC
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano ESP32

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

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.
Pinagem do Joystick

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

Diagrama de Ligação do Joystick com Arduino Nano ESP32

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().
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • 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

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-joystick */ #define VRX_PIN A0 // The Arduino Nano ESP32 pin connected to VRX pin #define VRY_PIN A1 // The Arduino Nano ESP32 pin connected to VRY pin int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.println(valueY); delay(200); }

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.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2
  • 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

    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

    /* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-joystick */ #include <ezButton.h> #define VRX_PIN A0 // The Arduino Nano ESP32 pin connected to VRX pin #define VRY_PIN A1 // The Arduino Nano ESP32 pin connected to VRY pin #define SW_PIN D2 // The Arduino Nano ESP32 pin connected to SW pin ezButton button(SW_PIN); int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value int bValue = 0; // To store value of the button void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // Read the button value bValue = button.getState(); if (button.isPressed()) { Serial.println("The button is pressed"); // TODO do something here } if (button.isReleased()) { Serial.println("The button is released"); // TODO do something here } // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.print(valueY); Serial.print(" : button = "); Serial.println(bValue); }

    Passos Rápidos

    • 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.
    Biblioteca de botão do Arduino Nano ESP32
    • 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.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    Ln 11, Col 1
    Arduino Nano ESP32 on COM15
    2

    Converte o valor analógico em comandos MOVE LEFT/RIGHT/UP/DOWN

    /* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-joystick */ #define VRX_PIN A0 // The Arduino Nano ESP32 pin connected to VRX pin #define VRY_PIN A1 // The Arduino Nano ESP32 pin connected to VRY pin #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int valueX = 0 ; // to store the X-axis value int valueY = 0 ; // to store the Y-axis value int command = COMMAND_NO; void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS // print command to serial and process command if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); // TODO: add your task here } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); // TODO: add your task here } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); // TODO: add your task here } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); // TODO: add your task here } }

    Passos Rápidos

    • 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.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Nano ESP32
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
    New Line
    9600 baud
    Ln 11, Col 1
    Arduino Nano ESP32 on COM15
    2

    ※ 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:

    • 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.

    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.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!