ESP32 S3 - Joystick - Servomoteur

Dans ce tutoriel, vous apprendrez à utiliser la carte ESP32 S3 avec un joystick pour contrôler deux servomoteurs ou un kit pan-tilt. En lisant les valeurs analogiques des axes X et Y du joystick, vous pouvez piloter précisément chaque servomoteur de manière indépendante pour un contrôle directionnel intuitif.

Un joystick possède deux potentiomètres intégrés disposés à angle droit (appelés axe X et axe Y), qui produisent des valeurs analogiques sur les broches VRX et VRY. Vous utiliserez ces valeurs analogiques pour contrôler deux servomoteurs indépendamment : la valeur X contrôle le servo n°1 et la valeur Y contrôle le servo n°2. Lorsqu'il est utilisé avec un kit pan-tilt, le mouvement combiné des deux servomoteurs crée un mouvement 3D fluide.

Ce que vous allez construire :

  1. Un système à double servomoteur contrôlé par joystick utilisant l'ESP32 S3
  2. Cas d'usage 1 : les servomoteurs tournent proportionnellement à la position du pouce sur le joystick et reviennent au centre au relâchement
  3. Cas d'usage 2 : le joystick commande les servomoteurs pas à pas dans quatre directions avec un bouton pour réinitialiser le centre
  4. Intégration optionnelle d'un kit pan-tilt pour le positionnement 3D d'une caméra ou d'un capteur

Matériel requis

1×ESP32 S3 WROOM N16R8
1×Alternativement: ESP32 S3 SuperMini Dev Module
1×Alternativement: ESP32 S3 Uno-form Board
1×Alternativement: ESP32 S3 Camera Board
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×Joystick
2×Servo-moteur
2×Optionnel: Kit pan-tilt avec servo-moteur
1×Plaque d'essai
1×Fils de connexion
1×Optionnel: Connecteur d'alimentation DC
1×Recommandé: Screw Terminal Expansion Board for ESP32 S3
1×Recommandé: Breakout Expansion Board for ESP32 S3
1×Recommandé: Power Splitter for ESP32 S3

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables ESP32 S3 (ESP32 S3 inclus)
1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Note d'achat: Si vous utilisez plusieurs servomoteurs, nous recommandons d'utiliser le PCA9685 16 Channel PWM Servo Driver Module pour économiser les broches du MCU et faciliter le câblage.

À propos du joystick et du servomoteur

Le joystick et le servomoteur sont des composants fondamentaux pour construire des projets de contrôle de mouvement avec l'ESP32 S3. Comprendre comment chaque composant fonctionne individuellement vous aidera à les combiner efficacement dans ce tutoriel.

Caractéristiques principales

Schéma de câblage

Connectez les broches VRX et VRY du joystick à deux broches GPIO compatibles ADC sur l'ESP32 S3, et connectez le fil de signal de chaque servomoteur à des broches GPIO compatibles PWM distinctes. Assurez-vous que les servomoteurs sont alimentés par une alimentation 5V adéquate, en utilisant une source d'alimentation externe si plusieurs servos sont connectés.

Notes de sécurité

Les servomoteurs peuvent consommer un courant important, surtout en charge. Alimentez toujours plusieurs servomoteurs depuis une alimentation externe 5V plutôt que depuis le régulateur 3,3V embarqué de l'ESP32 S3, pour éviter d'endommager la carte.

ESP32 S3 Joystick Servo Motor Wiring Diagram

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Un bornier à vis maintient chaque fil bien serré, même quand la carte bouge. Vous pouvez placer la carte ESP32 S3 sur une carte à bornier à vis pour ESP32 S3 et brancher les fils sur ses borniers à vis. Le câblage ne change pas. Les fils vont simplement aux borniers à vis, comme ci-dessous.

ESP32 S3 Joystick Servo Motor Wiring Diagram (Screw Terminal)

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Vous préférez des connecteurs à broches plutôt que des vis ? Branchez la carte ESP32 S3 sur une carte d'extension GPIO pour ESP32 S3 :

ESP32 S3 Joystick Servo Motor Wiring Diagram (GPIO Breakout Board)

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Code ESP32 S3

Code ESP32 S3 - Les servomoteurs tournent selon le mouvement du pouce sur le joystick

Le code suivant lit les valeurs analogiques X et Y du joystick et les fait correspondre directement aux angles des servomoteurs, afin que chaque servo suive la position du joystick en temps réel. Lorsque le pouce est relâché et revient au centre, les deux servomoteurs reviennent aussi automatiquement à la position centrale de 90 degrés.

/* * Ce code ESP32 S3 a été développé par newbiely.fr * Ce code ESP32 S3 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32-s3/esp32-s3-joystick-servo-motor */ /* * This ESP32-S3 code is created by esp32io.com * * This ESP32-S3 code is released in the public domain * * For more detail (instruction and wiring diagram), visit https://esp32io.com/tutorials/esp32-s3-joystick-servo-motor */ #include <ESP32Servo.h> #define VRX_PIN 5 // ESP32-S3 pin GPIO5 (ADC1) connected to VRX pin #define VRY_PIN 4 // ESP32-S3 pin GPIO4 (ADC1) connected to VRY pin #define SERVO_X_PIN 13 // ESP32-S3 pin GPIO13 connected to Servo motor 1 #define SERVO_Y_PIN 15 // ESP32-S3 pin GPIO15 connected to Servo motor 2 Servo xServo; // create servo object to control a servo 1 Servo yServo; // create servo object to control a servo 2 void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); xServo.attach(SERVO_X_PIN); yServo.attach(SERVO_Y_PIN); } void loop() { // read X and Y analog values int valueX = analogRead(VRX_PIN); int valueY = analogRead(VRY_PIN); int xAngle = map(valueX, 0, 4095, 0, 180); // scale it to the servo's angle (0 to 180) int yAngle = map(valueY, 0, 4095, 0, 180); // scale it to the servo's angle (0 to 180) xServo.write(xAngle); // rotate servo motor 1 yServo.write(yAngle); // rotate servo motor 2 // print data to Serial Monitor on Arduino IDE Serial.print("Joystick: "); Serial.print(valueX); Serial.print(", "); Serial.print(valueY); Serial.print(" => Servo Motor: "); Serial.print(xAngle); Serial.print("°, "); Serial.print(yAngle); Serial.println("°"); }

Étapes rapides

  1. Nouveau sur ESP32 S3 ? Terminez d'abord notre guide ESP32 S3 - Premiers pas.
  2. Connectez le joystick et les servomoteurs à la carte ESP32 S3 comme montré dans le schéma de câblage ci-dessus.
  3. Connectez la carte ESP32 S3 à votre PC via un câble USB Type-C.
  4. Ouvrez l'Arduino IDE sur votre PC.
  5. Sélectionnez la bonne carte ESP32 S3 et le bon port COM.
  6. Cliquez sur l'icône Libraries dans la barre latérale gauche de l'Arduino IDE.
  7. Tapez ESP32Servo dans la zone de recherche, puis recherchez la bibliothèque servo de Kevin Harrington, John K. Bennett.
  8. Cliquez sur le bouton Install pour installer la bibliothèque de servomoteur pour ESP32.
ESP32 S3 servo motor library
  1. Copiez le code ci-dessus et ouvrez-le avec l'Arduino IDE.
  2. Cliquez sur le bouton Upload dans l'Arduino IDE pour téléverser le code sur l'ESP32 S3.
Arduino IDE Upload Code
  1. Ouvrez le Serial Monitor.
  2. Poussez le joystick dans une direction.
  3. Observez la rotation du servomoteur.
  4. Regardez le résultat dans le Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
2026-01-15 10:23:41 -> X: 2048 | Y: 2048 | Servo1: 90° | Servo2: 90° 2026-01-15 10:23:42 -> X: 512 | Y: 3600 | Servo1: 22° | Servo2: 158° 2026-01-15 10:23:43 -> X: 3800 | Y: 800 | Servo1: 168° | Servo2: 35° 2026-01-15 10:23:44 -> X: 2048 | Y: 2048 | Servo1: 90° | Servo2: 90°
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Vous remarquerez peut-être que le servomoteur ne se déplace pas toujours de manière parfaitement proportionnelle au mouvement du joystick. Ce comportement n'est pas dû au joystick ni au servomoteur lui-même, mais plutôt aux caractéristiques de l'ADC de l'ESP32 S3. La fin de ce tutoriel explique pourquoi cela se produit.

Code ESP32 S3 - Utiliser le joystick pour commander les servomoteurs

Le code suivant utilise le joystick comme une entrée de commande directionnelle, déplaçant chaque servomoteur pas à pas dans la direction poussée plutôt que de suivre la position absolue du joystick. Appuyer sur le bouton du joystick réinitialise les deux servomoteurs à la position centrale de 90 degrés.

/* * Ce code ESP32 S3 a été développé par newbiely.fr * Ce code ESP32 S3 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32-s3/esp32-s3-joystick-servo-motor */ /* * This ESP32-S3 code is created by esp32io.com * * This ESP32-S3 code is released in the public domain * * For more detail (instruction and wiring diagram), visit https://esp32io.com/tutorials/esp32-s3-joystick-servo-motor */ #include <ESP32Servo.h> #include <ezButton.h> #define VRX_PIN 5 // ESP32-S3 pin GPIO5 (ADC1) connected to VRX pin #define VRY_PIN 4 // ESP32-S3 pin GPIO4 (ADC1) connected to VRY pin #define SW_PIN 42 // ESP32-S3 pin GPIO42 connected to SW pin #define SERVO_X_PIN 13 // ESP32-S3 pin GPIO13 connected to Servo motor 1 #define SERVO_Y_PIN 15 // ESP32-S3 pin GPIO15 connected to Servo motor 2 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define UPDATE_INTERVAL 100 // 100ms ezButton button(SW_PIN); Servo xServo; // create servo object to control a servo 1 Servo yServo; // create servo object to control a servo 2 int valueX = 0 ; // to store the X-axis value int valueY = 0 ; // to store the Y-axis value int xAngle = 90; // the center position of servo #1 int yAngle = 90; // the center position of servo #2 int command = COMMAND_NO; unsigned long lastUpdateTime = 0; void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); xServo.attach(SERVO_X_PIN); yServo.attach(SERVO_Y_PIN); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if (millis() - lastUpdateTime > UPDATE_INTERVAL) { lastUpdateTime = millis() ; // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS // print command to serial and process command if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); xAngle--; } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); xAngle++; } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); yAngle--; } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); yAngle++; } } if (button.isPressed()) { Serial.println("The button is pressed"); xAngle = 90; // the center position of servo #1 yAngle = 90; // the center position of servo #2 } xServo.write(xAngle); // rotate servo motor 1 yServo.write(yAngle); // rotate servo motor 2 // print data to Serial Monitor on Arduino IDE Serial.print("Servo Motor's Angle: "); Serial.print(xAngle); Serial.print("°, "); Serial.print(xAngle); Serial.println("°"); }

Étapes rapides

  1. Nouveau sur ESP32 S3 ? Terminez d'abord notre guide ESP32 S3 - Premiers pas.
  2. Cliquez sur l'icône Libraries dans la barre latérale gauche de l'Arduino IDE.
  3. Recherchez "ezButton", puis trouvez la bibliothèque de bouton par ArduinoGetStarted.com.
  4. Cliquez sur le bouton Install pour installer la bibliothèque ezButton.
  • Search for ezButton created by ArduinoGetStarted.com and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Library Manager
Type:
All
Topic:
All
ezButton by ArduinoGetStarted.com
Button library supports debounce, pressed/released events and the press counting. It is easy to use with multiple buttons. The library can be used for push-button, momentary switches, toggle switch, magnetic contact switch (door sensor)... It is designed for not only beginners but also experienced users. More info
1.0.6
INSTALL
Newbiely.ino
···
1 void setup() {
Output
Serial Monitor
Ln 1, Col 1
ESP32S3 Dev Module on COM15
1
  1. Copiez le code ci-dessus et ouvrez-le avec l'Arduino IDE.
  2. Cliquez sur le bouton Upload dans l'Arduino IDE pour téléverser le code sur l'ESP32 S3.
  3. Ouvrez le Serial Monitor.
  4. Poussez le joystick dans une direction.
  5. Observez la rotation pas à pas du servomoteur.
  6. Regardez le résultat dans le Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
2026-01-15 10:30:12 -> Command: LEFT | Servo1: 85° | Servo2: 90° 2026-01-15 10:30:13 -> Command: LEFT | Servo1: 80° | Servo2: 90° 2026-01-15 10:30:14 -> Command: UP | Servo1: 80° | Servo2: 95° 2026-01-15 10:30:15 -> Command: RESET | Servo1: 90° | Servo2: 90°
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Astuce pro : Ajustez la variable de taille de pas dans le code pour contrôler combien de degrés chaque servo se déplace par commande du joystick. Une taille de pas plus petite donne un contrôle plus fin, tandis qu'une taille de pas plus grande déplace le servo plus rapidement vers sa position cible.

Explication du code

Lisez l'explication ligne par ligne dans les lignes de commentaire du code source !

※ Note:

Ce tutoriel utilise la fonction analogRead() pour lire des valeurs depuis un ADC (convertisseur analogique-numérique) connecté à un joystick. L'ADC de l'ESP32 S3 convient aux projets qui n'ont PAS besoin d'une grande précision. Cependant, pour les projets qui nécessitent des mesures précises, veuillez noter :

  • L'ADC de l'ESP32 S3 n'est pas parfaitement précis et pourrait nécessiter un calibrage pour obtenir des résultats corrects. Chaque carte ESP32 S3 peut varier légèrement, vous pourriez donc avoir besoin de calibrer l'ADC pour chaque carte individuelle.
  • Le calibrage peut être difficile, en particulier pour les débutants, et ne donne pas toujours exactement les résultats que vous souhaitez.

Pour les projets nécessitant une haute précision, envisagez d'utiliser un ADC externe (par exemple ADS1115) avec l'ESP32 S3. Si vous voulez tout de même calibrer l'ADC de l'ESP32 S3, consultez le pilote de calibrage ADC ESP32

Applications

Les servomoteurs contrôlés par joystick sont utilisés dans une large gamme d'applications réelles, de la robotique aux systèmes de caméra et aux panneaux de contrôle industriels. Voici quelques exemples pratiques :

  1. Contrôle de bras robotique : Utilisez le joystick pour déplacer les articulations pan et tilt d'un bras robotique avec des mouvements de pouce intuitifs.
  2. Plateforme caméra pan-tilt : Montez une caméra sur un kit pan-tilt et utilisez le joystick pour la diriger à distance pour la surveillance ou la photographie.
  3. Direction de véhicule RC : Contrôlez le servo de direction et le servo d'accélération d'un véhicule télécommandé en utilisant un seul module joystick.
  4. Traqueur d'antenne : Dirigez automatiquement ou manuellement une antenne directionnelle en utilisant deux servomoteurs pilotés par l'entrée du joystick.
  5. Contrôle de nacelle de drone : Stabilisez et orientez une nacelle de caméra de drone en utilisant des commandes du joystick pendant le vol.

Vidéo

Regardez le tutoriel vidéo étape par étape pour ce projet ESP32 S3 ci-dessous.

Défis

Maintenant que vous avez les bases qui fonctionnent, essayez d'étendre le projet pour approfondir votre compréhension du contrôle des servos et du traitement de l'entrée du joystick.

  1. Débutant : Modifiez le code pour que les servomoteurs se déplacent plus lentement en réduisant la taille du pas, et ajoutez une sortie série affichant l'angle actuel de chaque servo après chaque commande.
  2. Intermédiaire : Ajoutez une zone morte à la position centrale du joystick afin que de petits mouvements accidentels ne déclenchent pas de commandes de servo, améliorant la stabilité du contrôle.
  3. Avancé : Construisez un support de caméra pan-tilt complet utilisant deux servomoteurs et le joystick, puis ajoutez un bouton-poussoir de bascule qui alterne entre le mode proportionnel et le mode commande pas à pas en temps réel.

Commentaires

Tutoriels connexes

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !