<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte



 Introduction : Qu'est-ce qu'un servo-moteur ?
Un servo-moteur est un dispositif typiquement utilisé en modélisme pour, par exemple, contrôler la direction d'une voiture télécommandée.
Il comprend :
  • Un moteur électrique (continu), généralement assez petit.
  • Une réduction en sortie de ce moteur pour avoir moins de vitesse et plus de puissance.
  • Un capteur : un potentiomètre qui induit une résistance variable en fonction de l'angle de l'axe de sortie.
  • Un asservissement électronique pour contrôler la position de cet axe de sortie.
L'utilisateur envoit à chaque instant un signal modulé qui représente un angle.
Le servo tourne vers cet angle et s'y maintient.

Un servo et ses accessoires

Les test ont étés réalisés ici avec un modèle Graupner C512, trouvé à 50Fr chez Eole (70 bd Saint Germain, Paris). Bien sûr, il existe beaucoup de servos différents qu'on peut trouver ici ou ailleurs...


La commande du servo-moteur
Un connecteur à trois fils permet de commander un servo-moteur. Bien sûr, il y a la masse et le +5V (à peu près).
Ces deux fils sont en général noir et rouge, mais ils sont marrons et rouge pour les modèles Graupner. Le 3ème fil est le fil de commande. Il est normalement blanc, mais jaune dans le cas des Graupner.

On pourrait dire hativement qu'il faut fournir un PWM comme signal de commande, mais ce n'est pas le cas :
  • Le PWM ( Pulse-width modulation, Modulation en largeur d'impulsion) est un signal dont le taux de modulation varie de 0 à 100% (TM=Ton/Tperiode).
  • Pour un servo on parle de Signal-code modulated signal (Signal modulé en code d'impulsion ) où seule l'impulsion compte, pas la fréquence (en théorie).
En clair, il faut fournir au servo une impulsion à 1 (suivie d'un retour à 0). Et le servo va prendre en compte la largeur temporelle de cette impulsion, qu'il va convertir proportionnellement (ou presque) en un angle.
Le retour à 0 de l'impulsion peut avoir n'importe quelle durée.
En pratique, il semblerait qu'il ne faille pas dépasser un temps de 20ms entre deux fronts montants.
A noter aussi que ce système présente un avantage par rapport au PWM : une absense de signal (toujours à 1, ou toujours à 0) laisse le servo en "roue libre" comme si il n'était pas alimenté.

Le pic est capable de fournir directement ce signal de commande sur une sortie, avec un programme adéquat.


Voilà à quoi ressemble un PWM


Et ici un Signal modulé en code d'impulsion,
qui est donc le type signal à envoyer au servo.
Les valeurs sont donnés à titre d'exemple.



Dans la pratique, ça donne ...
Voici les valeurs réellements trouvées pour le servo-moteur testé.
Le signal était généré à l'aide d'un PIC (voir ci-dessous la partie programmation).
La précisions n'était peut-être pas au rendez-vous ! mais ça donne une idée...
  • Milieu vers 1.44 ms
  • -70 deg vers 0.8 ms
  • -102 deg (butée) vers 0.51 ms
  • +55 deg vers 1.92 ms
  • +98.8 deg (butée) vers 2.31 ms
Soit un "pas" de 8µs correspond à 0.89 deg.
Ou dans l'autre sens, un deg correspond à 9µs approximativement.


Et comment on fait marcher tout ça avec un PIC ?
Voici la méthode utilisée pour générer le signal par un programme sur le PIC 16F64 :
(voir la page Débuter avec un PIC)

On utilise ici des interruptions du timer pour le séquencement temporel.
Le programme passe par 2 phases. La phase 0 correspondant à l'état 0 du signal, la phase 1 à l'état 1.
A chaque changement de phase, on rerègle le timer pour obtenir une interruption au bon moment pour la prochaine phase.

Le PIC a un timer d'une précision de 1 octet, soit 256 valeurs.
Il est incrémenté à chaque cycle, soit ici (quartz à 4Mhz) toutes les µs.
Y est adjoint un prescaler non obligatoire et réglable qui permet d'incrémenter le timer tous les 1, 2, 4, 8, 16, 32 ... 256 cycles.
Pour la phase 1, le timer doit pouvoir aller le plus précisément possible de 0 à 2ms.
On choisit donc un prescaler de 8. Ainsi le timer s'incrémente toutes des 8µs, avec un maximum à 256*8 = 2048 µs.
Pour la phase 2 , la marge est bien plus large. On prend un prescaler de 128. Avec 140*128 = 17 920 µs

Ce premier programme utilise la méthode decrite ci-dessus pour faire bouger d'un "pas" le servo toute les 1/2 secondes (à peu près).
La base de temps (abusivement appellée PWM, vous m'excuserez, mais Signal-code modulated signal ça fait long comme variable ;-) est donc de 8 µs de précision, sur 1 octet.
Elle s'incrémente dès que la variable tmp_cmp atteint 64 (tmp_cmp repassant alors à 0).
Le signal de commande est disponible sur l'ensemble du port B.
Il vous suffit d'alimenter le servo avec un jeu de 4 piles R6 (attention à bien relier la masse du servo et celle du PIC) et à relier son fil de commande avec l'un des ports B du PIC.
Voici le code et l'éxécutable. Amusez-vous bien à tester vos servo !


La robotique amusante !
Apres toutes ces explications, un petit exemple pratique !
Nous allons réaliser une tourelle qui cherche la lumière !

Rien de bien compliqué au niveau du montage :
  • Fixez 2 photo-résistances sur l'axe du servo-moteur
  • Reliez-les (ici avec des dominos) à la plaque d'expérimentation du PIC
  • Mettez une séparation entre les 2 photos-résistances (ici un bout de carton)
  • Il ne reste plus qu'à rajouter le petit montage sur la carte d'expérimentation du PIC.

Vous aurez besoin, en plus des 2 photo-résistances, d'un amplificateur opérationnel (Ici un classique UA74 donc voici la documentation), d'une LED, de deux résistances de 10K, et d'une de 1K.
Connectez la sortie à la patte 17 du PIC.

Ce montage est un bête comparateur qui teste la différence entre les 2 photo-résistances.
En sortie, on a 0 ou 1 suivant où la lumière est la plus forte.
La LED sert à voir le résultat.

Le programme est une variation du précédent.
Il faut connecter le capteur sur le le bit 0 du port A (patte 17 du PIC)
Le signal de contrôle du servo est retourné sur le bit 3 du port A (patte 2 du PIC)
Après le passage en phase 1, le programe teste l'etat du capteur et incrémente/décremente la variable PWM en conséquence (il vous faudra peut-être inverser le sens à ce niveau, ou sur le montage).
Les valeurs limites de la variable PWM sont 255 et 70.
Si elle atteint 255 elle revient à 70.
Si elle atteint 70 elle revient a 255.
Ces valeurs correspondent plus ou moins aux butés ...

Voici le programme (code et exécutable).
Munissez-vous d'une lampe électrique, et si tout marche bien, la tourelle qui "cherche" une différence de lumière l'accrochera et oscilera autour de sa direction !
Amusez-vous bien ! :-)

Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/pic/pic_et_servo.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail