Librairie C18 pour servomoteurs standards et PIC18F


La librairie C18 que nous vous proposons est courte (une centaine de lignes), mais simplifie l'utilisation de servomoteurs sur les PIC18F. Nous l'avons principalement testée sur le 2550.

Rappels sur les servomoteurs

Ce sont des boitiers conçus pour le modélisme qui contiennent un moteur continu, un réducteur, et de l'électronique de commande. Il sont souvent limités à 180° de débattement (certains plus, certains moins). On les commande en position, contrairement aux moteurs continus qui se commandent en vitesse.

D'ailleurs à ce sujet attention, vous tomberez peut-être sur des servos modifiés, dont une partie de l'électronique a été enlevée. Résultat : vous ne commanderez que la vitesse. Dans ce cas une commande inférieure à 90° fait marche arrière, 90° l'immobilisent, et au delà marche avant progressivement. Dès qu'un servo fait plus d'un tour sur lui-même c'est qu'il est modifié.

Les servos ont trois fils : la masse GND (Noir ou Marron), l'alimentation en 5V par exemple (Rouge), et la commande (Blanc ou Orange), que nous allons maintenant étudier.

Principe de la librairie

Les servomoteurs se commandent par largeur de pulsation. Une pulsation toutes les 20ms, dont la largeur est reliée linéairement à la consigne donnée. Pour un servo 180° typique, la largeur correspondant à 0° est 544µs, et 2400µs pour 180°. Vous pouvez envoyer ces signaux avec un PWM (c'est ce que fait la librairie Servo d'Arduino), mais sur les PICs que nous utilisons au club on manque de résolution avec l'oscillateur interne (10° max).

Cette librairie utilise donc les interruptions sur le Timer0 pour commander jusqu'à 8 servos connectés sur le port B. Nous allons Envoyer les pulsations pour chaque servo à la suite, puis attendre 20ms avant de recommencer. Sur le schéma suivant vous voyez bien que le délai entre deux pulsations sur RB0 va varier en fonction de ce qu'on envoie à RB1, mais c'est négligeable.

Utilisation

Le code à inclure est dans le fichier suivant :

https://github.com/7Robot/Eurobot-2012/blob/master/timerservo.X/servo.c

Et un exemple d'utilisation :

https://github.com/7Robot/Eurobot-2012/blob/master/timerservo.X/main.c

Vous avez trois fonctions à utiliser :

OpenServo(nombre); pour choisir combien de servos vous utiliserez et initialiser les interruptions. Par exemple pour nombre=3 les pins à connecter sont RB0 pour le servo 1, RB1 pour le servo 2 et RB2 pour le servo 3. Le nombre maximum de servos pouvant être utilisé en même temps est de 8.

InterruptServo(); à appeller quelque part dans la routine de traitement des interruptions. Par défaut il s'agit de celle de priorité haute.

WriteServo(servo, angle); pour donner la consigne angle à la pin numéro servo.

Et voilà.

Venez nous dévouvrir !

Vous pouvez en apprendre un peu plus sur nous grâce à ce site, contactez-nous avec la page dédiée
ou venez nous voir à l'ENSEEIHT dans la fameuse Tour Radio (3ème étage)