Joystick analógico con Arduino

Joystick analógico.

Un joystick analógico es un dispositivo de entrada que se utiliza comúnmente en aplicaciones de control. Permiten conocer el movimiento de la palanca mediante una señal analógica proveniente de dos potenciómetros orientados perpendicularmente. Además, este módulo, que es común encontrarlo en los kits de desarrollo de Arduino, tiene incluido un botón o pulsador que se acciona al presionar la palanca.

En el presente artículo, te guiaré en el uso de un joystick potenciómetro de 2 ejes junto con Arduino. Después de comprender el principio de funcionamiento, desarrollaremos un proyecto sencillo de Arduino y joystick

¿Cómo funciona el joystick KY-023?

La placa del joystick KY-023 cuenta con cinco pines.

  • El pin GND es la entrada de alimentación negativa de la placa. Debe estar conectado a GND.

  • El pin +5V es la entrada de alimentación positiva de la placa. Debe estar conectado a +5V.

  • El pin VRX es la salida analógica del eje X y varía entre 0 y 5 V según la posición del eje de la palanca.

  • El pin VRY es la salida analógica del eje Y y, al igual que en el caso del eje x, varía entre 0 y 5 V según la posición del eje de la palanca.

  • El pin SW es la salida digital del botón del joystick. Cuando está presionado, su nivel es bajo.

Pines de conexión del joystick analógico.

O sea, cuando mueves el joystick hacia la izquierda o hacia la derecha, el voltaje en el pin VRX varía dentro de un rango de 0 a 5 voltios (0 representando la posición completamente a la izquierda y 5 voltios representando la posición completamente a la derecha). Este voltaje es proporcional a la posición del joystick. Por lo tanto, el valor de lectura en el pin analógico de Arduino oscila entre 0 y 1023, reflejando la posición del joystick en ese eje específico. Lo mismo sucede en el caso del movimiento en el eje y. En el caso del pulsador, que es activo en cero, se debe destacar que para su utilización con Arduino se debe colocar una resistencia de pull-up a la entrada del pin digital que se utilice. Una forma sencilla de hacerlo es habilitar las resistencias de pull-up internas de los pines de Arduino. Para hacerlo, en la configuración del pin de entrada debemos poner INPUT_PULLUP en lugar del típico INPUT.

Advertencia

Nunca olvides conectar una resistencia de pull-up al botón del joystick ya sea conectándola tú mismo o habilitando las resistencias internas de pull-up de Arduino por software.

Ejemplo de lectura de joystick con Arduino

Una vez que hemos visto los componentes principales de esta interfaz, podemos conectarlo al Arduino como se muestra en la siguiente imagen.

Cableado para utilizar el joystick analógico.

Como vemos no se ha conectado ninguna resistencia de pull-up en el pin del botón. Por tanto debemos habilitar las resistencias internas de Arduino utilizando la configuración de pin digital INPUT_PULLUP. En el siguiente código se puede observar cómo hacemos esta configuración. Lo que se hace en este pequeño programa es leer los valores de las entradas analógicas A0 y A1 y se imprimen en el monitor serie del IDE de Arduino. Además se imprime si el botón se encuentra presionado o suelto.

 1// Ejemplo de Arduino para utilizar el joystick 
 2// Más información: https://www.3dpellet.com
 3
 4// definimos las entradas analógicas y
 5// la entrada digital para el botón
 6#define xAxis A0
 7#define yAxis A1
 8#define Button 3
 9
10void setup() {
11  Serial.begin(9600);
12  // El botón será una entrada con la
13  // resistencia pull-up activada
14  pinMode(Button, INPUT_PULLUP);
15}
16
17void loop() {
18  // Se leen los pines analógicos
19  int xReading = analogRead(xAxis);
20  int yReading = analogRead(yAxis);
21
22  // Los valores leídos se imprimen
23  Serial.print("\nValor X: ");
24  Serial.print(xReading);
25  Serial.print("\nValor Y: ");
26  Serial.print(yReading);
27  
28  // Se imprime el estado del botón
29  if (digitalRead(Button) == HIGH) {
30    Serial.print("\nBotón suelto");
31  }
32  else{
33    Serial.print("\nBotón presionado");
34  }
35
36  delay(100);
37}

Control de motor paso a paso con A4988 y joystick

Controlar un motor paso a paso con el controlador A4988 y Arduino es muy sencillo y sólo se requieren dos pines digitales de Arduino para esta tarea. Si además quisiéramos controlar el motor manualmente utilizando uno de los ejes de nuestro joystick, podemos utilizar el siguiente modelo de circuito.

Cableado mínimo para utilizar el controlador A4988 en protoboard, accionado con joystick y Arduino.

Como vemos, la conexión sigue siendo muy sencilla y al no necesitar el pulsador no debemos configurar la resistencia de pull-up. El punto más complejo en este ejemplo es la configuración del A4988 para limitar la corriente máxima del motor y así evitar que este se dañe. Además de esto, lo único nuevo aquí es la alimentación del joystick y la utilización del pin A0 para leer los valores de tensión en el potenciómetro del joystick. En el siguiente código se muestra como manejar este sistema con Arduino.

Advertencia

Si no sabe configurar el A4988 para controlar un motor paso a paso, le sugiero que vea cómo hacerlo antes de probar este ejemplo. No limitar la corriente que pasa por las bobinas del motor puede provocar que este se dañe permanentemente.

 1// Ejemplo de Arduino para utilizar el joystick 
 2// Más información: https://www.3dpellet.com
 3
 4// definimos las entrada analógica,
 5// pin 4 para la dirección y pin 5 para el paso:
 6#define xAxis A0
 7#define dirPin 4
 8#define stepPin 5
 9// Con estas variables podemos configurar la velocidad del motor
10#define tA 4 //4 us
11#define tB 5 //5 ms
12
13void setup() {
14  // Declaramos los pines como salidas:
15  pinMode(stepPin, OUTPUT);
16  pinMode(dirPin, OUTPUT);
17}
18
19void loop() {
20  // Se lee el pin analógico
21  int xReading = analogRead(xAxis);
22
23  if (xReading > 1000) {
24    // Ponemos en un nivel alto la entrada de dirección
25    // de rotación para rotar el motor en sentido horario:
26    digitalWrite(dirPin, HIGH);
27    // Damos un paso con el motor
28    stepForward();
29  } else if (xReading < 200) {
30    // Rotamos el motor una vuelta completa en sentido anti-horario
31    digitalWrite(dirPin, LOW);
32    // Damos un paso con el motor
33    stepForward();
34  }
35}
36
37void stepForward() {
38    // Ponemos en nivel alto el pin de paso durante
39    // un tiempo aproximado tA
40    digitalWrite(stepPin, HIGH);
41    delayMicroseconds(tA);
42    // Ponemos en nivel bajo el pin de paso durante
43    // un tiempo aproximado tB
44    digitalWrite(stepPin, LOW);
45    delay(tB);
46}

Si te ha gustado nuestro contenido ayúdanos suscribiéndote o dejando tu like en nuestro canal de YouTube.

Play Video: Keynote (Google I/O '18)