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
- https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
- Gestión de sensores con Arduino
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código