Le joystick analogique est le manche des manettes de jeu, ramené sur une petite carte : deux axes qui renvoient chacun une tension proportionnelle à la position du manche, plus un bouton poussoir intégré que l’on actionne en appuyant dessus. Une seule pièce, cinq fils, et votre montage sait où on lui demande d’aller.
C’est un module passif : il ne contient que deux potentiomètres de 10 kΩ et un interrupteur. Il ne consomme presque rien, ne craint ni les appels de courant ni les erreurs de programmation, et se relit avec les fonctions ordinaires analogRead() et digitalRead(). Aucune bibliothèque n’est nécessaire.
C’est aussi le format universel des kits Arduino : les modules vendus sous les références KY-023 ou HW-504 partagent exactement le même mécanisme, le même brochage et les mêmes libellés sérigraphiés. Le module de cette page porte les repères GND, +5V, VRx, VRy et SW imprimés sur la carte noire — sous cette forme, ou sous la forme abrégée RX et RY selon le lot : les deux photos de cette page montrent l’une et l’autre.
À quoi sert un joystick analogique ?
Contrairement à un jeu de quatre boutons, le joystick ne dit pas seulement « à gauche » ou « à droite » : il dit à quel point. C’est ce qui permet de doser un mouvement au lieu de le déclencher.
- Piloter un pan-tilt — deux servomoteurs orientent une caméra ou un capteur dans toutes les directions.
- Conduire un robot — vitesse et direction d’un châssis à deux moteurs, proportionnelles à l’inclinaison du manche.
- Naviguer dans un menu — déplacer un curseur sur un écran, valider avec le bouton intégré.
- Commander une grue ou un bras — un axe par vérin, un mouvement sans à-coups.
- Une télécommande filaire — au bout d’un câble, pour un robot de démonstration ou un banc de test.
Caractéristiques techniques
| Type | Joystick analogique 2 axes avec bouton poussoir (format standard des kits Arduino) |
|---|---|
| Axes | X et Y, par deux potentiomètres linéaires indépendants montés à 90° |
| Valeur des potentiomètres | 10 kΩ chacun, environ |
| Alimentation | 3,3 à 5 V continu |
| Sorties analogiques | VRx et VRy : de 0 V à la tension d’alimentation, proportionnelles à la position |
| Valeur au repos | Environ la moitié de la pleine échelle : autour de 512 en 10 bits sur Arduino |
| Sortie du bouton | SW : contact vers la masse quand on appuie, à l’état haut au repos |
| Consommation | Moins de 5 mA — un simple pont diviseur |
| Connecteur | 5 broches mâles au pas de 2,54 mm |
| Retour au centre | Automatique, par ressorts, dès que le manche est lâché |
| Fixation | 4 trous pour vis M3 |
| Dimensions de la carte | Environ 40 × 27 mm, manche d’une trentaine de millimètres |
| Température de service | −10 °C à +70 °C |
Brochage : cinq broches, imprimées sur la carte
| GND | La masse. À relier au GND de l’Arduino — c’est la référence commune. |
|---|---|
| +5V | L’alimentation. À relier au 5 V de la carte, ou au 3,3 V sur un microcontrôleur qui ne supporte pas 5 V en entrée analogique. |
| VRx | La sortie analogique de l’axe X. À relier à une entrée analogique, par exemple A0. |
| VRy | La sortie analogique de l’axe Y. À relier à une autre entrée analogique, par exemple A1. |
| SW | Le bouton poussoir. À relier à une entrée numérique configurée en INPUT_PULLUP. |
Deux remarques qui font gagner du temps :
- Sur certaines cartes, la sérigraphie est disposée dans un autre ordre, ou les repères VRx et VRy sont abrégés en RX et RY. En cas de doute, c’est la position de la broche qui compte, pas le libellé : la masse est toujours voisine de l’alimentation.
- L’axe que le module appelle X peut correspondre au mouvement horizontal ou vertical selon la façon dont vous l’avez tourné sur votre montage. Si les commandes se croisent, échangez simplement les deux fils dans votre programme — et non sur la carte.
Ce que le module renvoie, concrètement
Chaque axe se comporte comme un pont diviseur : au centre du débattement, la sortie vaut la moitié de la tension d’alimentation ; poussée à fond d’un côté, elle approche 0 V, et à fond de l’autre, l’alimentation. Sur un Arduino en 10 bits, cela donne une lecture d’environ 0 à 1023, avec une valeur de repos proche de 512.
Trois points pratiques :
- Le centre n’est jamais exactement à 512. Les ressorts et la mécanique donnent toujours quelques dizaines de points d’écart, variables d’un exemplaire à l’autre. Un programme sérieux mesure la position de repos au démarrage plutôt que de la supposer.
- Une zone morte évite le tremblement. Sans elle, un manche lâché continue d’envoyer de petites variations qui font vibrer un servomoteur. On ignore les écarts faibles autour du repos.
- Sur un ESP32, la valeur de repos tourne autour de 2048, car son convertisseur travaille en 12 bits. La logique reste identique.
Mini-projet : deux servomoteurs pilotés au manche
Un montage de démonstration complet : le manche oriente deux servomoteurs, un pour l’horizontale, un pour la verticale. Le bouton intégré remet le montage au centre. Comptez une vingtaine de minutes.
Ce qu’il faut
| Le manche | Le joystick analogique de cette page |
|---|---|
| Le cerveau | Uno R3 + câble USB |
| Les mouvements | Servomoteur SG90 — il en faut deux, un par axe |
| Le support | Plaque d’essai 400 points |
| Les liaisons | 10 × fil mâle-femelle |
Pourquoi des fils mâle-femelle ? Le joystick et les servomoteurs portent des broches mâles, et une plaque d’essai n’accepte que des broches mâles. Le fil mâle-femelle fait le pont : l’extrémité femelle se clipse sur le module, l’extrémité mâle se pique dans la plaque.
Le câblage
Joystick GND | → Arduino GND |
|---|---|
Joystick +5V | → Arduino 5V |
Joystick VRx | → Arduino A0 |
Joystick VRy | → Arduino A1 |
Joystick SW | → Arduino D2 |
| Servo horizontal (orange) | → Arduino D9 |
| Servo vertical (orange) | → Arduino D10 |
| Les deux servos (rouge) | → Arduino 5V |
| Les deux servos (marron) | → Arduino GND |
Côté servomoteur, trois fils : le plus foncé — brun ou noir selon le modèle — est la masse, le rouge porte l’alimentation, et le troisième, orange ou jaune, transporte le signal. Sur ces connecteurs à trois broches, c’est donc le fil rouge qui occupe la broche du milieu, encadré par la masse et le signal : le plus et le moins ne peuvent pas s’inverser en retournant la prise. Si votre servo tourne à l’envers de ce que vous attendez, c’est normal : certains modèles sont inversés en usine, il suffit d’inverser les valeurs dans le programme.
Le programme
À copier dans l’IDE Arduino, puis à téléverser sur la carte :
/*
* Deux servomoteurs pilotes au joystick analogique
* Carte : Arduino Uno R3
* Montage : joystick 2 axes + deux servomoteurs SG90
*
* Composants, brochage et fiche complete : www.marocproduits.com
*/
#include "Servo.h"
const byte PIN_VRX = A0; // axe X du joystick
const byte PIN_VRY = A1; // axe Y du joystick
const byte PIN_SW = 2; // bouton poussoir integre
Servo servoHorizontal;
Servo servoVertical;
void setup() {
// Le bouton relie la broche a la masse : le rappel interne fait le reste.
pinMode(PIN_SW, INPUT_PULLUP);
servoHorizontal.attach(9);
servoVertical.attach(10);
// Position de depart : les deux servos au centre de leur course.
servoHorizontal.write(90);
servoVertical.write(90);
Serial.begin(9600);
Serial.println("Manche pret.");
}
void loop() {
int x = analogRead(PIN_VRX);
int y = analogRead(PIN_VRY);
// map() etale la plage du convertisseur sur les 180 degres du servo.
int angleH = map(x, 0, 1023, 0, 180);
int angleV = map(y, 0, 1023, 0, 180);
// map() ne borne pas le resultat : on le ramene dans la course utile.
angleH = constrain(angleH, 0, 180);
angleV = constrain(angleV, 0, 180);
if (digitalRead(PIN_SW) == LOW) {
// Le bouton est enfonce : on remet le montage au centre.
angleH = 90;
angleV = 90;
}
servoHorizontal.write(angleH);
servoVertical.write(angleV);
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.println(y);
// 20 ms : assez rapide pour la main, assez lent pour le servo.
delay(20);
}Comment ça marche
analogRead()traduit chaque tension en un nombre de 0 à 1023. C’est cette valeur qui porte la position du manche.map()la reporte sur la course du servomoteur, de 0 à 180 degrés. Attention : cette fonction ne borne rien. Une lecture légèrement hors plage donne un angle impossible, d’où leconstrain()qui suit — c’est la ligne que l’on oublie et qui fait claquer les servos en butée.INPUT_PULLUPactive la résistance de rappel interne de l’Arduino : au repos la broche est haute, et l’appui sur le manche la tire vers la masse, donc à l’état bas. Aucune résistance extérieure n’est nécessaire.- La pause de 20 ms à chaque tour évite d’envoyer au servo des ordres plus vite qu’il ne peut les exécuter. Les servomoteurs se règlent par impulsions de 20 ms : c’est leur rythme naturel.
Pour aller plus loin
- Une zone morte — n’appliquez le mouvement que si l’écart avec la position de repos dépasse un seuil. Le manche lâché cesse alors de faire vibrer le servo, et les servomoteurs durent plus longtemps.
- Un support de fixation — un support de servo SG90 permet de monter les deux axes l’un sur l’autre pour former une tête orientable, plutôt que de laisser les servos posés sur la table.
- Une commande de vitesse — remplacez le servo par un pont en H et appliquez au moteur une vitesse proportionnelle à l’écart au repos. Le joystick devient un vrai manche de conduite.
Variante : afficher les valeurs sur un écran
Pour comprendre ce que renvoie vraiment le module, un écran est plus parlant qu’un moniteur série. Un afficheur LCD 16×02 I2C se branche sur deux fils seulement — SDA sur A4, SCL sur A5 — et affiche en clair la valeur des deux axes et l’état du bouton. Le programme du mini-projet gagne une dizaine de lignes : on déclare l’afficheur avec la bibliothèque LiquidCrystal_I2C, on l’initialise dans setup(), et on remplace les Serial.print par des lcd.setCursor() et lcd.print(), suivis d’un effacement de l’écran à chaque tour de boucle.
Et si le montage grandit, la commande des servomoteurs change de dimension : un driver I2C PCA9685 pilote seize servomoteurs sur les mêmes deux fils, avec une alimentation séparée qui évite de faire chuter la carte Arduino quand les moteurs forcent. C’est la carte des bras robotisés et des robots à roues.
Points d’attention
- Le module se branche directement, sans résistance ni adaptation. Ses sorties VRx et VRy sont déjà dans la plage attendue par un convertisseur analogique alimenté à la même tension.
- Sur un microcontrôleur 3,3 V, alimentez le module en 3,3 V et non en 5 V, sinon les sorties analogiques dépasseront la plage des entrées et pourront abîmer le microcontrôleur. Le module accepte les deux tensions.
- Ne forcer jamais le manche au-delà de sa course. Ce sont deux potentiomètres mécaniques : un débattement forcé peut les décoller de la carte.
- Pourvu qu’il soit alimenté, le module fonctionne en milieu humide comme en milieu sec — mais pas immergé. Pour un projet en extérieur, un boîtier étanche reste la bonne solution.
Questions fréquentes
Faut-il une bibliothèque pour lire le joystick ?
Aucune. Deux entrées analogiques et une entrée numérique suffisent. Seul le pilotage de servomoteurs demande la bibliothèque Servo, livrée avec l’IDE Arduino.
Mon joystick au repos ne lit pas 512, est-ce un défaut ?
Non. La valeur de repos dépend de la mécanique et de la tension d’alimentation, et elle diffère d’un exemplaire à l’autre : 480 ou 545 sont des valeurs parfaitement normales. Ce qui compte est que la valeur soit stable manche lâché, et qu’elle traverse toute la plage quand vous poussez le manche d’un bord à l’autre. Un programme robuste lit la position de repos au démarrage et raisonne par rapport à elle.
Les deux axes sont inversés, ou le manche commande l’inverse de ce que je veux
Ce n’est pas un défaut du module non plus. L’ordre des broches dépend de la façon dont la carte est tournée sur votre montage, et un servomoteur peut être inversé en usine. Corrigez dans le programme : échangez les deux lectures analogRead(), ou remplacez map(x, 0, 1023, 0, 180) par map(x, 0, 1023, 180, 0).
Puis-je lire le joystick avec un ESP32 ou un Raspberry Pi ?
Oui. Sur un ESP32, alimentez le module en 3,3 V et utilisez deux canaux de l’ADC1, ses convertisseurs étant plus stables quand le Wi-Fi est actif. Sur un Raspberry Pi, qui n’a pas de convertisseur analogique intégré, il faut un circuit intermédiaire : seul le bouton SW peut se brancher directement sur une broche d’entrée.
Le bouton peut-il servir à autre chose qu’à remettre au centre ?
Oui, c’est un interrupteur comme un autre. On l’utilise couramment pour valider un choix dans un menu, changer de mode, déclencher une prise de photo ou armer un mouvement — tout ce qui mérite un appui franc et non un mouvement du manche.
À combiner avec
Ce module a besoin d’une carte pour être lu et de quoi se brancher. Si vous débutez, le KIT Starter contient déjà la carte Uno R3, la plaque d’essai, les fils et les servomoteurs : en y ajoutant ce joystick, vous avez le montage complet de cette page, sans rien commander d’autre. Pour les capteurs et actionneurs qui viendront ensuite, le montage reste le même — le joystick n’occupe que trois broches.











