dimanche 7 septembre 2014

Contrôler un moteur DC en python avec le Raspberry Pi

Voilà un certain temps que je n'ai pas joué avec mon Raspberry Pi...pourquoi ne pas l'utiliser pour contrôler un (ou deux) moteur(s) à courant continu?

Nous allons faire un petit programme en python qui fera varier le sens et la vitesse de rotation du moteur.  Vous allez voir:  ce n'est pas tellement compliqué, et ça pourrait servir de point de départ pour un excellent projet de robot...


Le double pont en H L293D

Commençons par une mise en garde:  il est hors de question de brancher directement le moteur aux pins GPIO du Raspberry Pi:  les courants assez intenses qui sont nécessaires pour faire tourner le moteur pourraient s'avérer très néfastes pour la santé de votre Raspberry Pi.  Nous allons plutôt contrôler le moteur par l'intermédiaire d'un circuit intégré spécialement conçu pour ce genre d'utilisation:  le L293D.

Grâce à ce circuit intégré, l'intensité de courant traversant les fragiles pins du Raspberry Pi sera beaucoup plus faible que celle qui traversera le moteur.  De plus, un moteur en rotation agit un peu comme un générateur de courant:  le L293D comporte des diodes intégrées qui protégeront votre Raspberry Pi contre ce courant parasite.

Le circuit

D'abord, un petit rappel de la numérotation des pins GPIOs du Raspberry Pi.   Dans les instructions qui suivent, j'utiliserai exclusivement la notation BOARD (plutôt que BCM).



Et voici le brochage du L293D:

Les pins 4, 5, 12 et 13 du L293D doivent toutes être reliées à la masse (les pins GND) du Raspberry Pi (la pin numéro 6, par exemple).  Comme tous les circuits intégrés, le L293D doit être alimenté, et c'est la pin 16 qui est désignée pour recevoir cette alimentation.  Une des sorties 5 V du Raspberry Pi (la pin numéro 2, par exemple) fera parfaitement l'affaire.  Cette tension sert uniquement à alimenter le circuit intégré:  elle n'est pas transmise au moteur.



Pour alimenter le moteur, on utilise la pin 8 du L293D.  Mais attention:  il n'est pas du tout conseillé d'utiliser les pins du Raspberry Pi pour cette fonction.  Nous allons donc utiliser une alimentation autonome comme, par exemple, des piles (la tension de votre assemblage de piles sera choisie de façon à ne pas dépasser ce que peut tolérer votre moteur).  La borne positive de l'alimentation du moteur doit être reliée à la pin 8 du L293D, et la borne négative doit être reliée à la masse (du L293D et du Raspberry Pi).


On peut brancher deux moteurs DC à un même L293D:  les pins situées du côté gauche du CI sont réservées au premier moteur, et les pins du côté droit sont pour le deuxième (s'il y a lieu).

Commençons par un seul moteur.  Le moteur lui-même se branche aux pins 3 et 6 du L293D.



La pin 1 du L293D est la pin "enable" (activation) du premier moteur.  Le moteur tournera à sa vitesse maximale si cette pin est soumise au signal logique "HAUT", et il ne tournera pas si elle se trouve au signal logique "BAS".  Si on veut que le moteur tourne à une vitesse réduite, il s'agit de soumettre cette pin à un signal qui alterne rapidement entre "HAUT" et "BAS":  c'est ce qu'on appelle la modulation de largeur d'impulsion, ou PWM pour pulse width modulation.    Relions donc la pin 1 du L293D à la pin 22 du Raspberry Pi,

Il reste deux autres pins du L293D à raccorder au Raspberry Pi:  le moteur tournera dans un sens lorsque la pin 2 sera soumise au signal logique "HAUT"  et la pin 7 sera soumise au signal logique "BAS", et tournera dans l'autre sens si la pin 2 est à "BAS" pendant que la pin 7 est à "HAUT".  Branchez la pin 2 du L293D à la pin 18 du Raspberry Pi, et la pin 7 du L293D à la pin 16 du Raspberry Pi.



Programme en langage Python

Voici un petit programme en Python qui montre comment contrôler le moteur:  on le fait d'abord tourner dans un sens à haute vitesse pendant 5 secondes, puis à basse vitesse.  Ensuite, on inverse le sens de sa rotation, d'abord à basse vitesse, et ensuite à haute vitesse.



Si vous enregistrez ce programme dans un fichier intitulé "moteur_un.py", vous pourrez l'exécuter en tapant cette ligne de commande:

sudo python moteur_un.py

Deux moteurs

Vous pouvez ajouter un deuxième moteur si le coeur vous en dit.  Le moteur se branche aux pins 11 et 14 du L293D.  On peut ensuite brancher la pin 9 du L293D à la pin 23 du Raspberry Pi, la pin 10 du L293D à la pin 21 du Raspberry Pi, et la pin 15 du L293D à la pin 19 du Raspberry Pi.

Le schéma ci-dessous illustre les branchements du deuxième moteur (j'ai enlevé le premier moteur pour plus de clarté):



Voici un programme qui illustre comment on peut contrôler les deux moteurs de façon simultanée.




N'hésitez pas à consulter mes autres tutoriels concernant le Raspberry Pi.

Sources: Je me suis d'abord basé sur cet article, mais puisque l'auteur ne faisait pas varier la vitesse du moteur, j'ai dû me documenter ailleurs concernant le PWM.


Yves Pelletier (Twitter:  @ElectroAmateur)

24 commentaires:

  1. Joel de Nantes10 mai 2015 à 10:47

    Bonjour,
    la doc indique que le PWM se fait sur le PIN 12 (BCM 18) du RaspBerry. Une erreur ?

    RépondreSupprimer
    Réponses
    1. Bonjour,
      Dans cet exemple, j'ai utilisé la bibliothèque RPi.GPIO pour faire du PMW logiciel; ça fonctionne alors sur n'importe quelle pin GPIO disponible.

      Supprimer
    2. Joel de Nantes17 mai 2015 à 17:39

      Bonjour,
      bravo pour la réactivité de réponse. Félicitation pour ce tutoriel clair et complet. Très pro.
      Concernant le PMW, ne serait-il pas plus intéressant d'utiliser la bibliothèque RPIO utilisant le DMA :
      https://pythonhosted.org/RPIO/pwm_py.html

      Supprimer
  2. Bonjour, je voudrais savoir si je peux alimenter deux moteurs avec une pile de 9V.

    Merci,

    RépondreSupprimer
    Réponses
    1. Ça dépend toujours un peu des moteurs, mais en principe la réponse est oui. La pile ne durera pas très longtemps, par contre.

      Supprimer
  3. Bonjour,

    Merci pour ce tutoriel très clair. Cependant, impossible de faire fonctionner le système chez moi. J'ai pris un moteur classique DC, l'est alimenté en 1.5Volts mais lorsque je lance le programme, il n'émet qu'il simple très légère vibration. J'ai donc remplacé ma pile de 1.5volts mais un 4.5. J'ai lancé le programme mais cette fois-ci, plus rien. Une simple odeur de brûlé provenant du L293D.

    Merci par avance e votre aide,
    RG.

    RépondreSupprimer
    Réponses
    1. J'ai trouvé ! Il faut mettre une batterie bien plus elevé que lors d'un branchement directe. De 1.5volt à 7.8volts pour que cela fonctionne correctement !

      Merci !

      Supprimer
  4. Bonjour, pour faire marcher la L293D, faut il avoir un programmateur pour la programmer ou le Raspberry s'en occupe. Je m'explique, quand je recois la puce, je l'installe directement ou je dois d'abord la programmer via un PC? Merci d'avance et sinon bravo pour ton tutoriel.

    RépondreSupprimer
  5. Bonjour. Le L293D n'est pas programmable: il s'agit de le brancher correctement et il est prèt à accomplir les fonctions (somme toute limitée) pour lesquelles il a été conçu.

    RépondreSupprimer
    Réponses
    1. Merci beaucoup pour la réponse et sa rapidité , c'est bien ce qu'il me semblait.

      Supprimer
  6. Très pédagogique, clair et néanmoins à portée opérationnelle, merci Yves.

    Question de béotien, le courant qui alimente le moteur passe par le L293D, quelle est la puissance maximale qui peut être fournie au moteur ? Je suppose qu'au delà de cette limite il me faudra utiliser un relais ?
    Encore merci et félicitation

    RépondreSupprimer
    Réponses
    1. Pour l'alimentation du moteur, le L293D supporte une tension maximale de 36 V et courant maximal de 600 mA. Les relais sont une solution, mais il existe aussi des pilotes de moteurs plus robustes, comme le L298.

      Supprimer
  7. avez vous un cablage pour L298
    merci

    RépondreSupprimer
  8. Merci pour le tuto, je voulais savoir si il était possible de réduire la vitesse du moteur pour qu'il effectue un tour complet en 8 sec par exemple. Merci

    RépondreSupprimer
    Réponses
    1. Une vitesse aussi lente ne pourra pas être atteinte par un moteur à courant continu, à moins qu'il soit muni d'un système d'engrenages qui réduit sa vitesse. On pourrait aussi utiliser un moteur pas à pas.

      Supprimer
  9. Merci pour tutoriel je voulais savoir comment faire tourner les deux moteurs en utilisant les mouvements des yeux pour une application sur les chaise roulants pour handicapés

    RépondreSupprimer
  10. Bonjour,
    Article terriblement interessant !
    Juste une question : je souhaite réaliser moi-même un dispositif capable de piloter le moteur de mon portail coulissant en modulant la vitesse en fin de course. Le circuit que vous présentez est adapté pour des petits ampérages. Pourriez-vous m'indiquer quel circuit équivalent ou additionnel il faudrait utiliser pour pouvoir supporter plusieurs ampères ?

    Merci et bravo !

    RépondreSupprimer
  11. Un grand merci pour ce tuto qui m'a motivé à commander mon premier Raspberry. J'ai suivi à la lettre les instructions que vous donnez, tout fonctionne à merveille ;)
    Par contre j'aimerai que le programme se répète à l'infini mais comment faire ???
    merci par avance pour votre aide

    RépondreSupprimer
    Réponses
    1. On peut placer les instructions qui doivent être répétées à l'intérieur d'une boucle "while True:".

      Supprimer
  12. Bonjour, êtes-vous certain que le rapport cyclique est un pourcentage ?
    D'autres programmes proposent un codage binaire (de 0 à 255).

    Merci par avance!

    RépondreSupprimer
    Réponses
    1. Si j'en crois mes propres mesures, la documentation de la bibliothèque RPi.GPIO et tout ce que j'ai eu l'occasion de lire sur le sujet: oui, j'en suis certain.

      Supprimer

Related Posts Plugin for WordPress, Blogger...