mercredi 4 juillet 2012

servo-moteur 2, contrôle par ordinateur

Dans ma chronique précédente je décrivais comment contrôler un servo-moteur avec un PIC10F202 et 2 boutons momentanés. Le code n'occupait même pas 50% de l'espace programme il y avait donc de la place pour ajouter des fonctionnalités. J'ai ajouter la possibilité de contrôler le servo-moteur à partir d'un ordinateur via un port série. Pour réaliser ce projet il faut utiliser l'adapteur de niveau RS-232 décris dans cette chronique ou un équivalent.

code source MPASM

Tous les fichiers sont disponible ici.
l'idée principale est qu'il y avait encore plusieurs milli-secondes de disponibles entre 2 pulses de contrôle du servo-moteur pour permettre l'envoie et la réception de courts messages avec le protocole UART. les routines utilisées pour la communications UART sont, uart_send, uart_receive et la macro uart_bit_delay. Les commandes reçu du PC ont 3 octets. Le premier caractère défini la commande et les 2 octets qui suivent un nombre de micro-secondes en little indian1. Les commandes sont:

  • 'A' position, positionnement absolu
  • 'D' delta, rotation vers la droite
  • 'G' delta, rotation vers la gauche
position est une valeur en micro-secondes qui défini la nouvelle consigne du servo-moteur.
delta est le nombre de micro-secondes qu'il faut ajouter ou soustraire à la position actuelle pour obtenir la nouvelle consigne.
C'est la routine check_for_command qui traite la commande reçue.

Le micro-contrôleur ne peut pas recevoir des commandes à n'importe quel moment. Il doit donc informer le PC hôte lorsqu'il est prêt à recevoir une commande. Pour ce faire il envoie un caractère XON à l'hôte.
A la réception de ce message et à nul autre moment le PC doit envoyer une seule commande de 3 octets. Commande reçu ou pas à 18 millisecondes du début du cycle un caractère XOFF est envoyé à l'hôte pour l'informer de cesser toute transmission. le MCU est à l'écoute du PC pour une durée qui varie entre environ 15msec et 17msec à toutes les 20msec. Pour tester ce projet j'ai écris un programme en OpenEuphoria2. Il est disponible ici ce module est aussi nécessaire.

Le plus difficile a été d'ajuster le délais de bit pour la réception sur le MCU. En transmission en utilisant un oscilloscope on peut voir si le duré du bit est trop longue ou trop courte et faire l'ajustement nécessaire. Pour la réception on sais que le timing du signal reçu est bon mais c'est plus difficile d'évaluer le temps d'exécution de la routine de réception sur le MCU. Quoi qu'il en soit le résultat final fonctionne bien avec le programme test que j'ai écris.



NOTES:
1)Little indian signifit que l'octet de poids faible est précède celui de poids fort. Le contraire, poids fort en premier, est dit big indian.

2) OpenEuphoria est un language de programmation procédural développé dans les années 90 par Robert Craig de RDS. Depuis quelques années le projet est passé dans le domaine du logiciel libre. Euphoria possède un machine virtuelle pour exécuter le byte code intermédiaire mais aussi un convertisseur en 'C' qui permet de compiler les programmes en language machine.

Aucun commentaire:

Enregistrer un commentaire