arduino

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

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.