Pour commander un servomoteur, il faut lui envoyer un train d'impulsions électriques. Les caractéristiques de ce train d'impulsions sont les suivantes :
Ce signal modulant la largeur des impulsions se note PWM en anglais (Pulse Width Modulation) et MLI en français (Modulation de Largeur d'Impulsions).
Une erreur de câblage... risque de détruire la carte Arduino.
En théorie :
En pratique :
Si le servomoteur vibre, c'est que la valeur de commande n'est pas adaptée. Il faut alors débrancher l'alimentation puis apporter une modification.
Bien de l'utilisation de la bibliothèque Servo ne soit pas indispensable, elle est bien pratique car elle simplifie l'écriture du code. L'exemple ci-dessous permet d'obtenir un aller et retour répétitif.
#include <Servo.h> // on importe la bibliothèque Servo int pinServo=8; // variable pour stocker le numéro du connecteur Servo leServo; // on crée l’objet leServo issu de la classe Servo void setup() { leServo.attach(pinServo); // la commande du servomoteur est reliée à son connecteur } void loop() { leServo.write(20); // axe du servomoteur mis à la position -50° delay(2000); // on attend que la position angulaire soit atteinte leServo.write(170); // position angulaire à 50° delay(2000); // nouvelle attente }
Il est possible de ralentir la vitesse angulaire de l'axe du servomoteur, à l'aide d'une boucle et de la fonction delay().
for (int i=0;i<180;i+=1) { leServo.write(i); delay(20); }
L'utilisation de bibliothèques présente quelques inconvénients :
Il est donc toujours utile de savoir s'en passer.
int pinServo=8; void placer(int angle) { // angle allant de 0 à 180 int periode=20000; // en microsecondes int impulsion=(int)(5.55*angle+1000); digitalWrite(pinServo,LOW); for (int t=0;t<80;t++) { // boucle laissant au servo le temps d'atteindre sa position digitalWrite(pinServo,HIGH); delayMicroseconds(impulsion); digitalWrite(pinServo,LOW); delayMicroseconds(periode-impulsion); } } void setup() { pinMode(pinServo, OUTPUT); } void loop() { placer(20); // position angulaire à -50° delay(2000); placer(170); // position angulaire à 50° delay(2000); }
La fonction map() modifie la plage de variation d’une variable. Ainsi, on aurait pu écrire :
int impulsion=map(angle, 0, 180, 1000, 2000);
Un servomoteur à rotation continue, ou servomoteur treuil, se commande de la même manière qu'un servomoteur classique : Le signal de commande est un train d'impulsions.
La durée d'une impulsion est comprise entre 1 ms et 2 ms environ, les valeurs limites variant d'un servomoteur à l'autre. Pour un servomoteur à rotation continue, on emploie de préférence la méthode writeMicroseconds(). Elle définit directement la largeur des impulsions, en microsecondes.
#include <Servo.h> Servo leServo; void setup() { leServo.attach(8); } void loop() { leServo.writeMicroseconds(1550); // rotation dans un sens delay(2000); leServo.writeMicroseconds(1500); // stop delay(1000); leServo.writeMicroseconds(1450); // rotation dans l'autre sens delay(2000); leServo.writeMicroseconds(1500); // stop delay(1000); }