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:
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í:
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:
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.