Saltar al contenido

Conectar y Programar un Joystick con Arduino - Entradas Analógicas

¡Bienvenido al noveno capítulo de este curso básico de Arduino! En el tutorial de hoy te voy a explicar cómo funciona y cómo conectar y programar un joystick analógico con Arduino. De esta forma podrás integrarlo en tus proyectos DIY. Para ello, también vamos a ver como utilizar las entradas analógicas.

Entradas analógicas y ADC

Hasta este momento, hemos estado trabajando únicamente con pines digitales, que solo devuelven un 0 para 0 Voltios y un 1 para 5 Voltios. ¿Qué ocurre si necesitas leer valores intermedios de voltaje, como por ejemplo 1.7 Voltios? Pues que para ello se utilizan las entradas analógicas. 

Para poder leer valores intermedios de voltaje entre 0 y 5 Voltios (o 3.3 dependiendo del modelo de la placa de Arduino) las entradas analógicas utilizan un componente electrónico conocido como ADC. 

Gracias al ADC puedes transformar estos valores intermedios de voltaje en un número entero. ¿Qué número entero? Esto depende del tamaño del ADC. Los hay de 8 bits, de 10, de 12, etc. Las placas Arduino Uno y Mega tienen un ADC de 10 bits. Si haces la cuenta de dos elevado a diez obtienes 1024, así que el mayor número que podemos obtener con 10 bits es 1023.

Por lo tanto, cuando en la entrada analógica tengas 0 Voltios leerás un 0 y cuando tengas 5 Voltios leerás 1023. Y si por ejemplo recibes el número 246, ¿a qué voltaje corresponde? Para saberlo simplemente tienes que hacer una cuenta de tres. Multiplica el número obtenido por 5 y divídelo por 1023. En este ejemplo serían aproximadamente 1.2 Voltios. 

Entradas analógicas y ADC

Cómo funciona un módulo Joystick Analógico

Seguramente hayas visto este componente miles de veces en la Play Station, Xbox o cualquier otra consola. Ahora te voy a explicar cómo funciona y después cómo conectarlo y programarlo fácilmente. 

Lo primero que tienes que saber es que el joystick tiene dos salidas analógicas. Una para el eje X que se llama «VRx» y otra para el eje Y que se llama «VRy». Estas salidas analógicas devuelven, cada una, un valor de voltaje que depende de la posición en la que se encuentra el joystick.

Por ejemplo en mi caso, como puedes ver en la imagen de abajo, cuando mi joystick está totalmente a la izquierda, la salida analógica VRx me devuelve un 0 y cuando está totalmente a la derecha 1023. Digo en mi caso porque hay joysticks que lo hacen justo al contrario. En la izquierda devuelven 1023 y en la derecha 0. Cuando se encuentra en una posición intermedia devuelve el número correspondiente a dicha posición, ya sea 512, 128, etc. 

Además, el joystick también funciona como un simple botón cuando lo presionas hacia abajo, devolviendo un 0 cuando no está pulsado y un 1 cuando si que lo está.

Cómo funciona un módulo joystick

Conexión de un Joystick con Arduino

El esquema eléctrico es muy sencillo. El joystick tiene 5 pines y todos se conectan directamente con la placa de Arduino. El primero, que se llama GND, como su propio nombre indica, hay que conectarlo a tierra. El segundo pin que se llama +5V hay que conectarlo a los 5 Voltios de Arduino.

Después están las salidas analógicas, VRx y VRy. Éstas hay que conectarlas a dos entradas analógicas de Arduino. En mi caso estoy utilizando A0 y A1. Por último, el pin que se llama «SW» lo tienes que conectar a cualquier pin digital. Éste es el pin que devuelve un 0 o un 1 cuando pulsas o no el joystick. 

Además del joystick, he conectado 4 leds que utilizaré en el apartado de la programación de este módulo.

Conectar Joystick con Arduino

Programación de un Joystick con Arduino

El objetivo del código que hay más abajo y que ahora te voy a explicar es encender los 4 leds dependiendo de los valores que reciba del joystick.

Lo primero que hago es declarar dos variables. Éstas guardan los números de las entradas analógicas a las que tengo conectados VRx y VRy. Después creo las variables de los 4 leds. Como puedes ver por los nombres, dos serán controlados dependiendo de VRx y los otros dos de VRy.

En la función «void setup()» simplemente inicializo los pines digitales de los leds y el puerto serie. Las entradas analógicas, como a diferencia de los pines digitales no pueden funcionar como salidas, no hace falta inicializarlas.

Leer una entrada analógica es muy sencillo. Simplemente tienes que utilizar la función «analogread()». Dentro de los paréntesis tienes que indicar el número de la entrada analógica que quieres leer. En este caso utilizo esta función para leer tanto VRx como VRy, y guardo el valor leído en una variable de tipo entero. 

Con la sentencia condicional if compruebo si el valor leído es mayor o menor que cierto umbral, y dependiendo de esto enciendo unos leds u otros. Además, muestro en el monitor serie el valor leído del joystick, tanto para VRx como para VRy. Para ello utilizo el puerto serie

//Pines analógicos
const int VRy = 0;  //A0
const int VRx = 1;  //A1
//Pines digitales
const int ledVRy1 = 9;
const int ledVRy2 = 10;
const int ledVRx1 = 11;
const int ledVRx2 = 12;

int lectura = 0;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(ledVRx1, OUTPUT);
  pinMode(ledVRx2, OUTPUT);
  pinMode(ledVRy1, OUTPUT);
  pinMode(ledVRy2, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  lectura = analogRead(VRx);
  if(lectura<350){
    digitalWrite(ledVRx1, HIGH);
    digitalWrite(ledVRx2, LOW);
  }
  else if(lectura>700){
    digitalWrite(ledVRx1, LOW);
    digitalWrite(ledVRx2, HIGH);
  }
  else{
    digitalWrite(ledVRx1, LOW);
    digitalWrite(ledVRx2, LOW);
  }
  Serial.print("Lectura Eje X: ");
  Serial.println(lectura);
  delay(100);

  lectura = analogRead(VRy);
  if(lectura<350){
    digitalWrite(ledVRy1, HIGH);
    digitalWrite(ledVRy2, LOW);
  }
  else if(lectura>700){
    digitalWrite(ledVRy1, LOW);
    digitalWrite(ledVRy2, HIGH);
  }
  else{
    digitalWrite(ledVRy1, LOW);
    digitalWrite(ledVRy2, LOW);
  }
  Serial.print("Lectura Eje Y: ");
  Serial.println(lectura);
  delay(500);
}