Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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

Schéma interne 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.

relation largeur impulsion et angle de rotation servo

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 :

Correspondance des broches

ESP32

Couleur du fil

Servomoteur SG90

GND

Marron

GND

5V ou 3V3

Rouge

5V

GPIO22

Orange

Signal PWM

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

Câblage du servo SG90 et esp32 wroom

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

Servomoteur ESP32 Micro Python tutoriel

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 Arduino ide

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ôle du servo SG90 avec ESP32

Contrôle du servo SG90 avec l’ESP32

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.