Qu'est ce qu'un Joystick ? Comment le faire fonctionner dans vos projets ?

Introduction

Un joystick est un capteur de position composé d’une tige qui pivote sur une base et qui transmet l’angle ou la direction à la carte Arduino sous la forme de coordonnées d’abscisse et d’ordonnée

Les joysticks sont largement utilisés dans notre environnement, notamment dans les manettes de jeux, pour contrôler des voitures télécommandées, des drones ou des caméras.

Pour les contrôler, vous aurez donc deux valeurs : celle des abscisses (haut et bas) et celle des ordonnées (gauche et droite).

Le joystick est équipé de deux potentiomètres de 10K ohms, un pour chaque axe. Lorsque le joystick est déplacé, les valeurs des potentiomètres varient en conséquence, nous fournissant ainsi une coordonnée de position. Ces potentiomètres sont essentiels pour traduire les mouvements du joystick en données numériques interprétables par la carte Arduino.

Le joystick est équipé de deux potentiomètres avec des résistances équivalentes, ce qui signifie que la tension de 5V est divisée en deux portions égales, soit 2,5V pour chaque potentiomètre. En bougeant le joystick, la tension varie de 0V à 5V, permettant ainsi de couvrir toute la plage de valeurs possibles pour chaque axe.

Lorsque nous lisons la valeur du joystick avec la carte Arduino, nous obtenons une valeur de 512 lorsque le joystick est au repos, et une valeur qui varie de 0 à 1023 lorsque le joystick est déplacé, en fonction de sa position.

Le joystick possède aussi un pour vos projets. Il peut servir pour prendre le contrôle de la souris de votre ordinateur, ou si vous devez cliquer sur ce que vous pointez.

e joystick est également équipé d’un bouton poussoir, celui-ci peut être utilisé pour prendre le contrôle de la souris de votre ordinateur, ou pour effectuer des clics sur les éléments désirés.

Le joystick possède plusieurs pins :

  • GND : masse
  • +5V : tension d’alimentation
  • vRx : broche analogique  indiquant la position en abscisse
  • vRy : broche analogique indiquant la position en ordonnée
  • Sw : indique la position du bouton poussoir

Afficher les coordonnées du joystick

Voyons maintenant comment afficher les coordonnées du joystick sur le moniteur série de l’Arduino IDE. Pour ce faire, nous allons connecter le joystick à la broche analogique de la carte Arduino afin de récupérer les valeurs d’abscisse et d’ordonnée :

Comment reproduire le circuit sur Fritzing ?

Si vous souhaitez reproduire le circuit sur Fritzing, vous aurez besoin du composant “Joystick” qui n’est pas inclus par défaut dans la bibliothèque standard de Fritzing. Vous pouvez le trouver pour l’ajouter : ici.

 

Voici le code permettant d’afficher les coordonnées X et Y du joystick :

//Broche de la carte Arduino
const int SW_pin = 2; // Pin digital pour indiquer la position du bouton pousssoir
const int X_pin = 0; // Pin analogique pour l'axe X
const int Y_pin = 1; // Pin analogique pour l'axe Y

void setup() {
  pinMode(SW_pin, INPUT); // Configure SW comme une entré
  digitalWrite(SW_pin, HIGH); // Met de la tension dans SW pour dire au joystock que c'est une entré
  Serial.begin(9600); // Configure le moniteur série
}

void loop() {
  Serial.print("Coordonnée en X ");
  Serial.print(analogRead(X_pin)); // Valeur en X
  Serial.print("\n");
  Serial.print("Coordonnée en Y ");
  Serial.println(analogRead(Y_pin)); // Valeur en Y
  Serial.print("\n\n");
  delay(500); // // Une petite pause pour ne pas surcharger le moniteur série
}

Voici les valeurs affichées sur le moniteur série :

Contrôler un servomoteur

Maintenant, nous allons apprendre comment contrôler un servomoteur à l’aide d’un joystick. Le servomoteur ira de 0° à 180 degrés en fonction des coordonnées d’abscisse du joystick. Ce circuit offre de nombreuses possibilités pour divers projets, tels que diriger une voiture télécommandée, actionner l’ouverture d’une valve d’eau, ou même contrôler le gouvernail d’un bateau.

#include <Servo.h> // Utilisation de la bibliothèque Servo.h.
//Broche de la carte Arduino
#define pinServo 9  // Broche pour le signal du servomoteur X.
const int SW_pin = 2; // Pin digital pour indiquer la postion du bouton poussoir
const int X_pin = 0; // Pin analogique pour la coordonnée X
const int Y_pin = 1; // Pin analogique pour la coordonnée Y
unsigned short X,Y; // Variables pour les valeurs du joystick.
Servo Sx;        // Déclaration du Servo.

void setup() {
  pinMode(SW_pin, INPUT); // Configure SW comme une entré
  digitalWrite(SW_pin, HIGH); // Met de la tension dans SW pour dire au joystock que c'est une entré
  pinMode(pinServo, OUTPUT); // Broche servo moteur en sortie.
  Sx.attach(pinServo); // Fait la correspondance entre la broche du servomoteur et le pin
  Sx.write(90); // Met le servomoteur en position initiale.
  Serial.begin(9600); // Configure le moniteur série

}

void loop() {
  X = analogRead(X_pin); // Lecture des valeurs du joystick.
  Sx.write(rotation_servo(X)); // Envoi des signaux de rotation.
  delay(500);
}


byte rotation_servo(unsigned short n) // Fonction de correspondance.
{
  return (byte)(-0.175953 * n + 180);  
}

Contrôler le servomoteur avec l'axe des ordonnées du joystick

Dans certains projets, vous pourriez avoir besoin de contrôler le servomoteur en utilisant l’axe des ordonnées du joystick (mouvement haut et bas) plutôt que l’axe des abscisses (mouvement gauche et droite).

Pour cela, vous devez changer la ligne 21  du code X = analogRead(X_pin); par  X = analogRead(Y_pin);