samedi 23 février 2013

Contrôler la vitesse d'un moteur pas à pas au moyen d'un potentiomètre (Arduino)

L'objectif:  utiliser un Arduino pour contrôler la vitesse de rotation d'un moteur pas à pas au moyen d'un potentiomètre (ou d'un joystick):  lorsque le potentiomètre se trouve à sa position centrale, le moteur ne tourne pas.  Il tourne de plus en plus rapidement dans le sens horaire à mesure qu'on tourne le potentiomètre dans une direction, et tourne de plus en plus rapidement dans le sens antihoiraire à mesure qu'on tourne le potentiomètre dans l'autre direction.

La Stepper Library est accompagnée d'un exemple intitulé "stepper_speedControl" qui accomplit à peu près cette tâche, sauf que le moteur tourne toujours dans la même direction (la vitesse est nulle à une position extrême du potentiomètre, et maximale à l'autre position extrême).  Au départ, j'ai supposé que ma tâche consistait à apporter quelques modifications mineures à ce sketch pour obtenir le comportement souhaité.
Malheureusement, cette première approche n'a pas très bien fonctionné.  L'exemple "stepper_speedControl" règle la vitesse au moyen de la routine "setSpeed" de la Stepper Library.   Malheureusement, tel qu'indiqué dans l'entête de l'exemple, l'Arduino est lent à répondre aux commandes du potentiomètre lorsque setSpeed est réglé à une faible valeur.  Le pire, c'est lorsque qu'on règle setSpeed à zéro:  l'Arduino se met alors à attendre pendant un délai qui semble sans fin.  Inutile de modifier la position du potentiomètre:  l'Arduino ne la vérifiera même pas.

À la place, j'ai donc choisi de régler la vitesse de rotation sans utiliser setSpeed:  le moteur tourne d'un step à la fois, et la position du potentiomètre contrôle la durée du délai qui s'écoule entre deux rotations successives.  Le moteur se comporte exactement de la façon souhaitée.

Voici mon sketch:


Pour les branchements, du moteur au Arduino, vous suivez les instructions fournies ici pour un L293D ou ici pour un ULN2003.  Il ne reste plus qu'à ajouter un potentiomètre à l'entrée A0.

Yves Pelletier (Twitter: @ElectroAmateur)

vendredi 1 février 2013

Contrôle d'un moteur pas à pas avec un L293D (Arduino)

Voici un petit guide sur la façon de contrôler un moteur pas à pas au moyen d'un Arduino et d'un circuit intégré L293D.

1°  Le moteur:  bipolaire ou unipolaire?

Il existe deux types de moteurs pas à pas:  ceux qui sont bipolaires sont munis de 4 fils, et ceux qui sont unipolaires comportent 5 ou 6 fils. Les deux types de moteur peuvent être contrôlés sans problème avec un L293D.

2°  Identification des fils du moteur

Les moteurs bipolaires sont constitués de deux bobinages distincts; au moyen d'un multimètre, il est facile de déterminer quels fils partagent le même bobinage.  Si la résistance entre deux fils est faible (quelques ohms, ou quelques dizaines de ohms), c'est qu'ils partagent le même bobinage.  Si les deux fils font partie de bobinages différents, la résistance entre les deux fils est infinie.

Par exemple, j'ai un moteur bipolaire Mitsumi muni de 4 fils:  jaune, orange, brun et noir.  La résistance entre le fil jaune et le fil orange est de 31 Ω, et la résistance entre le fil brun et le fil noir est de 31 Ω é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 que le premier bobinage est alimenté par le fil jaune et le fil orange, et que le deuxième bobinage est alimenté par le fil brun et le fil noir.

Pour les moteurs unipolaires, c'est un peu plus compliqué:  chacun des deux bobinages est muni 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 de marque Brother qui comporte 6 fils.  La résistance entre le fil 1 et le fil 3 est de 70 Ω, la résistance entre le fil 1 et le fil 5 est de 140 Ω:  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 Mitsumi muni de 5 fils: blanc, jaune, noir, rouge, brun.  La résistance est de 80 Ω entre le fil noir et n'importe quel autre fil, alors qu'elle est de 160 Ω 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).

3° Connections du L293

Le circuit intégré L293D est muni de 16 pins, qui seront branchées de la façon indiquée sur le dessin ci-dessous.


  • La pin 16 est l'alimentation du L293D, la pin 1 est le "chip enable" du bobinage 1 et la pin 9 est le "chip enable" du moteur 2.  Vous branchez tout ça à la sortie 5 V de l'Arduino.
  • Si vous désirez utiliser les exemples fournis avec le logiciel Arduino sans trop de modifications, vous branchez les pins 2, 7, 10 et 15 aux sorties 8, 9, 10, 11 de l'Arduino (vous pouvez utiliser d'autres sorties de l'Arduino à la place:  il s'agira de modifier le sketch en conséquence).
  • Les pins 3 et 6 sont branchées aux deux extrémités d'un même bobinage du moteur.  Les pins 11 et 14 sont branchées aux deux extrémités de l'autre bobinage.  Si vous moteur est unipolaire, vous branchez le centre des deux bobinages à la pin 8 du L293D.
  • Pour éviter d'endommager votre Arduino, votre moteur devrait être alimenté au moyen d'une alimentation externe dont la borne positive est reliée à la pin 8 .   
  • Les 4 pins "GND" doivent être reliées ensemble (ainsi qu'au GND de l'Arduino et à la borne négative de l'alimentation externe du moteur).

4° Programmation de l'Arduino

Grâce à la librairie "stepper", la programmation de l'Arduino est triviale.  Dans le menu Fichier → Exemples → Stepper,  vous pouvez choisir "stepper_oneRevolution":  votre moteur fera un tour complet dans un sens, puis un tour complet dans l'autre sens (pour ce faire, il faut régler la variable "stepsPerRevolution" à la bonne valeur (qui est de 48 pour la majorité des moteurs que je possède).  Vous pouvez aussi utiliser l'exemple "stepper_oneStepAtATime" et compter le nombre de pas effectués par votre moteur pendant un tour complet.

5°  Et sur un MSP430 Launchpad?

Pour contrôler un moteur pas à pas avec le MSP430, un L293 et le logiciel Energia, vous suivez exactement les mêmes instuctions qu'avec l'Arduino, sauf que les sorties 8, 9, 10 et 11 de l'Arduino sont remplacées par les sorties P2.0, P2.1, P2.2 et P2.3 du Launchpad.  Évidemment la sortie 5 V de l'Arduino est remplacée par la sortie VCC du Launchpad, et le GND de l'Arduino est remplacé par le GND du Launchpad.  Il ne vous reste plus qu'à essayer les exemples fournis dans Energia:  File → Examples → Stepper.


À lire aussi:

Contrôle d'un moteur pas à pas avec un ULN2003

Yves Pelletier (Twitter: @ElectroAmateur)