Étiquettes : , , ,
3.7
(3)

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.

Schéma

Le joystick renvoie deux valeurs analogiques que nous brancheront naturellement sur les entrées analogiques 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);
}

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"));
  }
}

int 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

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

How useful was this post?

Click on a star to rate it!

Average rating 3.7 / 5. Vote count: 3

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?