Composants · 5 min de lecture

Utiliser un module joystick : lire les axes X-Y et le bouton avec Arduino

Comment fonctionne un module joystick analogique (KY-023) ? Broches VRx, VRy et SW, câblage Arduino, zone morte et étalonnage, détection de direction, piloter un servo au joystick, code ESP32 et Pico.

Un module joystick est la version pour Arduino des petits manches qu'on trouve sur les manettes de jeu. Quand tu déplaces le manche à gauche-droite et en avant-arrière, il donne sa position sur deux axes, et quand tu appuies dessus, un bouton intégré se déclenche. C'est l'organe d'entrée le plus pratique pour les télécommandes de voiture robot, les supports de caméra pan-tilt, les jeux sur matrice LED et les menus d'écran. Le modèle le plus courant est aussi connu sous le nom de KY-023.

Module joystick analogique KY-023
Module joystick analogique : il contient deux potentiomètres pour les deux axes et un bouton actionné en appuyant sur le manche ; il a 5 broches : GND, +5V, VRx, VRy et SW.

Comment fonctionne un module joystick ?

Sous le manche se trouvent deux potentiomètres de 10 kΩ placés à angle droit : l'un détecte le mouvement sur l'axe X, l'autre sur l'axe Y. Chaque potentiomètre fonctionne comme un pont diviseur ; manche au centre, son curseur donne environ 2,5 V et analogRead() lit environ 512. Pousse le manche jusqu'à une butée et la valeur approche 0 ; jusqu'à l'autre, elle approche 1023. Appuie sur le manche et un petit bouton relie la broche SW à GND.

Position du mancheVRx (X)VRy (Y)
Centre (relâché)~512~512
Tout à gauche~0~512
Tout à droite~1023~512
Tout en haut~512~0
Tout en bas~512~1023

Le sens qui donne 0 et celui qui donne 1023 dépendent de la façon dont tu tiens le module. Si, broches tournées vers toi, les directions ne correspondent pas à ce tableau, pas d'inquiétude : dans le code, tu inverses facilement un axe en soustrayant la valeur de 1023.

Brochage et câblage du joystick

BrocheRôleArduino UnoESP32Raspberry Pi Pico
GNDMasseGNDGNDGND
+5VAlimentation5V3V33V3
VRxAxe X (analogique)A0GPIO 34GP26
VRyAxe Y (analogique)A1GPIO 35GP27
SWBouton (à GND quand on appuie)D2GPIO 25GP15
Sur l'ESP32 et le Pico, alimente le module par la broche 3V3, pas par le 5V ; même si la broche s'appelle « +5V », le module fonctionne très bien en 3,3 V. Alimenté en 5 V, il enverrait plus de 3,3 V sur les broches analogiques et la carte pourrait être endommagée. Sur l'ESP32, n'utilise pas les broches 34 à 39 pour SW : elles n'ont pas de résistance de tirage interne.

Lire le joystick avec Arduino

Le code ci-dessous lit les deux axes et le bouton et les affiche dans le moniteur série. Comme le bouton se relie à GND quand on appuie et que la plupart des modules n'ont pas de résistance de tirage, la broche SW doit être configurée en INPUT_PULLUP : on lit alors HIGH bouton relâché et LOW bouton appuyé.

Arduino (C++)
1const int X_PIN = A0;
2const int Y_PIN = A1;
3const int SW_PIN = 2;
4
5void setup() {
6  pinMode(SW_PIN, INPUT_PULLUP);   // basınca LOW / LOW when pressed
7  Serial.begin(9600);
8}
9
10void loop() {
11  int x = analogRead(X_PIN);       // 0–1023, ortada ~512 / ~512 at center
12  int y = analogRead(Y_PIN);
13  bool pressed = digitalRead(SW_PIN) == LOW;
14
15  Serial.print("X: ");  Serial.print(x);
16  Serial.print("  Y: "); Serial.print(y);
17  Serial.print("  Buton / button: ");
18  Serial.println(pressed ? "basılı / pressed" : "-");
19  delay(100);
20}
Si tu ouvres le traceur série (Serial Plotter), tu vois les deux axes sur le même graphique. Observer comment les deux courbes changent en faisant tourner lentement le manche est le moyen le plus rapide de comprendre le sens de chaque axe.

Zone morte et étalonnage

En pratique, manche relâché, la valeur n'est pas exactement 512 : elle affiche plutôt 495 ou 525 et tremble de quelques unités. Si tu ne corriges pas cela, ta voiture robot avance toute seule ou le servo frémit alors que tu ne touches pas au joystick. La solution se fait en deux étapes : mesurer et mémoriser la valeur centrale au démarrage (étalonnage) et ignorer les petits écarts autour du centre (zone morte). La fonction ci-dessous transforme chaque axe en une valeur propre de -100 à +100, avec le centre exactement à 0 :

Arduino (C++)
1int centerX, centerY;
2const int DEAD_ZONE = 40;
3
4int readAxis(int pin, int center) {
5  int v = analogRead(pin) - center;
6  if (abs(v) < DEAD_ZONE) return 0;                              // ölü bölge / dead zone
7  if (v > 0) return map(v, DEAD_ZONE, 1023 - center, 0, 100);    // sağ ya da aşağı / right or down
8  return map(v, -center, -DEAD_ZONE, -100, 0);                   // sol ya da yukarı / left or up
9}
10
11void setup() {
12  Serial.begin(9600);
13  centerX = analogRead(A0);   // açılışta joystick'e dokunma / don't touch it at startup
14  centerY = analogRead(A1);
15}
16
17void loop() {
18  Serial.print(readAxis(A0, centerX));
19  Serial.print(", ");
20  Serial.println(readAxis(A1, centerY));
21  delay(50);
22}

Détecter les directions : haut, bas, gauche, droite

Dans les jeux et les menus, on a souvent besoin seulement de la direction, pas de la position exacte. En comparant les valeurs à deux seuils, tu transformes le joystick en croix directionnelle à quatre directions. Pour naviguer dans un menu, chaque poussée doit compter pour un seul pas : le code utilise donc une courte pause, ou n'accepte pas de nouveau pas avant que le manche soit revenu au centre.

Arduino (C++)
1void loop() {
2  int x = analogRead(A0);
3  int y = analogRead(A1);
4  if (x < 300)      Serial.println("Sol / left");
5  else if (x > 700) Serial.println("Sağ / right");
6  else if (y < 300) Serial.println("Yukarı / up");
7  else if (y > 700) Serial.println("Aşağı / down");
8  delay(150);
9}

Piloter un servomoteur avec le joystick

En ramenant un axe du joystick sur 0–180 degrés, tu orientes un servo à la main ; avec deux axes et deux servos, tu obtiens un support pan-tilt qui tourne une caméra à gauche-droite et en haut-bas. Pour le câblage du servo et les précautions d'alimentation, vois Qu'est-ce qu'un servomoteur ?

Arduino (C++)
1#include <Servo.h>
2
3Servo panServo;
4
5void setup() {
6  panServo.attach(9);
7}
8
9void loop() {
10  int x = analogRead(A0);
11  int angle = map(x, 0, 1023, 0, 180);   // joystick → açı / joystick → angle
12  panServo.write(angle);
13  delay(15);
14}

Joystick avec l'ESP32 et le Raspberry Pi Pico

L'ADC de l'ESP32 est sur 12 bits et donne des valeurs de 0 à 4095, mais comme il n'est pas linéaire, le centre tombe souvent vers 1800–1950 au lieu de 2048. L'étalonnage présenté plus haut est donc encore plus important sur l'ESP32. Si tu utilises le Wi-Fi, branche les axes sur des broches ADC1 (GPIO 32 à 39). Sur le Pico, les entrées analogiques sont GP26 à GP28, et read_u16() renvoie des valeurs de 0 à 65535 :

MicroPython
1from machine import ADC, Pin
2import time
3
4x_axis = ADC(26)                        # GP26 → VRx
5y_axis = ADC(27)                        # GP27 → VRy
6button = Pin(15, Pin.IN, Pin.PULL_UP)   # SW, basınca 0 / 0 when pressed
7
8while True:
9    x = x_axis.read_u16()               # 0–65535, ortada ~32768 / ~32768 at center
10    y = y_axis.read_u16()
11    print(x, y, "BASILI / PRESSED" if button.value() == 0 else "")
12    time.sleep(0.1)

Idées de projets avec un joystick

  • Télécommande de voiture robot : branche le joystick sur une carte émettrice et envoie les commandes à la voiture par nRF24L01 ou Bluetooth.
  • Caméra pan-tilt : oriente une caméra dans toutes les directions avec deux servos et un joystick.
  • Snake sur une matrice LED : dirige le serpent sur une matrice 8x8 avec le joystick.
  • Menu à l'écran : parcours les options avec haut et bas et valide avec le bouton ; pour l'écran, vois Utiliser un écran LCD I2C.
  • Sélecteur de couleur : pilote une LED RGB en choisissant la couleur avec l'axe X et la luminosité avec l'axe Y.
  • Souris d'ordinateur : transforme le joystick en vraie souris USB avec un Arduino Leonardo ou un Pro Micro.

Erreurs fréquentes et solutions

  • Le bouton semble appuyé alors qu'il ne l'est pas : la broche SW n'est pas en INPUT_PULLUP ; elle est « en l'air » et lit des valeurs aléatoires.
  • Au repos, la valeur n'est pas 512 et tremble : c'est normal ; étalonne au démarrage et ajoute une zone morte.
  • Les axes sont inversés ou permutés : cela vient de l'orientation du module ; soustrais la valeur de 1023 ou échange les fils VRx et VRy.
  • Sur l'ESP32, le centre n'est pas 2048 : l'ADC de l'ESP32 n'est pas linéaire ; mesure le centre au démarrage et calcule à partir de lui.
  • Le servo tremble ou l'Arduino redémarre : le servo surcharge le 5 V de l'Arduino ; alimente-le avec une source 5 V séparée et relie les masses.

Un joystick, ce n'est finalement que deux potentiomètres et un bouton : Qu'est-ce qu'un potentiomètre ? et Comment brancher un bouton-poussoir sur Arduino consolideront ce que tu as appris ici. Dans l'application BlueGrays, tu trouveras des projets de pilotage de LED et de servo au joystick ainsi qu'un jeu Snake sur matrice LED, avec schémas et code.

Questions fréquentes

À quoi servent les broches du module joystick ?

GND et +5V sont les broches d'alimentation. VRx et VRy donnent la position sur les axes X et Y sous forme de tension analogique et se branchent sur des broches analogiques. SW est la sortie du bouton, reliée à GND quand on appuie sur le manche, et se branche sur une broche numérique en INPUT_PULLUP.

Pourquoi mon joystick n'affiche-t-il pas exactement 512 au centre ?

Les potentiomètres et la mécanique ne sont pas parfaits ; au repos, la valeur se situe généralement entre 490 et 530 et tremble de quelques unités. Mesurer et mémoriser la valeur centrale au démarrage et utiliser une zone morte de ±30 à 50 règle le problème.

Pourquoi la broche SW passe-t-elle au hasard de LOW à HIGH ?

La plupart des modules joystick n'ont pas de résistance de tirage pour le bouton : la broche reste « en l'air » comme si elle n'était pas branchée. Active la résistance de tirage interne de l'Arduino avec pinMode(SW_PIN, INPUT_PULLUP) et tu liras HIGH bouton relâché, LOW bouton appuyé.

Combien de servos peut-on piloter avec un joystick ?

Un joystick a deux axes : il pilote donc deux servos indépendamment, ce qui est idéal pour une caméra pan-tilt. Pour plus de servos, ajoute un second joystick ; les 6 broches analogiques de l'Arduino Uno suffisent pour trois joysticks.

Peut-on utiliser le joystick comme télécommande sans fil ?

Oui. Branche le joystick sur un Arduino et envoie ses valeurs à une autre carte avec un module radio nRF24L01, un module Bluetooth HC-05, ou ESP-NOW entre deux ESP32. La plupart des projets de voiture robot et de radiocommande fonctionnent ainsi.

Le module joystick fonctionne-t-il avec l'ESP32 et le Raspberry Pi Pico ?

Oui, mais il faut l'alimenter par la broche 3V3. Les valeurs vont de 0 à 4095 sur l'ESP32 et de 0 à 65535 sur le Pico. Sur l'ESP32, utilise les broches ADC1 (GPIO 32 à 39), qui fonctionnent avec le Wi-Fi actif, et étalonne le centre au démarrage.

Voir tous les projets
Commande par Led avec Joystick
#59Intermédiaire
Premium

Commande par Led avec Joystick

Projet de contrôle qui allume des LED dans 4 directions différentes en fonction des valeurs des axes X et Y du module joystick. Enseigne la lecture analogique du joystick et la logique de détection de

4.7(50)
66
Servocommande avec joystick
#60Intermédiaire
Premium

Servocommande avec joystick

Projet d'inclinaison panoramique qui contrôle indépendamment deux servomoteurs sur les axes X et Y à l'aide d'un module joystick. Enseigne la logique de l'intégration joystick-servo et le suivi de pos

4.7(42)
58
Serpent à pixels Matrice 8x8
#88Avancé
Premium

Serpent à pixels Matrice 8x8

Jeu de serpent matériel basé sur Arduino et développé à l'aide d'une matrice de LEDs 8x8 WS2812B NeoPixel et d'un joystick analogique. Il comprend un algorithme de vitesse dynamique et des contrôles d

4.7(39)
57
Matrix Snake 16x16
#89Avancé
Premium

Matrix Snake 16x16

Il s'agit d'un portage matériel étendu à 256 pixels du jeu de serpent classique fonctionnant sur une matrice 16x16 WS2812B NeoPixel. Dans ce projet, qui est contrôlé par Arduino et un joystick analogi

4.8(52)
67
Servomoteur ESP32 (commande par potentiomètre)
#118Intermédiaire
Premium

Servomoteur ESP32 (commande par potentiomètre)

Dans ce projet, nous contrôlons un servomoteur SG90 à l'aide d'un potentiomètre. Nous réglons l'angle du servomoteur en mappant la valeur analogique lue par le potentiomètre sur une plage de 0 à 180 degrés. Grâce à la bibliothèque ESP32Servo, n'importe quel GPIO de l'ESP32 peut générer un signal PWM. Il s'agit d'une méthode de contrôle fondamentale pour les bras robotiques, les cardans de caméra et les mécanismes de portes automatiques.

4.3(29)
42
Jeu de pong - SSD1306
#86Intermédiaire
Premium

Jeu de pong - SSD1306

Le jeu Pong classique construit à l'aide d'Arduino et d'un écran OLED SSD1306, équipé d'une intelligence artificielle (CPU) autonome qui suit instantanément les mouvements de la balle et réagit en fon

4.5(47)
65
OLED T-Rex Run : Jeu de dinosaures Arduino 🦖
#87Avancé
Premium

OLED T-Rex Run : Jeu de dinosaures Arduino 🦖

Nous avons transposé le légendaire jeu de dinosaures "No Internet" sur un support matériel ! Transformez l'excitation du jeu rétro en une mini console physique avec ce projet que nous avons développé

4.7(33)
53
Jeu Arduino LCD Runner
#98Intermédiaire
Premium

Jeu Arduino LCD Runner

Jeu de course sans fin à défilement latéral fonctionnant sur un écran LCD de 6x2 caractères. Le héros court automatiquement, le joueur saute par-dessus les obstacles en appuyant sur le bouton. Des obstacles aléatoires apparaissent sur les rangées du haut et du bas. Un buzzer passif joue la mélodie d'ouverture, le son de saut, le son de célébration des 50 points et la mélodie de fin de partie. L'écran d'accueil "BlueGrays - Arduino Projects" s'affiche au démarrage. Le score est mis à jour instant

4.7(31)
53

Apprends à lire les deux potentiomètres et le bouton d'un joystick, à corriger la dérive du centre avec une zone morte, à détecter les directions et à piloter un servomoteur avec le joystick.

Utiliser un module joystick : lire les axes X-Y et le bouton avec Arduino | BlueGrays