Un servomoteur pour applications hobby a trois fils: une masse (brun), une alimentation positive (rouge) et un fil de commande (orange). Le protocole de commande est un protocole série très simple. Le signal est composé d'impulsions positives dont la durée détermine la position du servo. Avec une impulsion de 1500µs le moteur se met en position médiane, avec une impulsion de 1000µs il se met complètement à gauche et avec une impulsion de 2000µs il se met à droite. La durée peut être différente avec certains servos. Les valeurs extrèmes sont de 544 et 2400µs par défaut dans la librairie.
La fréquence de répétition des impulsions est de 20ms, mais la fréquence ne doit pas être exactement définie: en pratique une période de 10 à 25ms est acceptable. Le moteur ne tient pas compte du rapport cyclique mais uniquement de la durée de l'impulsion positive. Il faut envoyer un nombre minimum d'impulsions, en pratique il faut 5 impulsions pour faire déplacer le moteur d'un degré. Quand il n'y a plus d'impulsions, le moteur stoppe.
L'interface de programmation dispose de routines pour commander le servomoteur, mais cela n'est pas strictement nécessaire. Le protocole est tellement simple qu'il est possible de commander directement le moteur avec quelques instructions élémentaires. Il en va d'ailleurs de même avec le protocole sériel RS-232: on peut soit utiliser les routines standard, soit coder soi-même l'envoi des caractères.
Sur l'oscilloscope on voit bien 5 impulsions: la période fait 20.03ms et l'impulsion 1.664ms. La tension varie entre 0 et 5V. Ces impulsions sont générées par quelques instructions en C, il ne faut même pas faire appel à la librairie servo.h.
Un exemple tout simple: le servomoteur est commandé à partir d'un potentiomètre. Le signal du potentiomètre de 0 à 5V est envoyé à une entrée analogique. Le code transforme la tension en un délais. Dans le cas de ce moteur précis, il faut un délais qui va de 500µs à 2500µs pour déplacer le moteur d'un extrème à l'autre. Les impulsions sont répétées tant qu'il y a une variation de la tension à l'entrée.
Il est recommandé d'alimenter le servomoteur avec une alimentation séparée car l'appel de courant du moteur est assez fort, ce qui fait chuter la tension d'alimentation du potentiomètre. Le moteur risque ainsi d'osciller entre deux positions. Les moteurs sont normalement conçus pour être alimentés avec des accus NiCd, la tension peut aller de 4.8 à 7.4V.
Voici le code pour transmettre la position d'un potentiomètre au servomoteur:
a = analogRead(0) * 2;
if (abs(b - a) > 5) {
b = a;
for (i = 0; i < 5; i++) {
digitalWrite(13, 1);
delayMicroseconds(500 + a);
digitalWrite(13, 0);
delayMicroseconds(2500 - a);
delay(15);
}
}
Le code est tellement simple qu'il ne faut même pas faire appel à la librairie. La seconde instruction delayMicroseconds permet d'avoir une période constante indémendamment de la durée de l'impulsion. Cette instruction n'est en pratique pas nécessaire.
Pour avoir un déplacement souple on peut adapter le temps de l'impulsion par paliers d'une microseconde et terminer la boucle quand le délai correspond à la valeur finale.
La librairie est plus précise (elle utilise des interrupts) mais d'un autre coté ces mêmes interrupts peuvent dérégler le fonctionnement de certaines autres fonctions (par exemple si vous utilisez également la librairie softwareSerial). Si vous utilisez les deux librairies il faut attendre que tout le texte soit transmis avant d'appeller la librairie pour commander le servo et débrancher le servo quand vous ne l'utilisee plus (detach).
La précision plus grande de la librairie n'est pas absolument nécessaire, la précision du servo est inférieure à un degré. Deux servos identiques vont se positionner légèrement différemment avec une même impulsion. Le servo montré sur la première photo est puissant mais très peu précis. Si la différence de temps est faible, le moteur ne se déplace même pas.
|