Astuces de programmation

Dans cette page, je rendrai disponible le code source et exposerai les fondements de la programmation des microntrôleurs PIC pour des applications de robotique. J'ai écrit du code pour configurer et contrôler PWM, les senseurs Sharp GP2D12, les senseurs QRB1114, les circuits intégrés VoiceCorder de ISD, les modules à ultrason SRF04, l'interface à deux fils pour afficheur LCD, interface aux boussoles électroniques Vector 2X, etc... J'ai aussi développé des librairies pour l'utilisation de la mémoire EEPROM pour conserver des données de configuration et de calibration, une librarie pour la gestion des compteurs, une librairie pour l'envoi de caractères sur port série.

Les exemples de code ci-bas ont été écrit en langage C pour le compilateur PICC de CCS. Pour portage de ce code à d'autres compilateurs C pour PIC, consulter les fichiers picinterface.h et picinterface.c. L'accès aux registres correspondant aux divers macros CCS y est décrit.



Configuration du PWM pour microntrôleur PIC

Les registres utilisés spécifiquement pour le PWM sont les registres TRISC, PR2, CCP1CON, CCP2CON, CCPR1L, CCPR2L et T2CON. Il existe deux canaux PWM sur le PIC16F877. Ces modules sont étiquetés CCP1 et CCP2. Les deux broches du PIC16F877 associées à ces modules sont les broches 16 et 17. Il y a deux façons de joindre ces broches au L293D, mais celle que je préfère est de joindre ces broches sur le Chip Enable du L293D. Le PWM permet alors de réguler le pourcentage d'activation du moteur.

Il y a deux paramètres de base dans la configuration du PWM: la fréquence de la pulsation et la longueur des pulsations. La longueur des pulsations est aussi appelée le "duty cycle". La fréquence de pulsation indique combien de fois à la seconde la pulsation se répète. On parle de "duty cycle" pour indiquer le pourcentage de temps ou l'on fournit de la tension au moteur. Dans un monde idéal, si le moteur effectue normalement 100 révolutions par minute, il effectuera 25 révolutions par minute avec un "duty cycle" de 25%.

Il est bon d'expérimenter avec ces paramètres pour trouver la configuration optimale pour l'application desirée. Certains moteurs sont plus performants lorsque la fréquence est basse (disons 2000-5000 Hz), d'autres requierent une fréquence plus élevée. Il est à noter qu'une fréquence entre 1000 et 8000 Hz est audible et peut être très agassante. J'ai fait des tests avec trois robots de poids et moteurs variés (de 500 g a 15 kilos) et ai trouvé qu'une fréquence entre 15 000 et 20 000 Hz donne de bons résultats. Je n'ai jamais vu un robot pouvoir se déplacer avec un "duty cycle" en bas de 50%. Pour aller plus bas que 50%, il faut alors utiliser des astuces au niveau logiciel. L'idéal est de trouver des moteurs qui donnent une vitesse satisfaisante à 50% (pas trop rapide) et qui peut se déplacer à bonne vitesse à plein pouvoir.

Le registre TRISC doit être initialisé pour indiquer que RC1 et RC2 sont des sorties (bits 1 et 2 de TRISC doivent être 0).

CCP1CON et CCP2CON sont utilisés pour configurer le mode des modules CCP1 et CCP2. Une valeur de 12 configure ces modules pour le mode PWM.

Le compteur Timer2 est utilisé par les modules PWM CCP1 et CCP2. Le prescaler du compteur Timer2 peut être configure à travers les bits TCKPS0 et TCKPS1 du registre T2CON (bit 0 et 1). Une valeur de 0 pour ces deux bits configure un prescaler de 1. Le bit TMR2ON (bit 2) doit être initialisé à 1 pour mettre en marche le Timer2.

Le registre PR2 sert à configurer la fréquence de pulsation. La formule utilisée pour calculer la période de pulsation est:

(PR2 + 1) * 4 * TOSC * (valeur du prescaler du Timer2).

La fréquence de pulsation est 1 / période. Si PR2 est égal à 255 et que le PIC roule à 20 MHz, la fréquence de pulsation est de 19.53 kHz avec un prescaler du compteur Timer2 de 1, i.e. 1 / ((255 + 1) * 4 * 1 / 20 000 000 * 1).

Les registres CCPR1L et CCPR2L configurent le "duty cycle". Le "duty cycle" est calculé par rapport au PR2. Si PR2 est égal à 100 et que CCPR1 est égal à 50, alors le "duty cycle" est effectivement de 50% (la moitié de PR2).

CCS fournit certains macros pour configurer les registres ci-haut aisément. Voici un exemple de programme qui démontre comment utiliser ces macros pour contrôler le module PWM:

demopwm.c


Interfacer un microcontrôleur PIC à un senseur GP2D12

Le senseur GP2D12 est un senseur analogique qui permet la détection d'obstacles à l'aide d'infrarouge. L'infrarouge a cette propriété particulière qu'il réfléchit sur des obstacles. Sur le devant du senseur, un photodiode se trouve à coté du LED qui emet l'infrarouge. Le photodiode fait varié le voltage en sortie (Vo) par rapport à la quantité de lumière infrarouge qui est captée par le senseur (qui correspond à la réflection de l'infrarouge sur les obstacles à proximités). Grosso modo, le niveau d'infrarouge réfléchi sera plus élevé si un obstacle est près de l'émetteur. Plus ce niveau est élevé, plus le voltage en sortie est élevé.

Si le voltage en sortie est branché à un microntrôleur qui supporte la fonction de conversion analogue-digitale (comme le PIC16F877), il est possible de traduire ce voltage en une valeur numérique qui pourra être utilisée pour modifier le comportement du robot. Le robot peut alors détecter les obstacles et en connaître la distance.

Le fichier gp2d12.c montre un exemple de code source C pour le compilateur PICC de CCS. Cet exemple montre comment on peut échantillonner une valeur analogique et la convertir en mesure en centimètre. Le schéma GP2D12 montre comment interfacer le senseur à un microcontrôleur PIC16F877.

Il est à noter que dans cet exemple, nous faisons l'hypothèse que le senseur se trouve 10 centimètres à l'intérieur du robot, Ceci est nécessaire parce que la courbe du voltage augmente pour les premiers dix centimètres, puis redescend (voir diagramme ci-bas). Il y a donc deux valeurs de distance possibles pour un certain intervalle de voltage si l'on permet des lectures dans les dix premiers centimètres. En plaçant le senseur à l'intérieur du robot, on évite cette ambiguïté.


Voltage analogique en sortie par rapport à la proximité d'obstacles


Interfacer un microcontrôleur PIC à un module à ultrason SRF04

Le module è ultrason SRF04 permet le détection d'objets sur une distance allant jusqu'à 3 mètres. Le principe de fonctionnement consiste à transmettre un signal ultrason et calculer le temps écoulé pour que l'écho de l'ultrason revienne au capteur. Ce temps est proportionnel à la proximité d'un obstacle. En utilisant la constante de la vitesse du son (347 m/s), on peut déterminer la distance parcourue. Pour l'information sur ces senseurs, consultez les pages de Devantech:

SRF04 - Ultrasonic Range Finder

SRF04 Timing Diagrams

Le fichier srf04.c montre un exemple de code source C pour le compilateur PICC de CCS. Dans cet exemple, nous utilisons le compteur Timer1 pour calculer le temp écoulé. Nous avons placé la détection des pulsations dans une routine d'interruption de service afin de pouvoir continuer le traitement d'autres requêtes ou la surveillance d'autres senseurs en attendant la fin de la pulsation. La raison de cette architecture est d'éviter de bloquer le microntrôleur pour une période prolongée (il peut y avoir un délai de 36 ms entre l'émission de l'ultrason et la réception de l'écho).

Le fonctionnement du pilote consiste à activer la ligne de transmission, puis calculer le temps écoulé entre la mise à 1 et à 0 de la ligne de réception (longueur de la pulsation).


Interfacer un microcontrôleur PIC à un circuit intégré VoiceCorder ISD4003

Le circuit intégré VoiceCorder ISD4003 de Winbond offre la posibilité d'enregistrer une trame audio analogue dans la mémoire permanente du ISD4003. Il est ensuite possible de faire rejouer cette séquence sur un circuit d'amplification externe raccorder au circuit intégré. Le ISD4003 est contrôler à travers le Serial Peripheral Interface (SPI).

Le fichier isd4003.c montre un exemple de code source C pour le compilateur PICC de CCS.

Pour me contacter, écrivez à l'usager mdubuc au domaine freeshell.org.

Dernière mise-à-jour: Le 20 décembre 2003