Arduino Nano ESP32 - Joystick

En este tutorial, vamos a aprender a usar un joystick con Arduino Nano ESP32. En detalle, aprenderemos:

Pinout del joystick

Hardware Requerido

1×Arduino Nano ESP32
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 Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano ESP32

Or you can buy the following kits:

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 videojuegos, un mando de juguete, o incluso una gran máquina real como un controlador de excavadora.

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

  • Un valor analógico (de 0 a 4095) correspondiente a la posición horizontal (llamada coordenada X)
  • Un valor analógico (de 0 a 4095) correspondiente 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 los valores centrales cuando el joystick está en la posición de reposo. La dirección real de las coordenadas se puede identificar simplemente al ejecutar un código de prueba (en la próxima 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 (3.3V)
  • 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. Normalmente está abierto. Si se utiliza una resistencia de pull-up en este pin, el pin SW estará ALTO cuando no esté presionado y BAJO cuando esté presionado.
Pinout del joystick

Cómo funciona

  • Cuando empujas la palanca del joystick hacia la izquierda/derecha, el voltaje en el pin VRX cambia. El rango de voltaje es de 0 a 3.3V (0 a la izquierda y 3.3V 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/abajo, el voltaje en el pin VRY cambia. El rango de voltaje es de 0 a 3.3V (0 hacia arriba y 3.3V hacia 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 interno del joystick se cierra. Si usamos una resistencia pull-up en el pin SW, la salida del pin SW cambiará de 3.3V a 0V ⇒ La lectura del pin digital del ESP32 cambia de HIGH a LOW

Diagrama de Cableado

Diagrama de cableado del joystick para Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

Cómo programar para joystick

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

  • Para las partes analógicas (ejes X, Y), solo es necesario leer el valor del pin de entrada analógico utilizando la función analogRead().
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • Para la parte digital (botón pulsador): es un botón. La forma más simple y conveniente es usar biblioteca ezButton. Esta biblioteca admite debounce para botones y también habilita una resistencia pull-up interna. Puede ver más sobre el botón en Arduino Nano 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, puede que necesitemos convertirlos a valores que se puedan controlar. La siguiente parte proporcionará los códigos de ejemplo para ello.

Código de Arduino Nano ESP32

Esta sección proporcionará los siguientes códigos de ejemplo de Arduino Nano 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 el 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 (p. ej., en cámara pan-tilt)

Lee los valores analógicos del joystick

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

Pasos R\u00e1pidos

Para empezar con Arduino Nano ESP32, siga estos pasos:

  • Si eres nuevo en Arduino Nano ESP32, consulta el tutorial sobre cómo configurar el entorno para Arduino Nano ESP32 en el IDE de Arduino.
  • Conecta los componentes de acuerdo con el diagrama proporcionado.
  • Conecta la placa Arduino Nano ESP32 a tu computadora usando un cable USB.
  • Inicia el IDE de Arduino en tu computadora.
  • Selecciona la placa Arduino Nano ESP32 y su puerto COM correspondiente.
  • Copia el código de arriba y ábrelo con el IDE de Arduino.
  • Haz clic en el botón Upload del IDE de Arduino para subir el código a la placa Arduino Nano ESP32.
  • Empuja al máximo el pulsador del joystick hasta el límite y luego haz un giro en círculo (en sentido horario o antihorario).
  • Consulta el resultado en el Monitor Serial.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Mientras giras el pulgar del joystick, continúa mirando el Monitor Serial
    • Si el valor de X es 0, marca o memoriza la posición actual como izquierda, que es la dirección opuesta a la derecha
    • Si el valor de Y es 0, marca o memoriza la posición actual como arriba, que es la dirección opuesta a abajo

    Puede que haya notado que el valor analógico no es proporcional al movimiento del joystick. Este problema no se debe al joystick en sí, sino al ADC del Arduino Nano 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 Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.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); }

    Pasos R\u00e1pidos

    • Abre el Administrador de Bibliotecas haciendo clic en el icono en la barra de navegación 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 Arduino Nano ESP32
    • Copia el código anterior y ábrelo con Arduino IDE
    • Haz clic en el botón Subir en Arduino IDE para subir el código al Arduino Nano ESP32
    • Empuja el joystick hacia la izquierda, derecha, arriba o abajo
    • Presiona el pulsador del joystick desde la parte superior
    • Revisa el resultado en el Monitor Serial
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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

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

    Pasos R\u00e1pidos

    • Copie el código anterior y ábralo con el IDE de Arduino
    • Haga clic en el botón Subir en el IDE de Arduino para cargar el código en Arduino Nano ESP32
    • Empuje el joystick analógico hacia la izquierda, derecha, arriba, abajo o en cualquier dirección
    • Verifique el resultado en el Monitor serie
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Nota:

    En un momento puede no haber ninguna orden, una orden o dos órdenes (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 Arduino Nano ESP32 - Controles del joystick para el motor servo

    ※ Nota:

    Este tutorial utiliza la función analogRead() para leer valores de un ADC (convertidor analógico a digital) conectado a un sensor o componente. El ADC del Arduino Nano ESP32 es adecuado para proyectos que no requieren alta precisión. Sin embargo, para proyectos que requieren mediciones precisas, tenga en cuenta lo siguiente:

    • El ADC del Arduino Nano ESP32 no es perfectamente preciso y podría requerir calibración para obtener resultados correctos. Cada placa Arduino Nano ESP32 puede variar ligeramente, por lo que la calibración es necesaria para cada placa individual.
    • La calibración puede ser desafiante, especialmente para principiantes, y puede no siempre producir los resultados exactos que deseas.

    Para proyectos que requieren alta precisión, considera usar un ADC externo (p. ej. ADS1115) con el Arduino Nano ESP32 o usar otro Arduino, como el Arduino Uno R4 WiFi, que tiene un ADC más fiable. Si aún desea calibrar el ADC del Arduino Nano ESP32, consulte el 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

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