ESP32 - joystick

En este tutorial, vamos a aprender cómo usar un joystick con ESP32. En detalle, aprenderemos:

Pinout del joystick

Hardware Requerido

1×Módulo de Desarrollo ESP32 ESP-WROOM-32
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×Joystick
1×Protoboard
1×Cables Puente
1×(Opcional) Conector de Alimentación DC
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentación para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca del sensor de joystick

Probablemente veas el joystick en algún lugar, como un controlador de juegos, un controlador de juguetes, o incluso una gran máquina real, como un controlador de excavadora.

El joystick está compuesto por dos potenciómetros cuadrados y un pulsador. Por lo tanto, proporciona las siguientes salidas:

  • Un valor analógico (de 0 a 4095) que corresponde a la posición horizontal (llamada coordenada X)
  • Un valor analógico (de 0 a 4095) que corresponde a la posición vertical (llamada coordenada Y)
  • Un valor digital de un pulsador (HIGH o LOW)

La combinación de dos valores analógicos puede crear coordenadas 2D con el centro definido por los valores cuando el joystick está en la posición de reposo. La dirección real de las coordenadas se puede identificar simplemente cuando ejecutes un código de prueba (en la siguiente parte).

Algunas aplicaciones pueden usar las tres salidas, algunas aplicaciones pueden usar algunas de las tres salidas.

Diagrama de pines

Un joystick tiene 5 pines:

  • Pin GND: debe conectarse a GND (0 V)
  • Pin VCC: debe conectarse a VCC (5 V)
  • Pin VRX: proporciona un valor analógico que corresponde a la posición horizontal (llamada coordenada X).
  • Pin VRY: proporciona un valor analógico que corresponde a la posición vertical (llamada coordenada Y).
  • Pin SW: es la salida del pulsador dentro del joystick. Está normalmente abierto. Si usamos una resistencia pull-up en este pin, el pin SW estará en ALTO cuando no esté presionado, y en BAJO cuando esté presionado.
Esquema de pines del joystick

Cómo funciona

  • Cuando empujas la palanca del joystick hacia la izquierda o hacia la derecha, el voltaje en el pin VRX cambia. El rango de voltaje es de 0 a 5 V (0 a la izquierda y 5 V a la derecha). El valor de voltaje es proporcional a la posición de la palanca ⇒ El valor de lectura en el pin analógico del ESP32 es de 0 a 4095
  • Cuando empujas la palanca del joystick hacia arriba o hacia abajo, el voltaje en el pin VRY cambia. El rango de voltaje es de 0 a 5 V (0 arriba y 5 V abajo). El valor de voltaje es proporcional a la posición de la palanca ⇒ El valor de lectura en el pin analógico del ESP32 es de 0 a 4095
  • Cuando empujas la palanca del joystick en cualquier dirección, el voltaje en los pines VRX y VRY cambia en proporción a la proyección de la posición en cada eje
  • Cuando empujas la palanca del joystick de arriba hacia abajo, el pulsador dentro del joystick se cierra. Si usamos una resistencia de pull-up en el pin SW, la salida del pin SW cambiará de 5 V a 0 V ⇒ El valor de lectura en el pin digital del ESP32 cambia de ALTO a BAJO

Diagrama de Cableado

  • Cómo conectar ESP32 y un joystick usando protoboard
Diagrama de cableado del joystick para ESP32

This image is created using Fritzing. Click to enlarge image

Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

Cómo conectar ESP32 y un joystick

Cómo programar para un joystick

El joystick tiene dos partes: analógico (ejes X, Y) y digital (botón pulsador).

  • Para las partes analógicas (ejes X y Y), solo necesitas leer el valor del pin de entrada analógica usando la función analogRead().
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • Para la parte digital (el pulsador): es un botón. La forma más simple y conveniente es usar biblioteca ezButton. Esta biblioteca soporta el rebote para los botones y también habilita una resistencia pull-up interna. Puedes ver más sobre el botón en ESP32 - Tutorial de Botón. El código se presentará en la próxima sesión de este tutorial.

Después de leer los valores de los pines analógicos, es posible que necesitemos convertirlos a valores controlables. La siguiente parte proporcionará los códigos de ejemplo para ello.

Código ESP32

Esta sección proporcionará los siguientes códigos de ejemplo para ESP32:

  • Ejemplo de código: lee valores analógicos del joystick
  • Ejemplo de código: lee valores analógicos y lee el estado del botón del joystick
  • Ejemplo de código: convierte un valor analógico en los comandos MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
  • Ejemplo de código: convierte valores analógicos en ángulos para controlar dos servomotores (por ejemplo, en cámaras pan-tilt)

Lee valores analógicos del joystick

/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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); }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en el IDE de Arduino.
  • Realiza el cableado tal como se muestra en la imagen anterior.
  • Conecta la placa ESP32 a tu PC mediante un cable micro USB.
  • Abre el IDE de Arduino en tu PC.
  • Selecciona la placa ESP32 correcta (p. ej. ESP32 Dev Module) y el puerto COM.
  • Copia el código anterior y ábrelo con el IDE de Arduino.
  • Haz clic en el botón Upload en el IDE de Arduino para subir el código a ESP32.
  • Empuja el pulsador del joystick al máximo hasta el tope y luego hazlo girar en un círculo (en sentido horario o antihorario).
  • Ve el resultado en el Monitor Serial.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Mientras giras la palanca del joystick, mantente atento al Monitor Serie
    • Si el valor de X es 0, marca o memoriza la posición actual como izquierda ⇒ la dirección opuesta hacia la derecha
    • Si el valor de Y es 0, marca o memoriza la posición actual como arriba ⇒ la dirección opuesta hacia abajo

    Puede que hayas notado que la lectura analógica no es proporcional al movimiento del joystick. Este problema no se debe al propio joystick, sino al ADC del ESP32. Al final de este tutorial se explicará por qué ocurre esto.

    Lee valores analógicos y lee el estado del botón de un joystick

    /* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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); }

    Pasos R\u00e1pidos

    • Haz clic en el icono de Bibliotecas en la barra izquierda del IDE de Arduino.
    • Busca “ezButton”, luego encuentra la biblioteca de botones de ArduinoGetStarted.com.
    • Haz clic en el botón Instalar para instalar la biblioteca ezButton.
    Biblioteca de botones para ESP32
    • Copia el código anterior y ábrelo con Arduino IDE
    • Haz clic en el botón Subir en Arduino IDE para cargar el código al ESP32
    • Empuja el pulsador del joystick hacia la izquierda/derecha/arriba/abajo
    • Empuja el pulsador del joystick desde la parte superior
    • Ver el resultado en el Monitor Serial
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Convierte el valor analógico en comandos para MOVER IZQUIERDA/DERECHA/ARRIBA/ABAJO

    /* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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 } }

    Pasos R\u00e1pidos

    • Copia el código anterior y ábrelo con el IDE de Arduino.
    • Haz clic en el botón Subir del IDE de Arduino para cargar el código en el ESP32.
    • Empuja el joystick hacia la izquierda/derecha/arriba/abajo o en cualquier dirección.
    • Ver el resultado en el Monitor serie.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Nota:

    En un momento dado, puede no haber ningún comando, un comando o dos comandos (p. ej. ARRIBA y IZQUIERDA al mismo tiempo).

    Convierte valores analógicos en ángulos para controlar dos servomotores

    El detalle se presenta en el tutorial ESP32 - Controles de joystick para motor servo.

    ※ Nota:

    Este tutorial usa la función analogRead() para leer valores de un ADC (Convertidor analógico-digital) conectado a un joystick. El ADC del ESP32 es bueno para proyectos que NO requieren alta precisión. Sin embargo, para proyectos que necesitan mediciones precisas, tenga en cuenta:

    • El ADC del ESP32 no es perfectamente preciso y podría necesitar calibración para obtener resultados correctos. Cada placa ESP32 puede ser un poco diferente, así que necesita calibrar el ADC para cada placa individual.
    • La calibración puede ser difícil, especialmente para principiantes, y puede que no siempre dé los resultados exactos que desea.

    Para proyectos que requieren alta precisión, considere usar un ADC externo (p. ej. ADS1115) con el ESP32 o usar un Arduino, que tiene un ADC más fiable. Si aún desea calibrar el ADC del ESP32, consulte ESP32 ADC Calibration Driver

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Referencias de funciones

Tutoriales Relacionados

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!