Commande de servo-moteur
MCHobby vous propose des servo-moteurs sur son WebShop. Voir la catégorie "Moteur & Robotique". Le moteur pack déjà présent ne restera pas seul bien longtemps :-) .
Qu'est ce qu'un servo-moteur?
Un servo-moteur est un type de moteur électrique. C'est un dispositif typiquement utilisé en modélisme pour, par exemple, contrôler la direction d'une voiture télécommandée.
Sur un servo-moteur, l'angle peu varier d'un angle fixe entre 0 et 180° en fonction du signal envoyé.
Un servo-moteur comprend :
Source: texte et image provenant de wikibot.
Comment commander un servo-moteur?
Le principe de base est assez simple. Il suffit d'envoyer une impulsion et c'est le temps que durera cette impulsion qui déterminera l'angle du servo-moteur.
ce temps d'impulsion est de quelques de quelques millisecondes et doit être répété à intervalle régulier (toutes les 20 ms à 50ms).
Si le temps d'impulsion varie d'un fabricant à l'autre, les valeurs suivantes sont assez standard:
Raccordement d'un servo-moteur
Puisque l'interface de commande est assez simple, un servo-moteur se raccorde avec seulement 3 fils (la masse, +5v et la commande par impulsion).
Les raccordements les plus standardisés sont:
Il est toujours possible de programmer soit même la commande d'impulsion mais cela serait fastidieux et demanderait une optimisation importante du programme.
Arduino dispose de la librairie Servo.h qui permet de prendre facilement le contrôle de deux servomoteurs (ou plus) sur les pin 9 et 10.
Erratum: contrairement à ce que j'avais compris, il est possible de commander des servo-moteurs à partir des autres pin d'Arduino. Le programme ci-dessous fonctionne parfaitement avec la pin 2.
Le contrôle se résume en quelques lignes de code.
Montage
Résultat
Programme
Source: servo.pde
Besoin de plus de deux Servos
Si vous avez besoin de commander plus de deux servo-moteurs, vous pouvez:
Qu'est ce qu'un servo-moteur?
Un servo-moteur est un type de moteur électrique. C'est un dispositif typiquement utilisé en modélisme pour, par exemple, contrôler la direction d'une voiture télécommandée.
Sur un servo-moteur, l'angle peu varier d'un angle fixe entre 0 et 180° en fonction du signal envoyé.
Un servo-moteur comprend :
- Un moteur électrique (continu), généralement assez petit.
- Des engrenages réducteur en sortie du ce moteur (pour avoir moins de vitesse et plus de couple ou de force).
- Un capteur type "potentiomètre" raccordé sur la sortie.
Il s'agit donc d'une résistance qui varie en fonction de l'angle, ce qui permet de mesurer l'angle de rotation sur l'axe de sortie. - Un asservissement électronique pour contrôler la position/rotatop, de cet axe de sortie pour le maintenir à la bonne position.
Source: texte et image provenant de wikibot.
Comment commander un servo-moteur?
Le principe de base est assez simple. Il suffit d'envoyer une impulsion et c'est le temps que durera cette impulsion qui déterminera l'angle du servo-moteur.
ce temps d'impulsion est de quelques de quelques millisecondes et doit être répété à intervalle régulier (toutes les 20 ms à 50ms).
Si le temps d'impulsion varie d'un fabricant à l'autre, les valeurs suivantes sont assez standard:
- 1.25 ms = 0 degré
- 1.50 ms = 90 degrés
- 1.75 ms = 180 degrés
Source: Area RC-Bot |
Raccordement d'un servo-moteur
Puisque l'interface de commande est assez simple, un servo-moteur se raccorde avec seulement 3 fils (la masse, +5v et la commande par impulsion).
Les raccordements les plus standardisés sont:
- Noir, Rouge, Blanc pour Masse, VCC 5v, commande
- Marrons, Rouge, Jaune pour Masse, VCC 5v, commande (modèles Graupner).
Il est toujours possible de programmer soit même la commande d'impulsion mais cela serait fastidieux et demanderait une optimisation importante du programme.
Arduino dispose de la librairie Servo.h qui permet de prendre facilement le contrôle de deux servomoteurs (ou plus) sur les pin 9 et 10.
Erratum: contrairement à ce que j'avais compris, il est possible de commander des servo-moteurs à partir des autres pin d'Arduino. Le programme ci-dessous fonctionne parfaitement avec la pin 2.
Le contrôle se résume en quelques lignes de code.
#include <Servo.h> void setup(){ // Attacher la pin 9 à l'objet servo. // ATTN: le code initialise l'angle à 90 degrés par défaut. monServo.attach(9); } void loop(){ // Assigne un angle de 53 degrés monServo.write( 53 ); delay( 2000 ); // Passer de 0 a 180 degrés par angle de 10 degrés for( int iAngle=0; iAngle<= 180; iAngle+=10 ) { monServo.write(iAngle); delay( 50 ); } }
Montage
Résultat
Programme
Source: servo.pde
/* * Commande d'un servo moteur en plusieurs séquences. * Clignotement de la Led onBoar: * - rapide en début de programme. * - lente en entre les séquences. * - fixe en fin de programme * * Commande servo à l'aide de servo.h et * seulement sur les pin 9 ou pin 10. * */ #include <Servo.h> Servo monServo; int pos = 0; const int pinLed = 13; // Led sur le board const long blinkTimeMs = 2000; // temps de clignotement de la led (2 sec) const int FAST = 50; // interval entre deux clignotement (rapide) const int SLOW = 150; // interval entre deux clignotement (lent) const int FIXED = -1; // valeur spécial pour éclairage continu void setup(){ pinMode( pinLed, OUTPUT ); // Attacher la pin 9 à l'objet servo. // ATTN: le code initialise l'angle à 90 degrés par défaut. monServo.attach(9); // remettre l'angle à 0 degrés monServo.write( 0 ); } void loop(){ // Faire clignoter led 13 sur le board. // Démarrage de séquence --> clignotement rapide blinkBoardLed( FAST ); // Passer de 0 a 180° par angle de 10 degré for( int iAngle=0; iAngle<= 180; iAngle+=10 ) { monServo.write(iAngle); delay( 250 ); } // Clignotement lent entre deux séquences blinkBoardLed( SLOW ); // Angle décroissant progressif for( int iAngle = 180; iAngle>=0; iAngle-- ) { monServo.write( iAngle ); delay( 10 ); } // Clignotement lent entre deux séquences blinkBoardLed( SLOW ); // Angle arbitraire de 45 degrés monServo.write( 45 ); // Find de séquence -> eclairage fixe blinkBoardLed( FIXED ); } /* Fait clignoter la led 13 sur le board pendant 2 secondes * * interval: Interval de clignotement. -1 pour fixe. */ void blinkBoardLed( int interval ){ long startMillis = millis(); // temps que pas 2 sec d'écoulée while( (millis() - startMillis) < blinkTimeMs ) { switch( interval ){ case -1 : // Cas spécial, allumage fixe digitalWrite( pinLed, HIGH ); delay( blinkTimeMs ); // attendre le temps total digitalWrite( pinLed, LOW ); break; default: // faire clignoter digitalWrite( pinLed, HIGH ); delay( interval ); digitalWrite( pinLed, LOW ); delay( interval ); } // eof Case } // eof While }
Besoin de plus de deux Servos
Si vous avez besoin de commander plus de deux servo-moteurs, vous pouvez:
- Utiliser d'autres Pin Arduino pour contrôler des servo-moteurs puisque toutes les pins peuvent être utilisées pour commander des servo.
- Utiliser un autre Arduino (et la connexion série) pour construire un "Contrôleur de Servo-moteur", ainsi, votre Arduino principal dispose encore de toutes ces pins pour d'autres contrôles acquisitions :-)
- considérer l'acquisition d'un "Motor Shield" (description sur le site ladyada.net)... qui offre une commande pour deux servo-moteurs.
- S'inspirer des articles suivants pour programmer un contrôleur de servo-moteurs (jusque 8) à l'aide d'un pic.
Écrire un commentaire