ESP32 - Joystick

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

Pinagem do Joystick

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

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
Diagrama de Ligação do ESP32 com o Joystick

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

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

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) 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

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

    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

    /* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-joystick */ #include <ezButton.h> #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define SW_PIN 17 // ESP32 pin GPIO17 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

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

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

    /* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) 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-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.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2

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

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

    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

Vídeo

Referências de Funções

Tutoriais Relacionados

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