Comment piloter un servomoteur avec un Arduino et la librairie servo.h, code Arduino compatible ESP8266 et ESP32 • Domotique et objets connectés à faire soi-même

Vous aurez certainement besoin d’utiliser des servomoteurs dans bon nombre de vos projets Arduino (ou Raspberry). Il existe trois grandes familles de servomoteurs : positionnement angulaire, rotation continue, déplacement linéaire. Cet article ne traite que des servomoteurs de positionnement angulaire.

Tutoriel actualisé le 26 mai 2020

Les servomoteurs à déplacement linéaire (par exemple ceux que vous pourrez récupérer en recyclant un lecteur de DVD) fait l’objet d’un article dédié car ils sont gérés par la même librairie que les moteurs pas à pas.

Quel servo-moteur choisir ?

Vous pouvez débuter avec un SG90, un servo-moteur miniature très économique. Idéal pour petits projets en carton, vous serez très rapidement limité dans vos projets. Lisez ce guide pour choisir un modèle offrant un couple supérieur.

La librairie Servo.h

Pour piloter vos servomoteurs, vous aurez besoin de la librairie servo.h qui fait partie des librairies de base de l’environnement Arduino. Parmi les fonctions proposées par la librairie servo.h, deux sont les plus utilisées :

  • attach(pin) : permet d’attacher le servomoteur au Pin d’asservissement
  • write(angle) : envoi le servo à l’angle spécifié

Ces quatre autres fonctions pourront être utiles pour gérer plus finement les servomoteurs

  • writeMicroseconds(us) : permet d’ajuster les positions limites si votre servomoteur n’est pas standard.
  • read(pin) : permet de lire l’angle sur lequel est actuellement positionné le servo
  • attached(pin) : permet de savoir sur un servomoteur est attaché au Pin spécifié
  • detach(pin) : pour détacher votre servomoteur du Pin spécifié.

La librairie servo.h supporte jusqu’à 12 servomoteurs. Sachez toutefois que l’utilisation de servos entraîne des limitations sur votre Arduino. En effet, sur les cartes autres que la Mega, il n’est plus possible d’écrite avec l’instruction analogWrite() sur les broches 9 et 10 (même s’il n’y a aucun servo de branché dessus). Si votre projet nécessite plus de 12 servos, il faudra passer à l’Arduino Mega qui permet d’en piloter jusqu’à 48. Sur la Mega, à partir du 13ème servo, les impulsions PWM seront désactivées sur les broches 11 et 13.

Utiliser un servomoteur de positionnement angulaire sur un Arduino

Les servomoteurs de positionnement angulaire permettent de déplacer précisément un objet dans une plage de 0° à 180° (le plus courant). Le branchement est presque toujours le même et se fera à l’aide de 3 fils dont voici les principales couleurs que vous pourrez rencontrer :

  • Rouge : alimentation +5V.
  • Noir ou marron : commun à relier au Pin GND de la carte de développement (Arduino, ESP32, ESP8266)
  • Orange, jaune ou blanc : signal de positionnement envoyé par l’Arduino.

Circuit

Connectez les trois broches du servomoteur à l’Arduino en suivant le schéma de câblage suivant :

Servomoteur Arduino ESP8266 ESP32
VCC 5V 5V 3V3
GND GND GND GND
jaune ou blanc 6 D4 D4

Si vous n’utiliser pas d’ESP32 vous pouvez directement passer à l’étape “Programme de test va-et-vient”

Installation du Framework ESP-IDF pour ESP32 sur l’IDE Arduino

Si vous utiliser un ESP32 pensez à ajouter le Framework ESP-IDF pour ESP32 sur l’IDE Arduino. Si ce n’est pas fait, je vous invite à suivre ce tutoriel qui explique en détail les différentes étapes à suivre :

Installation de la librairie Servo.h pour ESP32

On ne peut pas utiliser la librairie Servo.h sur un ESP32, c’est pourquoi la fondation Arduino a développée une autre librairie aussi appelée Servo.h pour ESP32 qui est une adaptation de la librairie Servo.h pour Arduino, elle a donc les mêmes fonctionnalités.

La librairie Servo.h pour ESP32 ne fait pas partie des librairies de base de l’environnement Arduino, il faut donc l’installer depuis le gestionnaire de librairies.

Voici les différentes étapes à suivre pour installer la librairie Servo.h pour ESP32

1Démarrez l’IDE Arduino

2Ouvrez le gestionnaire de librairies en suivant le chemin  Croquis > Inclure une bibliothèque > Gérer les bibliothèques

3Entrez dans la barre de recherche “Servo esp32”

4Sélectionnez la librairie ESP32 by Kevin Harrington, John K. Bennett et appuyez sur le bouton Installer

Attention de ne pas confondre la librairie ESP32Servo (celle que nous utilisons dans ce tutoriel) et la librairie ServoESP32.

5 Fermez le gestionnaire de librairies

Pour vérifier que votre librairie et bien installée, aller dans Fichier > Examples. Si la librairie est correctement installée, vous devriez voir ESP32Servo dans la liste dans la liste des exemples.

Programme de test va-et-vient

Ce programme est une adaptation de l’exemple installé avec la librairie développée par la fondation Arduino. Il permet de tester rapidement le servomoteur en faisant balayage angulaire dans un sens puis dans l’autre.

/* 
 Programme de test pour servomoteur de positionnement angulaire 
 Traduction en français, ajout de variables
 Code original de BARRAGAN 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include 

Servo myservo;  // création de l'objet myservo 

int pin_servo = 6;       // Pin 6 sur lequel est branché le servo sur l'Arduino si vous utilisez un ESP32 remplacez le 6 par 4 et si vous utilisez un ESP8266 remplacez le 6 par 2

int pos = 0;             // variable permettant de conserver la position du servo
int angle_initial = 0;   //angle initial
int angle_final = 180;   //angle final
int increment = 1;       //incrément entre chaque position
bool angle_actuel = false;//Envoi sur le port série la position courante du servomoteur

void setup() {
  Serial.begin(9600);                       
  while(!Serial){;} 
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  
}

void loop() {
  for (pos = angle_initial; pos = angle_initial; pos -= increment) { // Fait le chemin inverse
    myservo.write(pos);              
    delay(30);   
    if (angle_actuel) {
        Serial.println(myservo.read());
    }
  }
}

Voici également un petit programme de test pour déplacer votre servo à une position souhaitée.

/* 
 Programme de test pour servomoteur de positionnement angulaire 
 Traduction en français, ajout de variables
 Code original de BARRAGAN 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include 

Servo myservo;           // création de l'objet myservo 

int pin_servo = 6;       // Pin 6 sur lequel est branché le servo sur l'Arduino si vous utilisez un ESP32 remplacez le 6 par 4 et si vous utilisez un ESP8266 remplacez le 6 par 2
int position = 40;       // Position souhaitée

void setup() {
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  myservo.write(position);
}

void loop() {}

Piloter un servomoteur à l’aide d’un potentiomètre

Par terminer cet article, voici un petit montage et son programme pour piloter la position d’un servomoteur à l’aide d’un potentiomètre 10 KΩ.

Matériel nécessaire

Pour réaliser ce montage vous aurez besoin :

Tout le matériel nécessaire est disponible dans le Starter Kit Arduino.

Circuit

Il suffit d’ajouter le potentiomètre au montage précédent en suivant le schéma de câblage suivant.

Arduino ESP8266 ESP32
Servomoteur      
VCC 5V 5V 3V3
GND GND GND GND
jaune ou blanc 6 D4 D4
Potentiomètre  A0 A0 D35

Il est possible de connaître à n’importe quel moment la position du servomoteur en activant la variable angle_actuel à True. Téléversez puis ouvrez le moniteur du port série.

/*
 Controler la position d'un servomoteur à l'aide d'un potentiomètre
 Traduction en français, ajout de variables de configuration
 Code original de BARRAGAN 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob
 
 www.projetsdiy.fr - 19/02/2016
 public domain

*/

#include 

Servo myservo;      // création de l'objet myservo 

int potpin = 0;     // Entrée analogique sur lequel est connecté le potentiomètre si vous utilisé un ESP32 remplacez le 0 par 35
int val;            // Variable contenant la valeur courante du potentiomètre 
int pin_servo = 6;       // Pin 6 sur lequel est branché le servo sur l'Arduino si vous utilisez un ESP32 ou un ESP8266 remplacez le 6 par 4
bool angle_actuel = false;// Envoi sur le port série la position courante du servomoteur


void setup() {
  Serial.begin(9600);       // Ouvre le port série                   
  while(!Serial){;}     
  myservo.attach(pin_servo);// attache le servo au pin spécifié sur l'objet myservo
}

void loop() {
  val = analogRead(potpin);            // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  val = map(val, 0, 1023, 0, 180);     // Mise à l'échelle pour renvoyer la position entre 0 et 180°
//Si vous utilisez un ESP32:
//val = map(val, 0, 4095, 0, 180); 
  myservo.write(val);                  // Déplace le servo à la position spécifiée
                             
  if (angle_actuel) {
      Serial.print("Angle demande : ");
      Serial.print(val);
      Serial.print(" | Position reelle : ");
      Serial.println(myservo.read());
      delay(200);                       // Attend 200ms en mode debug
  } else {
    delay(15);                          // Attend 15ms
  }
}

Avez-vous aimé cet article ?