mercredi 10 décembre 2014

Contrôle d'un moteur pas à pas par un Raspberry Pi

Cet article a été mis à jour le 15 novembre 2020 pour rendre le script compatible avec Python 3.

Aujourd'hui, je vous explique comment commander un moteur pas à pas au moyen d'un Raspberry Pi.

(Si vous cherchez plutôt à contrôler un simple moteur à courant continu à partir du Raspberry Pi, je vous suggère plutôt la lecture de cet article.)

En plus d'un Raspberry Pi et d'un moteur pas à pas (qu'on peut facilement trouver à l'intérieur d'une vieille imprimante), vous aurez besoin d'un L293D, qui est un circuit intégré spécialement conçu pour piloter un moteur, et d'une source d'alimentation continue pour le moteur (une pile, par exemple).

Le courant nécessaire pour faire tourner le moteur est trop intense pour que ce dernier puisse être directement branché aux broches GPIO du Raspberry Pi.  Le rôle du L293D sera donc, en gros, de faire circuler des courants intenses dans le moteur au moyen de la source d'alimentation, en conformité avec les instructions que lui fournira le Raspberry Pi.

Le moteur:  bipolaire ou unipolaire?

Votre moteur pas à pas peut comporter 4, 5 ou 6 fils.

S'il comporte 4 fils, il s'agit d'un moteur bipolaire.  Deux des fils sont branchées aux extrémités d'une même bobine (située à l'intérieur du moteur), et les deux autres fils sont aux extrémités d'une deuxième bobine.

Au moyen d'un multimètre, il est facile de déterminer quels fils partagent la même bobine.   Par exemple, un de mes moteurs est muni de 4 fils: jaune, orange, brun et noir. La résistance entre le fil jaune et le fil orange est de 31 ohms, et la résistance entre le fil brun et le fil noir est de 31 ohms également. La résistance est infinie pour toutes les autres combinaisons de fils (jaune-noir, jaune-brun, orange-noir, orange-brun). Je peux en déduire qu'une des bobines est alimentée par le fil jaune et le fil orange, et que l'autre bobine est alimenté par le fil brun et le fil noir.

Pour les moteurs unipolaires, les choses se compliquent un peu: chacune des deux bobines est munie de 3 fils: un à chaque extrémité, et un au centre. De plus, il est fréquent que le centre des deux bobines soit branché au même fil.

Par exemple: J'ai un moteur qui comporte 6 fils. La résistance entre le fil 1 et le fil 3 est de 70 ohms, la résistance entre le fil 1 et le fil 5 est de 140 ohms: ces trois fils partagent le même bobinage et le fil 3 est au centre. Un lien similaire existe entre les fils 2, 4 et 6.

Autre exemple: j'ai un moteur muni de 5 fils: blanc, jaune, noir, rouge, brun. La résistance est de 80 ohms entre le fil noir et n'importe quel autre fil, alors qu'elle est de 160 ohms pour toutes les autres paires de fil. J'en déduis que le fil noir est relié au centre des deux bobinages. Mais comment savoir quel fil (parmi jaune, rouge et brun) partage le même bobinage que le fil blanc? Il faudra faire des essais: si on branche les fils de façon incorrecte, le moteur ne tournera pas aussi bien qu'il le devrait (il s'agira alors de permuter les fils jusqu'à ce que le moteur fonctionne correctement).

Le circuit

Le L293D est capable de faire circuler le courant dans les deux sens à travers les bobinages:  il fonctionne donc à la perfection peu importe que votre moteur soit unipolaire ou bipolaire (en fait, si votre moteur est unipolaire, nous n'auront même pas à brancher le ou les fils qui communiquent avec le centre des bobinages:  seuls les 4 fils correspondant aux extrémités des bobinages seront nécessaires).

Voici le circuit (vous pouvez cliquer sur l'image pour l'agrandir...):


  • La pin 1 du L293D est branchée au 5 V du Raspberry Pi
  • La pin 2 du L293D est branchée à la pin GPIO 22 (board 15) du Raspberry Pi
  • La pin 3 du L293D est branchée à une extrémité du premier bobinage du moteur
  • La pin 4 ou la pin 5 du L293D est branchée à la masse (GND) du Raspberry Pi
  • La pin 6 du L293D est branchée à l'autre extrémité du premier bobinage du moteur
  • La pin 7 du L293D est branchée à la pin GPIO 23 (board 16) du Raspberry Pi
  • La pin 8 du L293D est branchée à la borne positive de l'alimentation du moteur (la borne négative de cette alimentation est reliée à la masse GND).
  • La pin 9 du L293D est branchée au 5 V du Raspberry Pi
  • La pin 10 du L293D est branchée à la pin GPIO 25 (board 22) du Raspberry Pi
  • La pin 11 du L293D est branchée à l'exrémité du deuxième bobinage du moteur
  • La pin 12 ou la pin 13 du L293D est branchée à la masse (GND) du Raspberry Pi
  • La pin 14 du L293D est branchée à l'autre extrémité du deuxième bobinage du moteur
  • La pin 15 du L293D est branchée à la pin GPIO 24 (board 18) du Raspberry Pi
  • La pin 16 du L293D est branchée au 5 V du Raspbery PI

Si votre moteur est unipolaire (5 ou 6 fils) le ou les fils relié(s) au centre des bobines n'ont pas à être branchés.


Programme en Python

Ce script vous demande le délai (en millisecondes) qui s'écoulera entre chaque pas du moteur.  Plus ce délai est long, plus le moteur tournera lentement.  Pour une rotation rapide, un  délai d'environ 10 millisecondes devrait faire l'affaire (si le délai est trop court, le moteur ne tourne pas).  Avec un délai de 1000 millisecondes, le moteur tourne d'un pas à chaque seconde, un peu comme la trotteuse d'une horloge.

Le programme vous demande ensuite le nombre de pas que devra effectuer le moteur.  Vous pouvez écrire un nombre positif pour une rotation en marche avant, et un nombre négatif pour une rotation en marche arrière.

-
-

Références:

Je me suis inspiré de cet article sur le site d'Adafruit, et de celui-ci sur le blog Raspberry Pi Spy.  Et au bout du compte, comme d'habitude, je n'ai fait qu'à ma tête.

Yves Pelletier (Twitter:  @ElectroAmateur)

5 commentaires:

  1. excellente introduction, je vais me lancer. Merci d'avoir cité vos source PI Spy est également très instructif.

    RépondreSupprimer
  2. C'est un bon travail mais je veux faire un projet de fin d'études,ce projet consiste de fair un support d'un tv qui suivi la position d'un persone situé dans la chambre donc une camera et raspberry et moteur pas apas... j ai besoin d aide

    RépondreSupprimer
  3. Bonjour,
    il y a une inversion des gpio 24 et 25 entre le schéma et la description. Ca change juste le sens de rotation.

    RépondreSupprimer
    Réponses
    1. Jai besoins daide pour programmer mon moteur pas a pas avec larspberry pi qui tourne a droit et agouche

      Supprimer
  4. excellente introduction, je vais me lancer. Merci d'avoir cité vos source PI Spy est également très instructif.

    RépondreSupprimer