Arduino - Joystick

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

Diagrama de pines del joystick

Hardware Requerido

1×Arduino Uno R3
1×Cable USB 2.0 tipo A/B (para PC USB-A)
1×Cable USB 2.0 tipo C/B (para PC USB-C)
1×Joystick
1×Cables Puente
1×(Recomendado) Shield de Bloque de Terminales de Tornillo para Arduino Uno
1×(Recomendado) Shield de Protoboard para Arduino Uno
1×(Recomendado) Carcasa para Arduino Uno
1×(Recomendado) Placa Base de Prototipado y Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino 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 del joystick

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

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

  • Un valor analógico (de 0 a 1023) correspondiente a la posición horizontal (denominada coordenada X)
  • Un valor analógico (de 0 a 1023) correspondiente a la posición vertical (denominada coordenada Y)
  • Un valor digital de un pulsador (HIGH o LOW)

La combinación de dos valores analógicos puede crear coordenadas 2-D con los valores centrales cuando el joystick está en la posición de reposo. La dirección real de las coordenadas se puede identificar fácilmente 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 correspondiente a la posición horizontal (llamada coordenada X).
  • Pin VRY: proporciona un valor analógico correspondiente a la posición vertical (llamada coordenada Y).
  • Pin SW: es la salida del pulsador dentro del joystick. Por defecto está abierto. Si usamos una resistencia pull-up en este pin, el pin SW estará en HIGH cuando no esté presionado y en LOW cuando esté presionado.
Disposición de pines del joystick

Cómo funciona

  • Cuando empujas el pulsador del joystick hacia la izquierda/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 del pulsador, por lo que el valor de lectura en el pin analógico del Arduino va de 0 a 1023
  • Cuando empujas el pulsador del joystick hacia arriba/abajo, el voltaje en el pin VRY cambia. El rango de voltaje va de 0 a 5 V (0 arriba y 5 V abajo). El valor de voltaje es proporcional a la posición del pulsador, por lo que el valor de lectura en el pin analógico del Arduino va de 0 a 1023
  • Cuando empujas el pulsador 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 el pulsador del joystick de arriba hacia abajo, se cierra el pulsador interno del joystick. Si usamos una resistencia pull-up en el pin SW, la salida del pin SW cambiará de 5 V a 0 V, por lo que la lectura en el pin digital del Arduino cambia de HIGH a LOW

Diagrama de Cableado

Diagrama de cableado del joystick de Arduino

This image is created using Fritzing. Click to enlarge image

Cómo programar para un joystick

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

  • Para las partes analógicas (ejes X, Y), solo necesitas leer el valor del pin de entrada analógica usando la función analogRead().
int xValue = analogRead(A1); int yValue = analogRead(A0);
  • Para la parte digital (pulsador): es un botón. La forma más simple y conveniente es usar ezButton library. Esta biblioteca admite anti-rebote para botones y también habilita una resistencia interna de pull-up. Puedes ver más sobre el botón en Arduino - Button tutorial. 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 controlables. La siguiente parte proporcionará los códigos de ejemplo para ello.

Código de Arduino

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

  • 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 desde el joystick
  • Ejemplo de código: convierte el valor analógico en 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 una cámara pan-tilt)

Lee valores analógicos del joystick

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(xValue); Serial.print(", y = "); Serial.println(yValue); delay(200); }

Pasos R\u00e1pidos

  • Copia el código anterior y ábrelo con Arduino IDE
  • Haz clic en el botón Subir en el IDE de Arduino para subir el código al Arduino
  • Empuja el pulsador del joystick al máximo hasta el tope y luego gíralo en un círculo (sentido horario o antihorario)
  • Mira 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 Serie
    • Si el valor X es 0, marca o memoriza la posición actual como izquierda ⇒ la dirección opuesta es la derecha
    • Si el valor Y es 0, marca o memoriza la posición actual como arriba ⇒ la dirección opuesta es abajo

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

    /* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-joystick */ #include <ezButton.h> #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define SW_PIN 2 // Arduino pin connected to SW pin ezButton button(SW_PIN); int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis int bValue = 0; // To store value of the button void setup() { Serial.begin(9600) ; button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = 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(xValue); Serial.print(", y = "); Serial.print(yValue); Serial.print(" : button = "); Serial.println(bValue); }

    Pasos R\u00e1pidos

    • Navega al ícono de Bibliotecas en la barra izquierda del IDE de Arduino.
    • Busca “ezButton”, luego encuentra la librería de botones de ArduinoGetStarted.com
    • Haz clic en el botón Instalar para instalar la librería ezButton.
    Librería de botones de Arduino
    • Copia el código anterior y ábrelo con el IDE de Arduino
    • Haz clic en el botón Subir del IDE de Arduino para subir el código al Arduino
    • Empuja el pulgar del joystick hacia la izquierda/derecha/arriba/abajo
    • Empuja el pulgar del joystick desde la parte superior
    • Ve el resultado en el Monitor Serial.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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

    /* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define LEFT_THRESHOLD 400 #define RIGHT_THRESHOLD 800 #define UP_THRESHOLD 400 #define DOWN_THRESHOLD 800 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int xValue = 0 ; // To store value of the X axis int yValue = 0 ; // To store value of the Y axis int command = COMMAND_NO; void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (xValue < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (xValue > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (yValue < UP_THRESHOLD) command = command | COMMAND_UP; else if (yValue > 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 Arduino
    • Empuja el joystick hacia la izquierda/derecha/arriba/abajo o en cualquier dirección
    • Mira 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 Arduino - Controles del Joystick para el Servomotor

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!