Meilleur deal à : aliexpress.com
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.
Sommaire
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 ?
[Total: 2 Moyenne: 4]