Site icon AranaCorp

Utilisation d’un Joystick avec Arduino

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

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

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile