Joystick con Arduino: conexión y lectura

En este post te voy a mostrar cómo usar un joystick en Arduino para leer la dirección del joystick así como para saber si el botón que tiene es presionado o no.

Leeremos los dos ejes, calibraremos la posición del Arduino y sabremos hacia cuál lado está inclinado.

¿Cómo obtener los valores del joystick?

El joystick o palanca tiene dos ejes, el eje x y el eje y. Para saber la dirección de cada uno leemos su valor analógico con digitalRead.

Cuando el joystick está en su estado normal, el valor está en aproximadamente 500, en cambio, cuando está en su punto límite está en 0 o 1023.

En resumen, 0 es que está en el límite inferior (por ejemplo izquierda), 500 es que está sin moverse y 1023 es que está en el límite superior (por ejemplo, la derecha).

El botón

Por otro lado el botón es una lectura digital, ya que es un 0 o un 1. En mi caso, cuando el botón está presionado se lee un 0, es decir, está negado.

Circuito

Ahora que hemos visto cómo funciona de manera general vamos a conectar. Necesitamos conectar los ejes a una entrada analógica, normalmente vienen prefijados con la A, por ejemplo, A0.

Después, el botón es conectado a una entrada digital. No recomiendo el 0 ni el 1 pues ahí se usa para RX y TX, así que podemos usar el 2.

Un modelo del circuito para usar el Arduino con el joystick es:

Joystick Con Arduino

Lectura de valores – Código

Veamos nuestro primer acercamiento. Conectamos y colocamos el siguiente código:

/*

    Programado por Luis Cabrera Benito 
  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
    
    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
*/
#define EJE_X 0
#define EJE_Y 1
#define BOTON 2

void setup() {
  Serial.begin(9600);
  // Será de tipo entrada
  pinMode(BOTON, INPUT_PULLUP);
}

void loop() {
  int valorX = analogRead(EJE_X),
      valorY = analogRead(EJE_Y),
      botonPulsado = digitalRead(BOTON);
  Serial.print("\nValor X: ");
  Serial.print(valorX);
  Serial.print("\nValor Y: ");
  Serial.print(valorY);
  Serial.print("\nBotón pulsado: ");
  Serial.print(botonPulsado);
  delay(100);
}

Simplemente estamos depurando los valores. Abre el monitor serial y cuando todo esté normal podría mostrarse algo así:

Leyendo valores de joystick

Como lo dije, los valores normales están cerca de 500. Pero cuando uno de ellos se mueve, o se presiona el botón, la lectura cambia:

Moviendo ejes de Joystick y leyendo con Arduino

Izquierda, derecha, arriba y abajo

Ahora podemos establecer umbrales y calibrar el joystick como deseemos. Podemos hacer unas simples comparaciones para saber si es izquierda, derecha, arriba o abajo.

También podemos saber si el botón está pulsado. El código queda así:

/*

    Programado por Luis Cabrera Benito
  ____          _____               _ _           _
  |  _ \        |  __ \             (_) |         | |
  | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___
  |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
  | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
  |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |
        |___/                               |___/


    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
*/
#define EJE_X 0
#define EJE_Y 1
#define BOTON 2

void setup() {
  Serial.begin(9600);
  // Será de tipo entrada
  pinMode(BOTON, INPUT_PULLUP);
}

void loop() {
  int valorX = analogRead(EJE_X),
      valorY = analogRead(EJE_Y),
      botonPulsado = digitalRead(BOTON);
  if (!botonPulsado) {
    Serial.println("Botón pulsado");
  }
  if (valorX > 1000) {
    Serial.println("Abajo");
  } else if (valorX < 200) {
    Serial.println("Arriba");
  }

  if (valorY > 1000) {
    Serial.println("Izquierda");
  } else if (valorY < 200) {
    Serial.println("Derecha");
  }
  delay(100);
}

Como ves, son simples comparaciones. En este caso si el valor es mayor que 1000 suponemos que está en determinada dirección (tenemos el umbral de 1000 a 1023) y si es menor que 200 lo mismo.

La salida es:

21:40:00.285 -> Arriba
21:40:00.388 -> Arriba
21:40:00.490 -> Arriba
21:40:00.593 -> Arriba
21:40:01.205 -> Abajo
21:40:01.308 -> Abajo
21:40:01.411 -> Abajo
21:40:01.514 -> Abajo
21:40:01.990 -> Derecha
21:40:02.093 -> Derecha
21:40:02.708 -> Izquierda
21:40:03.602 -> Botón pulsado
21:40:03.704 -> Botón pulsado
21:40:03.738 -> Abajo
21:40:03.807 -> Abajo

Aclaración sobre la calibración

En el código expuesto con anterioridad podrás ver que estoy utilizando el eje X para saber si es arriba o abajo, cuando sabemos que según el plano cartesiano, el eje X debería medir izquierda y derecha.

Pues bien, todo esto depende de cómo estará ubicado tu joystick y cómo se le será presentado al usuario.

Te invito a leer más sobre Arduino en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *