Vous voulez ajouter un contrôle directionnel à vos projets Arduino ? Le module joystick XY OPEN315 est la solution la plus intuitive : deux axes analogiques, un bouton-poussoir intégré, et un câblage en 5 fils. Dans ce tutoriel, vous allez apprendre à raccorder ce joystick à un Arduino Uno, lire les positions des axes X et Y, détecter l'appui sur le bouton, et afficher le tout sur le moniteur série.


Matériel nécessaire

Ce projet ne demande que très peu de composants. Pas besoin de bibliothèque externe — tout se fait avec les fonctions natives de l'Arduino.

ComposantQuantitéRôle dans le projet
Carte Arduino Uno Rev 31Carte principale, lit les entrées analogiques et numériques
Module joystick XY OPEN3151Fournit les axes X, Y et le bouton-poussoir
Straps flexibles M/F (15 cm)5Connexion directe entre l'Arduino et le joystick

? Astuce : Le module joystick dispose d'un connecteur mâle 5 broches au pas de 2,54 mm. Des straps mâle/femelle permettent un raccordement direct sans breadboard. Si vous préférez passer par une plaque d'essai sans soudure, utilisez alors des straps M/M.

Schéma de câblage

Le module joystick XY se connecte à l'Arduino Uno de la façon suivante :

  • +5V du module → broche 5V de l'Arduino
  • GND du module → broche GND de l'Arduino
  • VRx (axe X) → broche analogique A0 de l'Arduino
  • VRy (axe Y) → broche analogique A1 de l'Arduino
  • SW (bouton-poussoir) → broche numérique D2 de l'Arduino

Le module utilise deux potentiomètres de 10 kΩ pour les axes X et Y. Alimentés en 5V, ils génèrent une tension analogique de 0 à 5V. Au repos, les deux sorties se trouvent à environ 2,5V, soit une valeur de ~512 sur les 1024 pas du convertisseur analogique-numérique de l'Arduino.

Le bouton-poussoir intégré fonctionne en logique inversée : il tire la ligne vers GND quand on appuie sur le stick. On activera donc la résistance pull-up interne de l'Arduino sur cette broche pour obtenir un signal HIGH au repos et LOW quand on presse.

⚠️ Attention : L'ordre des broches peut varier selon les fabricants. Vérifiez toujours la sérigraphie de votre module avant de brancher. Un branchement inversé entre VRx et VRy n'abîmera rien, mais les axes seront intervertis.



Le code Arduino

Voici le sketch complet à téléverser dans votre Arduino Uno via l'IDE Arduino. Ce programme lit les deux axes et le bouton, détecte la direction du joystick grâce à une zone morte, et affiche la position ainsi que la direction sur le moniteur série.

Aucune bibliothèque externe n'est requise — tout fonctionne avec les fonctions standards analogRead() et digitalRead().


// ============================================
// Projet : Lecture d'un joystick XY
// Carte  : Arduino Uno
// Module : Joystick XY OPEN315
// ============================================
 
// Broches de raccordement
const int BROCHE_VRX = A0;    // Axe X (analogique)
const int BROCHE_VRY = A1;    // Axe Y (analogique)
const int BROCHE_SW  = 2;     // Bouton-poussoir (numérique)
 
// Zone morte autour de la position repos
// Permet d'éviter les micro-variations au centre
const int ZONE_MORTE = 50;
 
// Valeur centrale théorique (0-1023 / 2)
const int CENTRE = 512;
 
void setup() {
  // Initialisation du port série
  Serial.begin(9600);
  Serial.println("--- Joystick XY OPEN315 ---");
  Serial.println("Deplacez le joystick ou appuyez dessus.");
  Serial.println();
 
  // Configuration du bouton avec pull-up interne
  // Le bouton tire vers GND quand on appuie
  pinMode(BROCHE_SW, INPUT_PULLUP);
}
 
void loop() {
  // Lecture des valeurs brutes des axes
  int valeurX = analogRead(BROCHE_VRX);
  int valeurY = analogRead(BROCHE_VRY);
 
  // Lecture de l'état du bouton (LOW = appuyé)
  bool boutonAppuye = (digitalRead(BROCHE_SW) == LOW);
 
  // Détermination de la direction sur l'axe X
  String directionX = "Centre";
  if (valeurX < (CENTRE - ZONE_MORTE)) {
    directionX = "Gauche";
  } else if (valeurX > (CENTRE + ZONE_MORTE)) {
    directionX = "Droite";
  }
 
  // Détermination de la direction sur l'axe Y
  String directionY = "Centre";
  if (valeurY < (CENTRE - ZONE_MORTE)) {
    directionY = "Haut";
  } else if (valeurY > (CENTRE + ZONE_MORTE)) {
    directionY = "Bas";
  }
 
  // Affichage des valeurs brutes
  Serial.print("X: ");
  Serial.print(valeurX);
  Serial.print(" (");
  Serial.print(directionX);
  Serial.print(") | Y: ");
  Serial.print(valeurY);
  Serial.print(" (");
  Serial.print(directionY);
  Serial.print(") | Bouton: ");
 
  if (boutonAppuye) {
    Serial.println("APPUYE !");
  } else {
    Serial.println("relache");
  }
 
  // Pause de 200 ms
  delay(200);
}



Explications du code

Le sketch repose entièrement sur les fonctions natives de l'Arduino. Aucune bibliothèque à installer, ce qui rend le projet accessible même pour un grand débutant.

Dans le setup(), on initialise le port série à 9600 bauds et on configure la broche du bouton en INPUT_PULLUP. Ce mode active la résistance pull-up interne de l'ATmega328 : la broche est maintenue à l'état HIGH par défaut, et passe à LOW quand le bouton du joystick est pressé. Pas besoin d'ajouter de résistance externe.

La boucle loop() lit les deux axes avec analogRead(). Le convertisseur 10 bits de l'Arduino renvoie une valeur entre 0 et 1023. Au repos, le joystick se trouve au centre mécanique de sa course, ce qui donne une lecture aux alentours de 512. En poussant le stick à fond vers la gauche ou la droite, vous obtiendrez des valeurs proches de 0 ou 1023.

La zone morte (±50 autour du centre) est un détail important. Sans elle, le joystick au repos génèrerait des micro-variations qui feraient croire à un mouvement. C'est un réflexe classique en robotique et dans le développement de jeux vidéo : on ignore les petites variations autour de la position neutre. Vous pouvez ajuster la valeur ZONE_MORTE selon la précision que vous recherchez.



Résultats et tests

Si tout est correctement câblé, ouvrez le moniteur série à 9600 bauds et vous devriez voir défiler des lignes comme celles-ci :


--- Joystick XY OPEN315 ---
Deplacez le joystick ou appuyez dessus.
 
X: 515 (Centre) | Y: 508 (Centre) | Bouton: relache
X: 1023 (Droite) | Y: 510 (Centre) | Bouton: relache
X: 0 (Gauche) | Y: 510 (Centre) | Bouton: relache
X: 512 (Centre) | Y: 0 (Haut) | Bouton: relache
X: 512 (Centre) | Y: 1023 (Bas) | Bouton: relache
X: 1020 (Droite) | Y: 5 (Haut) | Bouton: relache
X: 518 (Centre) | Y: 512 (Centre) | Bouton: APPUYE !

Au repos, les valeurs X et Y oscillent autour de 510-515. C'est normal — les potentiomètres mécaniques ne sont jamais pile à 512. Quand vous poussez le stick en diagonale, les deux axes changent simultanément. Et quand vous appuyez verticalement sur le stick, le bouton passe à l'état APPUYÉ.

Si vos axes X et Y semblent inversés par rapport à ce que vous attendez, deux options : soit vous échangez physiquement les fils VRx et VRy, soit vous inversez les constantes BROCHE_VRX et BROCHE_VRY dans le code.



Pour aller plus loin

Le joystick tout seul c'est sympa, mais c'est quand on l'associe à des actionneurs que ça devient vraiment intéressant. Voici quelques idées de projets :

Piloter deux servomoteurs (tourelle pan/tilt)

En mappant les valeurs analogiques du joystick vers des angles de servomoteurs avec la fonction map(), vous pouvez construire une tourelle orientable sur deux axes. Idéal pour monter une caméra ou un capteur à ultrasons dessus. Un servomoteur miniature NanoS fera parfaitement l'affaire pour chaque axe.

Commander un robot mobile

L'axe Y pour avancer/reculer, l'axe X pour tourner à gauche/droite — c'est le schéma de pilotage classique d'un robot à deux roues motrices. Ajoutez un shield moteur ou un driver L298N et deux moteurs DC.

Déplacer un point sur une matrice LED

Raccordez une matrice LED 8x8 et utilisez le joystick pour déplacer un pixel à l'écran. Le bouton-poussoir peut servir à valider une position ou changer de couleur. Un mini jeu type Snake ou Labyrinthe est tout à fait réalisable.

Créer une interface de navigation

Associez le joystick à un afficheur OLED I2C pour naviguer dans un menu, sélectionner des options ou jouer à un mini-jeu type Pong. L'axe Y pour monter/descendre dans le menu, le bouton pour valider.

Idées de projets avec joystick XY et Arduino : tourelle servo, robot, jeu OLED, matrice LED

Quatre projets concrets pour exploiter votre joystick XY avec un Arduino



Questions fréquentes

Mon joystick renvoie des valeurs instables au repos, que faire ?

C'est le comportement normal d'un potentiomètre mécanique. Les micro-variations de quelques unités autour du centre sont inévitables. La solution est d'implémenter une zone morte dans votre code (comme dans notre exemple) pour ignorer les petites fluctuations. Une zone morte de ±30 à ±50 sur les 1024 valeurs possibles donne de bons résultats dans la plupart des projets.

Comment convertir les valeurs 0-1023 en angle pour un servomoteur ?

Utilisez la fonction map() de l'Arduino. Par exemple : int angle = map(valeurX, 0, 1023, 0, 180); convertira la lecture de l'axe X en un angle entre 0° et 180°. Associez cela à la bibliothèque Servo.h et un appel à monServo.write(angle) pour piloter directement un servomoteur.

Ce module fonctionne-t-il en 3,3V avec un ESP32 ou un Arduino Nano 33 ?

Le joystick OPEN315 fonctionne avec une alimentation de 5V. Si vous l'alimentez en 3,3V, il fonctionnera mais la plage de tension de sortie sera réduite (0 à 3,3V au lieu de 0 à 5V), donc les valeurs renvoyées par analogRead() seront plus faibles. Le bouton-poussoir fonctionnera sans problème puisqu'il s'agit d'un contact sec.

Est-il possible de connecter deux joysticks sur le même Arduino ?

Oui, à condition d'avoir assez d'entrées analogiques. L'Arduino Uno dispose de 6 entrées analogiques (A0 à A5). Deux joysticks utilisent 4 entrées analogiques et 2 entrées numériques pour les boutons — ça rentre largement. Si vous avez besoin de plus de joysticks, un Arduino Mega avec ses 16 entrées analogiques sera plus adapté.



Ressources et documentation

Référence analogRead() sur Arduino.cc

La documentation officielle de la fonction analogRead() détaille le fonctionnement du convertisseur analogique-numérique 10 bits de l'Arduino, les temps de conversion et les bonnes pratiques de lecture.

Consulter la documentation

Référence digitalRead() et INPUT_PULLUP

La documentation officielle explique comment configurer une broche en entrée avec résistance pull-up interne — exactement ce qu'on utilise pour le bouton du joystick.

Consulter la documentation

Page produit du joystick XY OPEN315 sur Lextronic

Retrouvez le module joystick XY dans notre catalogue, avec ses caractéristiques détaillées et les produits associés.

Voir la fiche produit

Gamme de capteurs et modules pour Arduino

Explorez notre sélection complète de capteurs, joysticks, encodeurs et modules d'interface pour vos projets Arduino et maker.

Voir la gamme capteurs

Produit ajouté à ma liste