Aujourd’hui on va apprendre à comment commander un servomoteur avec un arduino.
J’ai utilisé dans le tutoriel du westernduino une série de servo pour commander mes cibles, ici je vais aborder seulement le fonctionnement et le code à appliquer.
Ce qu’il faut savoir rapidement sur les servo c’est qu’il en existe de différentes sortes.
Ce qui fait bouger la position du servo c’est un moteur à l’intérieur suivi d’engrenages, ils peuvent être en plastiques ou métalliques.
Les servo ont un angle de rotation qui peut varier ici pour les servo que j’ai ils vont de 0° a 180°, il en existe en 360°.
Le voltage peut différer, ici je vais utiliser un servo 5v et un autre en 12v.Et autre caractéristique important pour les servo c’est le couple que dégage le servo exprimé en kilo par cm.
Pour les petits servo SG90 9g le couple est le plus souvent 1,5kg/cm donc plus vous allez loin sur l’axe du servo moins vous avez de force.
Si avec ce servo je suis à 5 cm du centre de l’axe je n’aurai que 1,5(kg) / 5 (cm) soit 0,3kg de force !
#include < Servo.h > #define PIN_POT A0 #define PIN_SERVO 8 #define PIN_SERVO1 9 Servo myservo; // create servo object to control a servo Servo myservo1; int pos = 0; // variable to store the servo position int val; // variable to store potentiometer void setup() { Serial.begin(9600); myservo.attach(PIN_SERVO); // attaches the servo on pin 9 to the servo object myservo1.attach(PIN_SERVO1); } void loop() { val = analogRead(PIN_POT); pos = map(val, 0, 1023, 0, 179); myservo.write(pos); // tell servo to go to position in variable 'pos' myservo1.write(pos); Serial.println(pos); delay(100); }
En matériel il nous faut :
– 1 arduino
– 1 régulateur de tension 5V L7805CV (option)
– 2 condensateurs 25v 10μF (option)
– 1 servomoteur 12V et ou 1 servomoteur 5V
– 1 potentiomètre 10kΩ ou autre
– 1 transformateur 12V (option)
Pour le branchement la grande majorité des servo ont 3 fils, le marron pour le négatif, le rouge pour le positif (ici 5v ou 12v), et un fil de commande en orange.
Je branche les fils de commande des servo, un sur le pin 8 de l’arduino et un sur le pin 9.
J’ai 1 source d’alimentation en 12v que je vais connecter sur un côté de la breadboard et je vais connecter mon servo 12v de ce côté. Je vais mettre un régulateur de tension 5V (L7805CV +2 condensateur 10uf 25v ) pour alimenter mon servo 5V.
Pour faire tourner mes servo dans la position que je souhaite pour notre test je vais utiliser un potentiomètre 10kΩ, pour le connecter je me branche sur le 5v d’un coté et au négatif de l’autre ( attention pas de 12v car vous pouvez griller votre arduino) et la borne du millieu du potentiomètre va être relié à la borne analogique de l’arduino A0. J’ai légèrement modifié mon montage en branchant le potentiomètre sur le 5V délivré par l’arduino au lieu du 5V du régulateur de tension car j’ai eu un résultat non voulu quand je tournai mon potentiomètre vers les 5V.
J’en ai fini avec le montage.
Maintenant comment programmer un servomoteur avec arduino ?
On appelle la librairie servo pour les commander plus facilement , je defini pin_pot en A0 car je vais récupérer la tension du potentiomètre par ce pin, puis les 2 pin pour les 2 servo.
Je crée 2 objets servo avec comme nom de variable monservo et monservo1, 2 entier int un pour la valeur du potentiomètre et un pour la position des servo.
Dans le setup je connecte mes servo à leurs pin avec attach( numéro du pin), pas besoin de définir le pin analogique en entrée ou sortie sachant que c’est obligatoirement un entrée.
Puis dans ma boucle je récupère la valeur au borne du pin A0 avec analogRead que je vais mapper avec la fonction map.
La fonction map ré-etalonne la valeur de source vers une autre fourchette de valeur ici dans
map(val, 0, 1023, 0, 180); sur le pin analogique je vais avoir une valeur entre 0 et 1023 ( 0 0V , 1023 5V ) et comme je ne peux pas réutiliser cette valeur car mon servo a une position entre 0° et 180° donc je retrouve 0,180.
Map va me donner en résultat une valeur entre 0 et 180 à l’étalonnage de ce qui rentre dans le pin A0
Puis j’applique la valeur de la position a mes servo avec write(pos);
J’ai rajouté un petit delay pour laisser le temps aux servo de se positionner et éviter de corriger la position trop souvent.
Mon servo SG90 9G tremble !
Les petits servo SG90 ne sont pas très fiable (ils vibrent a 0° ) et leurs positions 0° est souvent plus aux alentours des 15°, donc si tu utilises ses servo commence à 15° pour éviter des surprises par la suite.
Télécharger le code : Servomoteur
Petit Bonus !
Si tu souhaites utiliser tes servo dans un tableau voici le code à utiliser, c’est ce que j’ai utilisé dans Westernduino !
Servo monServo0;
Servo monServo1;
Servo monServo2;
Servo mesServos[]={monServo0,monServo1,monServo2};
J’en ai terminé avec les servo, cette série de tuto basé sur des éléments particulier en électronique va te permettre de créer ce que tu souhaites en assemblant toutes les briques que l’on aura abordé.
N’hésitez pas à poser vos questions sur les réseaux sociaux de la chaîne instagram , twitter , facebook ,youtube ; si vous ne comprenez pas certaines parties du tutoriel n’hésitez pas , me dire ce que vous aimeriez que je crée pour en faire des vidéos tutoriel et à partager les projets que vous aimeriez créer etc…
Comme toujours allez sur la page de C’est quoi Retro et Geek pour connaître tout ce que je recherche à faire sur la chaîne.
Merci les RetroGeeker et RetroGeekeuse