Le joystick est un capteur de position qui renvoie deux valeurs analogiques représentant sa position X,Y. Il peut servir d’interface pour naviguer dans un menu ou bien pour piloter un objet en direction ou en vitesse. On le retrouve couramment sur les manettes pour jeux vidéo, les télécommandes de modélisme ou encore sur les tableaux de bord machines industrielles.
Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Joystick
Principe de fonctionnement
Le joystick est composé de deux potentiomètres couplés mécaniquement placés de manière à détecter les composantes horizontale et verticale du joystick. Ainsi les valeurs de résistance des potentiomètres varient indépendamment en fonction de la position du joystick. Il y a généralement un bouton poussoir qui s’active lorsqu’on presse sur le joystick.
Schéma
Le joystick renvoie deux valeurs analogiques que nous brancheront naturellement sur les entrées analogiques du microcontrôleur. Il renvoie aussi un valeur digitale que nous branchons sur la broche 2 du microcontrôleur.
Code
Le joystick s’utilise comme l’association de deux potentiomètres et d’un bouton poussoir. Nous allons donc définir deux entrées analogiques pour récupérer les valeurs de position et une entrée digitale pour le bouton intégré au Joystick. Pratiquement, les valeurs analogiques brutes ne seront pas utilisés directement. Elle serviront à piloter des variables avec leurs propres domaines de définition (valeurs extrêmes, précision, type, etc.). Ceci étant dit, il peut être intéressant de définir une fonction qui permettra de convertir la valeur brute en valeur utilisable. Dans notre exemple, nous choisissons une plage de valeur allant de -100 à 100, qui peut être interprétée comme la vitesse d’un moteur avec une valeur négative représentant un sens de rotation opposé et 100 représentant la vitesse maximale.
//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; }
Résultat
Une fois le code chargé dans le microcontrôleur vous devriez voir les valeurs de X et Y évoluer en fonction de la position du Joystick. On observe aussi qu’en position de repos, la conversion des valeurs brutes n’est pas égale à zéro. Il est possible de corriger cet écart en ajoutant un offset au paramètre de conversion.
Applications
- Créer une télécommande pour piloter votre microcontrôleur
Sources
- https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
- Gestion des capteurs avec Arduino
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie