dimanche 7 septembre 2014

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

Cet article a été mis à jour le 1er novembre 2020, afin d'être pleinement compatible avec Python 3.

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 broches 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 broches 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 broches 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 broches 4, 5, 12 et 13 du L293D doivent toutes être reliées à la masse (les broches GND) du Raspberry Pi (la broche numéro 6, par exemple).  Comme tous les circuits intégrés, le L293D doit être alimenté, et c'est la broche16 qui est désignée pour recevoir cette alimentation.  Une des sorties 5 V du Raspberry Pi (la broche 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 broche 8 du L293D.  Mais attention:  il n'est pas du tout conseillé d'utiliser les broches 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 broche 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 broches situées du côté gauche du CI sont réservées au premier moteur, et les broches 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 broches 3 et 6 du L293D.



La broche 1 du L293D est la broche "enable" (activation) du premier moteur.  Le moteur tournera à sa vitesse maximale si cette broche 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 broche à 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 broche 1 du L293D à la broche 22 du Raspberry Pi,

Il reste deux autres broches du L293D à raccorder au Raspberry Pi:  le moteur tournera dans un sens lorsque la broche 2 sera soumise au signal logique "HAUT"  et la broche 7 sera soumise au signal logique "BAS", et tournera dans l'autre sens si la broche 2 est à "BAS" pendant que la broche 7 est à "HAUT". Branchez la broche 2 du L293D à la broche 18 du Raspberry Pi, et la broche 7 du L293D à la broche 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.





Deux moteurs

Vous pouvez ajouter un deuxième moteur si le coeur vous en dit.  Le moteur se branche aux broches 11 et 14 du L293D.  On peut ensuite brancher la broche 9 du L293D à la broche 23 du Raspberry Pi, la broche 10 du L293D à la broche 21 du Raspberry Pi, et la broche 15 du L293D à la broche 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)

30 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
  13. Nous apprécions l'utilisation de la carte de puissance sans avoir besoin d'un alimentation exteerieur de 12 V
    et mrc d'avance

    RépondreSupprimer
  14. merci pour ce tuto interessant et bien expliqué, cet exemple pourra t-il servir de projet pour le fonctionnement de petits moteurs de drone.

    RépondreSupprimer
  15. bjr je cherche à faire tourner mes moteurs a des vitesses variables selon mes commandes et je ne voit pas comment faire pouvez vous m'aider ??

    RépondreSupprimer
  16. J'ai essayé, ca marche jusqu'à un certain point: le moteur que j'ai utilisé marche avec une pile 1.5volt mais là simplement un bruit de vrombissement sans meme que le moteur tourne, en aidant un peu le moteur à la main, il arrive parfois à faire un ou deux tours puis s'arrète complètement (sauf le vrombissement). J'ai essayé de pousser à 3piles de 1volt5 (soit 4.5v) et là toujours parreil. J'ai regardé le courrant qui passe avec un voltmètre, ca va pas très haut. Une idée ou une explication sur cette problématique ?

    RépondreSupprimer
  17. bonjour, je souhaiterai savoir s’il est possible de faire un programme python similaire et qu’il fasse tourner un moteur virtuellement?

    RépondreSupprimer
  18. bonsoir
    je souhaitrai calculer la vitesse (en rpm) les données sont acquises à l'aide de l'encodeur de 12 comptes par tour et à chaque periode je varie l'alimentation jusqu'à l'arrivé à 19 rpm ( vitesse nominale est de l'ordre de 4000 rpm à 12 V ) merci de me donner le code en python et merci d'avance .

    RépondreSupprimer