COMMANDE MOTEUR CC

AVEC PIC16F873A

SANS PID

 

 

         Le montage que je vous propose ici permet de générer les signaux de pilotage (PWM) pour deux moteurs à courant continu, suivant des ordres reçus sur une liaison série RS232 à 19200 bauds.

         Il trouve son application dans les robots à 2 roues motrices + 1 roue folle que l’on voit couramment lors des coupes de robotique (E=M6). Ce montage est fortement inspiré de ce que j’ai pu trouvé sur le NET et comme toujours, je ne prétends pas avoir réinventé la roue.

 

         Le composant essentiel de ce montage est (bien sûr) un PIC. Et comme il faut au moins 2 PWM, il va falloir « taper plus haut » que les classiques 16F84 ou 16F628. Nous allons donc prendre un 16F873A. Pour les connaisseurs, rien de bien fantastique. Pour les néophytes, sachez qu’il n’a pas grand chose en plus par rapport à un 16F628 si ce n’est des ports d’entrées/sorties en plus et qu’il a donc 28 broches au lieu de 18.

 

1)    Le PWM : c’est quoi de machin ?

C’est un nom barbare issu des initiales de Pulse Width Mode, et que l’on traduit en français par MLI (Modulation en Largeur d’Impulsion).

Il s’agit tout simplement d’un moyen de générer une tension moyenne variable à partir d’une tension continue fixe (alimentation), en modulant le rapport cyclique d’un signal périodique.

 

Comme vous pouvez le voir sur le chronogramme ci-dessus, plus la durée T est grande par rapport à la période du signal, plus la tension moyenne résultante sera élevée.

Le calcul T/PERIODE est appelé rapport cyclique et il est généralement exprimé en pourcentage de 0% (tension nulle) à 100% (tension maximale).

Tout ceci est bien sûr théorique car en fait la tension résultante n’a rien de constant mais dépendra de la charge qu’elle alimentera (capacitive, inductive et/ou résistive).

 

2)    Le PIC16F873A :

Ce microcontrôleur est en fait le petit frère à 28 broches du 16F877A (40 broches).

Il possède moitié moins de mémoire que son aîné mais c’est bien suffisant pour cette application.

Vous trouverez toute la documentation requise (en anglais) sur le site de Microchip .

Vous pouvez également prendre un 16F873 (sans le ‘A’), mais il faudra certainement recompiler le fichier source en modifiant le ‘#include <16F873A.h>’ en ‘#include <16F873.h>’.

 

3)    Le programme :

Vous trouverez ici le fichier HEX prêt à être programmé dans votre composant (16F873A).

Je mets également le fichier source en C pour ceux qui sont intéressés (je suis newbie en C donc je donne ce fichier à titre informatif et sans aucune prétention).

 

4)    Le brochage :

1 : à relier au +5V (/MCLR) ou dans une boucle d’arrêt d’urgence.

2,3,4,5,6,7 : NC

8 : 0V (masse)

9 et 10 : quartz 20Mhz avec condensateurs 27pF

11 : NC

12 : PWM moteur 2

13 : PWM moteur 1

14,15,16 : NC

17 : TX (à relier au RX du maître)

18 : RX (à relier au TX du maître)

19 : 0V (masse)

20 : 5V (VDD)

21 : NC

22 : signal A

23 : signal B

24 : signal C

25 : signal D

26,27,28 : NC

 

Les signaux A, B, C et D sont des sorties destinées à piloter l’étage de puissance afin de définir le sens de rotation des moteurs :

Si A=0V et B=5V, le moteur droit (relié au PWM1) tournera dans un sens. A l’inverse, si A=5V et B=0V, le moteur droit tournera dans l’autre sens. Idem pour C et D avec le moteur gauche (PWM2).

 

5)    Les ordres :

Pour dialoguer avec le PIC, on utilise le port série d’un PC configuré en 19200 bauds, 8 bits de données, pas de parité, 1 bit de stop, pas de gestion de flux.

Il faut également mettre à niveau les signaux TX et RX car sur le PIC, ils sont en 0/5V et sur un PC, c’est plutôt du +12/-12V (niveaux RS232). On peut par exemple utiliser un circuit spécialisé comme le MAX232.

N’oubliez pas de cocher ‘Reproduire localement les caractères entrés’ si vous voulez voir ce que vous tapez.

 

Listes des ordres :

 

Gxxx : consigne de vitesse pour le moteur gauche (PWM2).  xxx est compris entre 000 et 255

Dxxx : idem ci-dessus mais pour le moteur droit (PWM1).

Bxxx : consigne pour les 2 moteurs en même temps.

A0 : Faire tourner le moteur droit dans le sens horaire.

A1 : Faire tourner le moteur droit dans le sens anti-horaire.

A2 : Faire tourner le moteur gauche dans le sens horaire.

A3 : Faire tourner le moteur gauche dans le sens anti-horaire.

A5 : Faire tourner les 2 moteurs dans le sens horaire.

A6 : Faire tourner les 2 moteurs dans le sens anti-horaire.

A7 : Moteur droit sens horaire, moteur gauche sens anti-horaire.

A8 : Moteur droit sens anti-horaire, moteur gauche sens horaire.

C : Arrêter les 2 moteurs. Cette fonction empêche toute rotation lors de l’envoi des ordres G, D et B.

 

A la mise sous tension, si votre PC est configuré correctement, vous devez recevoir ‘Liaison OK>’. Les moteurs ne tournent pas. Vous pouvez maintenant entrer des ordres suivant la liste ci-dessus.

Notez qu’il est inutile d’appuyer sur ‘Entrée’ après avoir saisi un ordre. Le PIC le fait pour vous.

Les valeurs xxx pour les commandes G, D et B doivent impérativement avoir 3 caractères. Par exemple pour configurer la valeur 10 pour le moteur droit, il faut taper ‘D010’.

Si un ordre est valide, le PIC retourne ‘OK>’ sur le port série. Si un ordre n’est pas valide, le PIC retourne ‘PAS BON>’.

 

Exemples :

A la mise sous tension, les moteurs ne tournent pas.

Tapez ‘B128’ puis ‘A5’. Les moteurs vont tourner tous les deux dans le même sens à mi-vitesse (le maximum étant 255, le rapport de vitesse est donc 128/255).

Tapez ‘A6’. Les moteurs vont freiner brutalement puis tourner dans l’autre sens.

Tapez ‘C’. Les moteurs s’arrêtent.

Tapez ‘B200’. Les moteurs ne redémarrent pas car il y a eu une commande ‘C’. Par contre la consigne a été mémorisée.

Si ensuite vous tapez par exemple ‘A5’, les moteurs tourneront dans le même sens qu’au début à environ 4/5 de la vitesse maxi (rapport = 200/255).

 

IMPORTANT : j’ai volontairement bridé la vitesse minimum des moteurs. Ainsi, il est impossible d’entrer une vitesse inférieure à 100. J’ai fait cela car mes moteurs ronflaient mais ne démarraient pas en dessous de 100. Le programme en C sans limitation est ici. Le fichier HEX ici.

 

Dés lors, il est possible de paramétrer tous les mouvements possibles, et même de faire des jolies courbes en donnant des paramètres différents à la roue droite et à la roue gauche.

 

6)    Quels composants pour la puissance ?

Tout dépend de la consommation de vos moteurs. Pour ma part, j’ai opté pour un circuit qui intègre tout, le L298N. Il est bon marché (7 euros maxi), peut piloter 2 moteurs CC, peut fournir 2.5A en continu par sortie (moyennant un radiateur) et ne nécessite pas beaucoup de composants externes (juste des diodes de roue libre et les classiques condos près de ses bornes d’alimentation).

Les appellations que j’ai utilisées pour les sorties du PIC ont en fait été ’empruntées’ à ce circuit. En effet, il possède des entrées nommées A, B, C et D à relier aux sorties du même nom sur le PIC par l’intermédiaire d’une résistance de 1Kohm chacune.

Les entrées /INH1 et /INH2 du L298N sont à relier respectivement aux sorties PWM1 et PWM2 du PIC par des résistances de 1Kohms. Ces résistances sont là pour empêcher de griller les sorties du PIC au cas où le L298N grillerait. Vous pouvez également mettre des optocoupleurs si le cœur vous en dit.

Les bornes 1 et 15 peuvent être reliées à la masse avec un strap suffisamment gros pour supporter le régime maximum de vos 2 moteurs.

 

7)    Et quid d’un PID ?

J’entends d’ici les puristes dire « ah ouais, mais il a même pas de PID dans son bidule alors comment son robot va aller droit… »

C’est vrai que, pour un modèle de moteur donné et fabriqué en série, il n’y aura jamais 2 moteurs qui tourneront exactement à la même vitesse. Le PID (pour Proportionnel Intégrale Dérivé) est une méthode de gestion moteur qui, moyennant l’ajout d’un codeur qui le renseigne sur le sens et la vitesse de rotation du moteur, permet de faire une régulation de vitesse ou de position (roue odométrique). Avec un PID sur chaque moteur et la même consigne dans chaque PID, on peut donc se dire que notre robot ira droit à tous les coups.

(Ce qui suit est mon avis personnel et n’engage que moi !)

Et bien  non ! ça, c’est si on vivait dans un monde idéal, avec un sol toujours plat, des roues de diamètres strictement identiques, des masses équitablement réparties sur les 2 roues…

Mais revenons sur Terre : il suffit qu’une seule de ces conditions ne soit pas là pour que le PID devienne aussi inutile qu’il a été difficile à mettre en œuvre.

C’est pourquoi j’ai décidé de ne pas m’imposer la lourdeur d’un PID à gérer. Si il y a une grande différence entre les moteurs, celle-ci pourra être compensée par programmation, en envoyant des ordres légèrement différents aux moteurs droit et gauche. Certes, la vitesse d’un moteur CC n’est pas linéairement proportionnelle à sa tension d’alimentation mais mon but n’est pas, à priori, de faire un 100 mètres en ligne droite.

 

 

 

Remerciements :

 

On ne les remerciera jamais assez : Maître BIGONOFF, les Fribottes, et en général, les bons samaritains du forum robotique de Planète Sciences sans qui, je le dis sans honte, j’en serais encore au débuggage.

 

Il est strictement interdit de copier ce montage dans un but lucratif.

 

retour