fbpixel
Etiquetas: , , ,
5
(1)

El joystick es un sensor de posición que devuelve dos valores analógicos que representan su posición X,Y. Puede utilizarse como interfaz para navegar por un menú o para controlar un objeto en dirección o velocidad. Se encuentra comúnmente en los joysticks de los videojuegos, en los mandos a distancia de las maquetas o incluso en los salpicaderos de las máquinas industriales.

Hardware

  • Computador
  • Arduino UNO
  • Cable USB A macho a B macho
  • Joystick

Principio de funcionamiento

El joystick consta de dos potenciómetros acoplados mecánicamente y colocados para detectar las componentes horizontal y vertical del joystick. Así, los valores de resistencia de los potenciómetros varían de forma independiente en función de la posición del joystick. Suele haber un pulsador que se activa al pulsar el joystick.

Esquema

El joystick devuelve dos valores analógicos que naturalmente conectaremos a las entradas analógicas del microcontrolador. También devuelve un valor digital que conectamos al pin 2 del microcontrolador.

Código

El joystick se utiliza como una combinación de dos potenciómetros y un pulsador. Por lo tanto, definiremos dos entradas analógicas para recuperar los valores de posición y una entrada digital para el botón integrado en el joystick. Prácticamente, los valores analógicos brutos no se utilizarán directamente. Serán utilizados para manejar variables con sus propios rangos de definición (valores extremos, precisión, tipo, etc.). Dicho esto, puede ser interesante definir una función que convierta el valor bruto en un valor utilizable. En nuestro ejemplo, elegimos un rango de valores de -100 a 100, que puede ser interpretado como la velocidad de un motor con un valor negativo que representa una dirección de rotación opuesta y 100 que representa la velocidad máxima.

//Constants
#define NUM_JOY 2
#define MIN_VAL 0
#define MAX_VAL 1023

//Parameters
const int joyPin [2] = {A0, A1};
const int joyBtn   = 2;
const int joyOffset   = 0;

//Variables
int joyVal [NUM_JOY] = {0, 0};


void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init Joystick
  for (int i = 0; i < NUM_JOY; i++) pinMode(joyPin[i], INPUT);
  pinMode(joyBtn,INPUT_PULLUP);
}

void loop() {
  readJoystick();
  delay(500);
}

void readJoystick( ) { /* function readJoystick */
  ////Test routine for Joystick
  for (int i = 0; i < NUM_JOY; i++) {
    joyVal[i] = analogRead(joyPin[i]);
    Serial.print(F("joy")); Serial.print(i); Serial.print(F(" : ")); Serial.println(joyVal[i]);
  }
  for (int i = 0; i < NUM_JOY; i++) {
    Serial.print(F("Conv")), Serial.print(i); Serial.print(F(" : ")); Serial.println(joyRawToPhys(joyVal[i]));
  }
  if (!digitalRead(joyBtn)) {
    Serial.println(F("Joy Button pressed"));
  }
}

float joyRawToPhys(int raw) { /* function joyRawToPhys */
  ////Joystick conversion rule
  float phys = map(raw, MIN_VAL, MAX_VAL, -100 + joyOffset, 100 + joyOffset) - joyOffset;
  return phys;
}

Resultado

Una vez que el código ha sido cargado en el microcontrolador, deberías ver que los valores de X e Y cambian según la posición del joystick. También se observa que en posición de reposo, la conversión de los valores brutos no es igual a cero. Es posible corregir esta desviación añadiendo un desplazamiento al parámetro de conversión.

Solicitudes

  • Crea un control remoto para operar tu microcontrolador

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?