Skip to Content

Tutoriales sobre la interfaz de Arduino y Joystick

Tutoriales sobre la interfaz de Arduino y Joystick

En este artículo, aprenderás a utilizar un joystick potenciómetro de 2 ejes con Arduino.

El joystick es un componente de entrada muy crítico en los pads de control HMI.

El joystick te proporciona un control muy preciso de la navegación. Puede ser un juego o el control de un menú.

Los joysticks encuentran sus aplicaciones en el control de brazos robóticos, sillas de ruedas, cortadoras de césped, control remoto de coches, control de grúas y muchos más.

Te llevaré a través de los bloques de construcción básicos de un joystick.

Una vez que entendamos el principio de funcionamiento, construiremos un sencillo proyecto de Arduino y joystick en el que podrás controlar el ratón en la pantalla del ordenador.

Comencemos.

Componentes necesarios para construir el proyecto Arduino y Arduino Joystick

Componentes de hardware 

Software

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

¿Cómo funciona un joystick?

El joystick consta de dos potenciómetros. Un potenciómetro para el movimiento del eje X y el otro para el movimiento del eje Y.

Cómo funciona un joystick

Los potenciómetros siempre descansan en la posición central. Si el potenciómetro se alimenta con 5 V, el valor analógico medido en el centro del potenciómetro será de 2,5 V. 

En la siguiente imagen, puedes ver las partes internas del joystick.

Necesitas dos pines de entrada analógica en el Arduino UNO para leer los datos del joystick. He creado gráficos sencillos que muestran los valores analógicos esperados que se leen de los dos potenciómetros. 

Ambos potenciómetros están en la posición central automáticamente. Esto significa que el valor leído será la mitad de la resolución máxima del ADC. 

Por ejemplo, si el bit del ADC es de 10 bits, entonces el valor por defecto leído por las entradas analógicas será de 512.

Los recuentos del ADC serán 512 para el potenciómetro en posición de reposo.

Recuentos de ADC

En la imagen de arriba, puedes ver los recuentos de ADC que puedes esperar en diferentes posiciones del eje. 

Cuando mueves el eje hacia delante, el potenciómetro del eje X se queda parado, pero el potenciómetro del eje Y se mueve completamente hacia delante.

Por lo tanto, los recuentos del ADC para el eje X y el eje Y son 512 y 1024, respectivamente. 

Los joysticks también tienen un interruptor momentáneo que puedes utilizar para aplicaciones específicas.

Por lo tanto, un solo joystick es a veces todo lo que necesitas para completar varias tareas.

La imagen anterior muestra una representación eléctrica de un joystick de dos ejes. También se puede ver la opción del interruptor. 

Observe que hay un potenciómetro de diez kOhms dentro del joystick. No todos los joysticks tendrán diez kOhms.

No importa, ya que lo que leemos como tensión analógica es sólo la diferencia relativa de la tensión. 

Veamos los pinouts de un joystick comúnmente disponible.

pinouts de un joystick comúnmente disponible
Sl. NoEtiqueta de la clavijaPin Función
1GNDConexión a tierra
25VPin de alimentación para el joystick. Los 5 V proporcionan la tensión de polarización para los potenciómetros
3VRxSalida de tensión analógica para el potenciómetro del eje X
4VRySalida de tensión analógica para el potenciómetro del eje Y
5SWSalida del interruptor. El pin se pone a nivel bajo cuando se pulsa el interruptor

Necesitas dos pines de entrada analógica y un pin de entrada digital en el Arduino para completar la conexión. 

Puedes utilizar cualquiera de las dos entradas analógicas del Arduino UNO.

dos entradas analógicas en el Arduino UNO

Arduino UNO tiene seis pines de entrada analógica etiquetados como A0, A1, A2, A3, A4 y A5. 

Nota: Aunque dije que el ADC leería 512 cuentas cuando el potenciómetro está en reposo, no será precisamente la mitad. Puedes ver un desfase de 5 o 10 cuentas. Por lo tanto, usted puede calibrar las tres posiciones: extrema izquierda, extrema derecha, y al ralentí. 

Mientras calibra el joystick, tome suficientes lecturas y promedie para encontrar el desplazamiento.

Recomiendo tomar al menos 100 recuentos. Esto ayuda a eliminar el ruido y a elegir un mejor valor de corrección de desplazamiento.

Veamos la calibración del potenciómetro del eje X. 

  1. Mantenga el joystick en reposo (posición central)
  2. Lee el valor analógico del ADC.
  3. Asegúrese de que la lectura está entre 500 y 520. Esto es para asegurar que la posición del eje está en la posición/estado esperado
  4. Sigue añadiendo las lecturas a una variable.
  5. Repita los pasos del 2 al 4 durante 100 veces
  6. Calcular la media (suma total / 100)
  7. Guarda el nuevo valor "mid". 

Del mismo modo, puede calibrar el potenciómetro del eje X para las posiciones finales. Siga los mismos pasos para el potenciómetro del eje Y también.

Instrucciones paso a paso para conectar un joystick de 2 ejes a Arduino

En esta sección, repasaremos las conexiones necesarias entre el Arduino UNO y el módulo Joystick.

Empecemos.

Cómo conectar el módulo de joystick con Arduino UNO

Las conexiones son sencillas y llevan menos tiempo. 

Paso 1: Empezar con el módulo Arduino Joystick

Comienza con el módulo Arduino Joystick

Puedes ver que hay cinco pines en el lado izquierdo del módulo: GND, SEL, HOR, VER y VCC.

Paso 2: Realizar la conexión a tierra

Realice la conexión a tierra

Conecta uno de los pines GND del Arduino al pin etiquetado "GND" del módulo del joystick.

Siempre insisto en comenzar las conexiones conectando primero las conexiones GND.

Paso 3: Conectar la clavija SEL del joystick analógico

Conecta la clavija SEL del joystick analógico

El pin SEL puede ser etiquetado como SW también. Este es el interruptor momentáneo presente en el módulo.

Recuerda habilitar el pullup interno en este pin. Conecta el pin SEL al pin 6 del Arduino UNO. 

Paso 4: Conectar la clavija analógica A1

Conectar la clavija analógica A1

Conecta el pin de entrada analógica A1 del Arduino UNO al pin etiquetado "HOR" del módulo. La etiqueta HOR también se conoce como eje X / VRx, etc. 

Paso 5: Conectar la clavija analógica A0

Conectar el pin analógico A0

Conecta el pin A0 de entrada analógica del Arduino UNO al pin etiquetado "VER" del módulo. La etiqueta HOR también se conoce como eje Y / VRy etc. 

Paso 6: Conectar las clavijas de alimentación

Conectar las clavijas de alimentación

Conecta el pin del sensor etiquetado como VCC al pin de 5 V del Arduino. 

Felicidades. Ya has completado las conexiones de hardware. En la siguiente sección, verás un código de ejemplo.

Código sencillo de Arduino para controlar el cursor del ratón del PC mediante un joystick

Este sketch de Arduino controlará el cursor del ratón en la pantalla. Este proyecto es muy emocionante para mí, y creo que usted también lo disfrutará.

#include "Mouse.h"
 
// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 2;      // switch to turn on and off mouse control
const int mouseButton = 3;    // input pin for the mouse pushButton
const int xAxis = A0;         // joystick X axis
const int yAxis = A1;         // joystick Y axis
const int ledPin = 5;         // Mouse control LED
 
// parameters for reading the joystick:
int range = 12;               // output range of X or Y movement
int responseDelay = 5;        // response delay of the mouse, in ms
int threshold = range / 4;    // resting threshold
int center = range / 2;       // resting position value
 
bool mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state
 
void setup() {
  pinMode(switchPin, INPUT);       // the switch pin
  pinMode(ledPin, OUTPUT);         // the LED pin
  // take control of the mouse:
  Mouse.begin();
}
 
void loop() {
  // read the switch:
  int switchState = digitalRead(switchPin);
  // if it's changed and it's high, toggle the mouse state:
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      // turn on LED to indicate mouse state:
      digitalWrite(ledPin, mouseIsActive);
    }
  }
  // save switch state for next comparison:
  lastSwitchState = switchState;
 
  // read and scale the two axes:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);
 
  // if the mouse control state is active, move the mouse:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }
 
  // read the mouse button and click or not click:
  // if the mouse button is pressed:
  if (digitalRead(mouseButton) == HIGH) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  }
  // else the mouse button is not pressed:
  else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }
 
  delay(responseDelay);
}
 
/*
  reads an axis (0 or 1 for x or y) and scales the analog input range to a range
  from 0 to <range>
*/
 
int readAxis(int thisAxis) {
  // read the analog input:
  int reading = analogRead(thisAxis);
 
  // map the reading from the analog input range to the output range:
  reading = map(reading, 0, 1023, 0, range);
 
  // if the output reading is outside from the rest position threshold, use it:
  int distance = reading - center;
 
  if (abs(distance) < threshold) {
    distance = 0;
  }
 
  // return the distance for this axis:
  return distance;
}

Preguntas frecuentes sobre el joystick y los proyectos Arduino

He respondido a las preguntas más frecuentes sobre el Joystick y los proyectos Arduino.

Puede encontrar la mayoría de las respuestas aquí.

Si tiene alguna otra pregunta, no dude en publicarla en la sección de comentarios. 

1) ¿Cómo funciona un Joystick?

El bloque básico de un joystick incluye potenciómetros con un muelle. Los muelles tiran de los potenciómetros hasta la posición por defecto cuando el usuario no los acciona. 

Cuando utilizas el joystick, giras el potenciómetro. El joystick estándar que se encuentra en los controladores HMI, los controladores de juegos de mano, etc., tendrá dos potenciómetros para cada eje. 

El Arduino monitoriza los valores analógicos de ambos potenciómetros. Los dos valores analógicos se traducen en la posición correcta.

2) ¿Cómo se reduce el jitter en la lectura del joystick?

El joystick le dará dos lecturas analógicas. Puedes utilizar el ADC incorporado para leer los valores analógicos. Para reducir la fluctuación en las lecturas, siga las siguientes sugerencias.

  • Fuente de alimentación estable: Asegúrese de que la alimentación de 5 V es estable. Proporcione suficientes condensadores entre 5 V y tierra. Además, añada condensadores de pequeño valor (100pF, por ejemplo) entre la tierra y la patilla del potenciómetro. Esto filtra el jitter en la línea de forma significativa
  • Referencia de tensión analógica estable: El ADC compara esencialmente la tensión analógica de entrada con la tensión de referencia del ADC. Por defecto, Arduino utiliza el propio pin de alimentación de 5 V como referencia de tensión analógica. 

Cuando se acciona un motor, se conmuta una carga de alta corriente, una tira de LED, por ejemplo, los 5 V no serán estables. La inestabilidad de 5 V (también la referencia del ADC) crea un jitter en la lectura analógica.

La idea es utilizar una tensión de referencia estable y dedicada para el pin de entrada VREF del ADC. Puedes encontrar circuitos integrados de referencia de voltaje (TL431, por ejemplo) construidos para este propósito. Consulta el enlace para saber más sobre la elección de la referencia del ADC. 

  • Joystick de mala calidad: También es posible que el joystick esté dañado o que el montaje tenga un problema. Las pequeñas vibraciones pueden crear una fluctuación mecánica, que se traduce en una fluctuación en la lectura del ADC.
  • Implementa el promediado del ADC: Como el movimiento del joystick no es una operación de alta velocidad, puedes tomar múltiples muestras y promediarlas.

Estoy seguro de que tus lecturas serán estables si has tomado todas las precauciones anteriores.

3) ¿Puedo controlar el ratón del ordenador con un joystick Arduino?

Sí, puedes controlar el cursor del ratón en la pantalla usando Arduino UNO. Puede utilizar la biblioteca del ratón para controlar el cursor.

Consulte las secciones anteriores para obtener detalles sobre el diagrama de conexión y el código de Arduino.

Conclusión

En este artículo, vimos el principio de funcionamiento del joystick de 2 ejes. Más tarde, repasamos algunos parámetros críticos que debemos tener en cuenta para leer y procesar de forma fiable las salidas analógicas del joystick. 

Espero que hayas podido construir el proyecto y probarlo fácilmente. Si tienes alguna sugerencia para mejorar el artículo, por favor compártela en la sección de comentarios.

Me ayudará a mejorar el artículo para que todos nuestros lectores se beneficien.

Me encantará conocer los proyectos que has construido con un joystick.

Por favor, publique un enlace a sus proyectos en la sección de comentarios.

Si encuentras algún proyecto útil y quieres conocerlo, ¡házmelo saber!

Me encantará escribir una guía detallada sobre ellos.

No olvides compartir el artículo con tus amigos y entusiastas de Arduino.