Piloter un servomoteur avec la librairie servo.h. Code Arduino compatible ESP8266 et ESP32

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur email
Partager sur telegram

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.

A LIRE AUSSI :
Servomoteur Tower Pro MG 996R - S3003 38G - DS3218 - SG90. Quel modèle choisir ?

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.
Attention, les servomoteurs sont gourmands en énergie. Si vous en avez besoin de plusieurs pour votre projet, l’alimentation du port USB peut ne pas être suffisant, vous devrez ajouter une alimentation externe.

Circuit

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

ServomoteurArduinoESP8266ESP32
VCC5V5V3V3
GNDGNDGNDGND
jaune ou blanc6D4D4

circuit pour servo moteur et arduino uno

circuit ESP8266 + servomoteur

montage servomoteur et ESP32Si 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 :

A LIRE AUSSI :
ESP-IDF, débuter avec le SDK pour ESP32 sur IDE Arduino (macOS, Windows, Linux)

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

ouverture gesionnaire de librairies

 

3Entrez dans la barre de recherche “Servo esp32”

recherche librairie Servo ESP32 sur le gestionnaire de librairies de l'IDE Arduino

 

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.

installation de la librairie ESP32Servo

5 Fermez le gestionnaire de librairies

fermeture gestionnaire de librairiePour 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.

liste exemple ide arduino pour la librairie ESP32Servo

 

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.

Attention, la désignation des broches est différente sur un ESP8266. Par exemple la broche D4 correspond à la broche 2 sur un Arduino. N’oubliez pas de modifier la valeur pin_servo à 2 dans le code avant de téléverser
A LIRE AUSSI :
Débuter avec l'ESP8266 et l'IDE Arduino. Librairies, GPIO, programmation Web Serveur, Client Web, drivers
Attention, si vous utilisez un ESP32 le servo moteur est branché sur le pin 4 donc n’oubliez pas de modifier la valeur de la variable pin_servo à 4 dans le code avant de téléverser
/* 
 Programme de test pour servomoteur de positionnement angulaire 
 Traduction en français, ajout de variables
 Code original de BARRAGAN <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include <Servo.h>

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_final; pos += increment) { // Déplace le servo de 0 à 180 degréespar pas de 1 degrée 
    myservo.write(pos);              // Demande au servo de se déplacer à cette position angulaire
    delay(30);                       // Attend 30ms entre chaque changement de position
    if (angle_actuel) {
        Serial.println(myservo.read());
    }
  }
  for (pos = angle_final; 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 <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include <Servo.h>

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.

ArduinoESP8266ESP32
Servomoteur   
VCC5V5V3V3
GNDGNDGNDGND
jaune ou blanc6D4D4
Potentiomètre A0A0D35

 

 

circuit pour programme 2 avec un servomoteur et un arduino unocircuit pour controler un servomoteur avec un esp8266 et un poteniometre circuit esp32 avec un potentiomètre un un servomoteur

Attention, la désignation des broches est différente sur un ESP8266. Par exemple la broche D4 correspond à la broche 2 sur un Arduino. N’oubliez pas de modifier la valeur pin_servo dans le code avec de téléverser
A LIRE AUSSI :
Débuter avec l'ESP8266 et l'IDE Arduino. Librairies, GPIO, programmation Web Serveur, Client Web, drivers
Attention, si vous utilisez un ESP32 le servo moteur est branché sur le pin 4 donc n’oubliez pas de modifier la valeur de la variable pin_servo à 4 dans le code avant de téléverser. De plus, les broches d’éntrées analogiques de l’ESP32 ont une résolution de 12 bits donc pensez à modifier la ligne 30 par map(val, 0, 4095, 0, 180); car lorsque vous lisez une entrée analogique, sa plage peut varier de 0 à 4095.

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 <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob
 
 www.projetsdiy.fr - 19/02/2016
 public domain

*/

#include <Servo.h>

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 ?
[Total: 1 Moyenne: 3]
Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur email
Partager sur telegram

Vous avez aimé ce projet ? Ne manquez plus aucun projet en vous abonnant à notre lettre d’information hebdomadaire!

Ressources utiles
quel modèle esp8266 choisir
Quel modèle d'ESP8266EX choisir en 2020 ?
guide choix esp32 development board
Quel ESP32 choisir en 2020 ?
2 Commentaires
  1. Bonjour,
    Merci pour votre tuto, c’est très clair et le débutant que je suis a réussi à faire le montage. J’ai le projet de réaliser un shutter pour vidéoprojecteur avec un servo piloté par un potentiomètre. Tout marche mais j’ai une question par rapport à la longueur de câble possible. J’ai testé un montage avec 5 m de câble XLR entre l’Arduino et le Servo mais ça ne marche pas, j’imagine à cause d’une perte de tension sur cette longueur. Est ce qu’il existe une solution pour avoir une telle distance entre l’Arduino et le servo en restant en filaire ?
    Merci !

    • Bonjour et merci beaucoup. Je n’ai malheureusement pas de réponse technique à votre question. Serait il possible de rapprocher l’électronique de commande en passant à du WiFi et migrer vers un ESP32 ou ESP8266 ?

    Laisser un commentaire

    Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

    Domotique et objets connectés à faire soi-même