Utiliser un servomoteur avec une ESP32 en langage Arduino
(Mis à jour le 04/01/2023)
Les servomoteurs, souvent abrégés en « servo », sont une forme particulière de moteurs qui peuvent être fixés à une position angulaire précise et la maintenir jusqu’à ce qu’une nouvelle instruction soit donnée. Le populaire servo bleu SG90 de TowerPro a un couple de 1,5 kg/cm pour seulement 9g. Son faible coût et sa facilité à être commandé depuis un ESP32 en font un choix très populaire pour les makers !
Note
Les servos sont très couramment utilisés dans le modélisme, la robotique et l’industrie.
Prendre en main le servomoteur SG90
Contrairement à un moteur classique, la plupart des servomoteurs basiques peuvent tourner uniquement entre 0 et + 180 degrés. Ils sont composés d’un moteur CC, de différents engrenages pour augmenter le couple (et réduire la vitesse) ainsi que d’un système d’asservissement, le tout empaqueté dans un boîtier très petit.
Avertissement
La butée en plastique du servomoteur qui limite la rotation est relativement fragile. Je vous conseille de ne pas tourner manuellement l’axe du servomoteur pour éviter de forcer en butée.
Fonctionnement d’un servomoteur

Ce servomoteur peut être contrôlé en utilisant un signal modulé en largeur d’impulsion (PWM) de 50 Hz, qui produit une impulsion toutes les 20ms. On peut ajuster la position du servomoteur en modifiant la durée des impulsions, entre 1ms et 2ms.
Note
On commande la position d’un servomoteur uniquement avec un signal PWM !
Comment alimenter le servomoteur avec un ESP32
Selon la fiche technique du servomoteur SG90, la tension optimale est de 5V. Cependant, il marche aussi en 3.3V (au ralenti).
Note
Je vous conseille d’utiliser 5V (même si l’exemple est avec 3.3V) pour avoir un servo plus réactif !
Les servomoteurs consomment beaucoup d’énergie, en particulier lorsqu’ils sont soumis à un couple important. Étant donné que la broche 5V
de la plupart des cartes ESP32 est alimentée directement par le bus USB, l’ordinateur limitera vers 500mA. Avec 1 ou 2 servomoteurs de branchés l’alimentation de l’USB devrait tenir la charge.
Une fois que vous dépassez 2 servomoteurs, il est préférable d’utiliser une alimentation distincte. Assurez-vous de connecter une broche GND
de la carte à la borne négative de l’alimentation du servomoteur.
Avertissement
Sur les cartes ESP32 d’uPesy, le fusible auto-réarmable pourrait se déclencher si le courant est trop élevé.
Brancher le SG90 sur un ESP32
Un servomoteur SG90 contient 3 fils : 2 pour l’alimentation et 1 pour le signal de commande en PWM. Les couleurs des fils permettent de les différencier :
ESP32 |
Couleur du fil |
Servomoteur SG90 |
---|---|---|
|
Marron |
|
|
Rouge |
|
|
Orange |
Signal |
Note
Sur certaines versions de servomoteur, la couleur du fil PWM
est jaune ou blanche à la place d’orange.
Toutes les broches de sortie de l’ESP32 peuvent être employées pour contrôler le servomoteur. On peut avoir 16 sorties PWM
complètement indépendantes sur l’ESP32, soit le contrôle de 16 servomoteurs ! Ça devrait aller 😊
Circuit pour piloter un servomoteur avec une ESP32

Voici un exemple sur breadboard avec la carte uPesy ESP32 Wroom DevKit, où le servo est alimenté en 3.3V.

Piloter un servomoteur depuis l’ESP32 avec du code Arduino
On pourrait se dispenser d’utiliser des librairies pour piloter les servomoteurs, mais pourquoi vouloir réinventer la roue quand il existe des librairies bien faites et largement utilisées ?
Je vous propose 2 librairies différentes qui fonctionnent correctement sur l’ESP32 :
ESP32Servo qui fonctionne exactement que la librairie
Servo
pour une carte Arduino. Utiliser celle-là si vous avez déjà beaucoup de code Arduino que vous voudriez réutiliser tel quel avec une carte ESP32.ESP32-ESP32S2-AnalogWrite est une librairie qui permet d’utiliser toutes les fonctionnalités offertes par les cartes ESP32 au niveau du PWM, avec un support pratique pour piloter les servos. Elle fonctionne aussi avec les modèles ESP32 plus récents (ESP32S2, ESP32C3…)
Elles sont toutes les 2 disponibles depuis l’installeur intégré dans l’Arduino IDE (Outils → Gérer les bibliothèques ) . Voici la procédure pour la librairie ESP32Servo
:

Installation de la librairie ESP32Servo depuis l’Arduino IDE
Piloter le servo avec la librairie ESP32Servo
en code Arduino
Une fois la librairie installée on utilise le code suivant pour piloter le SG90 de 0° à 180° avec l’ESP32.
#include <ESP32Servo.h>
#define PIN_SG90 22 // Broche de sortie utilisée
Servo sg90;
void setup() {
sg90.setPeriodHertz(50); // Fréquence PWM pour le SG90
sg90.attach(PIN_SG90, 500, 2400); // Largeur minimale et maximale de l'impulsion (en µs) pour aller de 0° à 180°
}
void loop() {
// Rotation de 0 à 180°
for (int pos = 0; pos <= 180; pos += 1) {
sg90.write(pos);
delay(10);
}
// Rotation de 180° à 0°
for (int pos = 180; pos >= 0; pos -= 1) {
sg90.write(pos);
delay(10);
}
}
Voici une vidéo de démonstration avec le code ci-dessus :

Contrôler le servo avec la librairie Arduino ESP32-ESP32S2-AnalogWrite
Le code est très similaire avec l’autre librairie.
Avertissement
Même si la librairie s’appelle ESP32-ESP32S2-AnalogWrite
, il faut importer l’header pwmWrite.h
.
#include <pwmWrite.h>
#define PIN_SG90 22 // Broche de sortie utilisée
Pwm pwm = Pwm();
void setup() {
}
void loop() {
// Rotation de 0 à 180°
for (int pos = 0; pos <= 180; pos++) { // go from 0-180 degrees
pwm.writeServo(PIN_SG90, pos);
delay(10);
}
// Rotation de 180° à 0°
for (int pos = 180; pos >= 0; pos--) {
pwm.writeServo(PIN_SG90, pos);
delay(10);
}
}
Note
Cette librairie est très puissante pour l’ESP32 et permet de configurer pas mal de choses basses niveau. Je vous invite à lire la documentation de celle-ci pour voir l’étendue de ses possibilités.