Montage Electronique et Pic Schéma Commande numérique de Servo-moteur (8 servos)

Commande numérique de Servo-moteur (8 servos)

Dernière mise à jour le 03/12/2003, 7073 visites.
Permet de commander des servo-moteur de modélisme - jusqu'à 8 servos simultanément. La commande numérique se fait via un pic 16f628 ou 16f877 en tache de fond. Le microcontroleur reste donc disponible pour effectuer d'autres opérations.

Fonctionnement d'un servo-moteur

Les servos moteurs sont des actionneurs. Ils permettent de réaliser des déplacements en translation ou en rotation dans les modèles réduits : ce sont eux qui commandent par exemple la direction et les gazs sur des voitures thermiques. Mécaniquement, il s'agit d'un moteur avec réducteur. Le mouvement de sortie est donc une rotation.
Mais l'intéret des servos moteurs réside dans le fait qu'on le commande en lui indiquant l'angle de rotation à effectué à partir de l'origine. Le système ne peut pas faire plusieurs tours son angle de manoeuvre étant inférieur à 360°.

Commande d'un servo-moteur

Le servo dispose comme connectique d'un câble muni de trois fils :
  • Masse (généralement en noir)
  • Tension d'alimentation 5V (généralement en rouge)
  • Tension de commande 0-5V (généralement en blanc)
Si la tension de commande est constante, le servo est inactif et il n'exerce aucun effort (on peu le déplacer à la main).
Pour lui indiquer une consigne de position, il faut lui envoyé un signal 5v d'une durée comprise entre 0 (angle minimum) et 2ms (angle maximum). Ces valeurs sont à calibrer en réalité car les durée peuvent varié suivant les servos. D'alleurs, une durée de 0ms correspond à un signal constant et donc à une absence d'effort sur le servo.
Ce signal doit être réémis tous les 20 ms pour que le servo atteigne effectivement la position demandée et soit continuellement régulée (si on exerce un effort sur le servo, il tendra toujours à revenir à la position de consigne.

Réalisation d'un signal de commande à l'aide d'un microcontrôleur PIC

L'algorithme que j'ai mis en place permet de commander entre 1 et 8 servos simultanément tout en ayant un autre programme tournant sur le PIC. En fait j'ai créé ce programme pour le club robot de mon école qui participe à la coupe E=M6. Le programme final permet de commander les moteurs du Robot et 2 servos qui servent à commander une pince et un sas.
Pour répondre à une telle exigence il faut que la génération du signal de commande se fasse en intérruption (intérruption sur débordement de timer) : on ne peut pas se permettre de faire des boucles d'attente qui monopoliseraient inutilement le microcontroleur.

Explication sur les interruptions timer du PIC

Le pic (16f877 ou 16f628) dispose de 3 timers/conteurs : dans notre cas il est mis en mode timer ce qui signifie qu'il est mis à jour (incrémenter) à chaque execution d'un certains nombre d'instructions par le pic (1,2,4,8 etc suivant le prescaler choisi). Ces timers peuvent bénéficier d'un interruption lors de leur débordement c'est à dire lorsqu'ils passent du nombre 0xff (255 = nombre le plus grand sur 8 bits) à 0x00 (0). Par ailleurs nous pouvons écrire et lire dans le timer. Par conséquent, on peut réaliser une tempo de la durée souhaitée en incrivant -(le nombre d'instruciton de la tempo) dans le timer. Ainsi le timer débordera à l'instant désiré.

Première méthode de commande en parallèle (ne fonctionne pas)

Chronogramme d'une commande en parallèle
Au départ j'ai écrit un algorithme qui aurait permis de controler une multitude de servos : Lors d'une première intérruption du timer, on met a 1 tous les servos (sauf ceux non commandés) puis on met le timer de tel sorte qu'il déborde à l'instant ou devra remettre à zero le plus court signal. Lors de cette interruption on met à jour le timer avec la durée du deuxième servo - la durée que l'on vient d'attendre. Et ainsi de suite jusqu'a ce que tous les servos soit au niveau 0. On effectue alors une temporisation plus longue, puis on recommence.
Mais cette technique ne s'est pas avéré efficace. En effet cette technique demande des ressources au microcontroleur puisque à chaque interruption il faut rechercher le servo qui a la valeur minimale. Ainsi le temps d'execution de la procédure d'interruption est assez long. Et les faits montre que ce temps été largement supérieur à la résolution désiré pour les servos. Pour mettre en évidence ce problème, il suffisait de commander un servo avec une valeur N et un autre avec une valeur N+1. On constatait alors sur le deuxième servo une erreur importante (mis en évidence si on donne une autre valeur au premier servo - dans ce cas le deuxième servo reprend sa position sans erreur). Cette erreur est du au fait que la procédure d'interruption dure plus longtemps que le temps de résolution du timer (temps mis par le timer pour passer d'une valeur N à N+1). Ainsi l'ordre d'arret sur le signal de commande du deuxième servo n'est effectuè qu'après la première procédure d'interruption soit réalisé.
Les erreurs constatèes avec un quartz à 4 MHZ étaientt assez importantes : La durèe de l'interruption représentait plus d'une dizaine de pas du servo.

Deuxième méthode de commande en série

Chronogramme d'une commande en série
Le pic ne pouvant donc pas effectuer des tempos de durèe trop petite il a fallu trouvé une méthode pour commander plusieurs servo simultanément. Ceci est fait en lancant les commande en série :
Exemple pour commander deux servos :
t= 0 ms 1ere interruption : lancement du servo 1
t= 1 ms 2eme interruption : arret du servo 1 et lancement du servo 2
t= 1.5 ms 3eme interruption : arret du servo 2
t= 20 ms 4eme interrution : idem 1ere.
Cette méthode obtient une erreur nulle. En effet en calibrant les servos on s'apercoit que la position minimale est à une durée de timer de ~ 30 soit bien plus que le temps nécessaire pour l'execution de la procédure d'interruption (> 10). Avec la valeur du prescaleur optimisé on obtient la position maximale pour une valeur ~ 130 soit environ une résolution de 100 pas pour la commande des servos.

Les sources en C sont disponibles en téléchargement pour les deux versions, elles permettent de commander simultanément 8 servos.


Fichiers
Servo SérieFichier source en C pour pic 16f628 et pic 16f877 pour l'algorithme série permettant de controler 8 servos simultanément. Le programme principal contient en outre une interface de commande du port série via le port série.
Servo ParallèleFichier source en C pour pic 16f628 et pic 16f877 pour l'algorithme parallèle permettant de controler 8 servos Algorithme non fonctionnel




© HAMEL Cédric 2002-2008
Partagez vos montages en créant votre site sur SiteW.com : Création de site gratuit