14 Mars 2014


Arduino leçon 17 : moteurs pas-à-pas

Un moteur pas à pas tourne sur commande d'un angle précis.
pas FB

le principe

moteur unipolaire

C'est le type de moteur utilisé actuellement. Chaque branche du solénoïde comprend deux enroulement dont un seul est actif à la fois, permettant de présenter à l'aimant permanent du rotor soit un pôle Nord, soit un pôle Sud.
Par exemple dans ce schéma chaque enroulement présentera au rotor un pôle différent selon la broche reliée à la masse.

principe du pas à pas

Les électroaimants sont alimentés sur commande et permettent de bloquer le moteur sur une position fixe ou de le faire tourner d'1/4 de tour à la fois.
disposition réelle :

principe du pas-à-pas


Dans le boîtier du moteur, un engrenage démultiplie l'angle de rotation.
Un pas correspond donc à 1/4 de tour du rotor mais à une toute petite fraction de tour de l'axe de sortie. Il semble qu'il faut 4096 pas pour faire un tour.

moteur ouvert

1er montage


D'abord, on oublie le moteur et on construit un chenillard de 4 led sur les broches 2 à 5 avec un delay(250) pour chacune.
ATTENTION : contrairement à notre habitude, on met les led entre le +5 et Arduino.


La mise au point se fait en 2 temps :
- on met dans la boucle un délai assez long pour avoir le temps de visualiser l'éclairement et l'extinction de chaque led
- on mettra ensuite un délai beaucoup plus court adapté à nos besoins.
REMARQUE : entre chaque ordre envoyé au moteur, il faut lui laisser le temps d'exécuter l'ordre. Le délai ne sera jamais de moins de 10 ms.

       /*         pas_a_pas.ino
                essai moteur pas à pas
                on relie les broches 2 à 5 d'Arduino aux leds
        */
       
        byte numPin;
       
        void setup()        {
                for ( numpin=2 ; numpin<6 ; nupin++){
                        pinMode ( i, OUTPUT) ;
                        digitalWrite( numpin, HIGH);
                }
        numPin = 2;
        }
       
        void loop()        {
                digitalWrite( numPin, LOW);
                delay(250); // qu'on remplacera par 10 après mise au point
                digitalWrite( numPin, HIGH);
                numPin++;
                if (numPin==6) {
                        numPin=2;
                }
        }

2ème montage

Dans le montage précédent, on ajoute 4 fils partant des broches d'Arduino et arrivant au connecteur du moteur. Le fil rouge est relié au +5.
On commence avec un délai de 250 ms puis on passe à 10 ms.
Ça marche à vide, mais sans aucun couple. Les sorties d'Arduino n'ont pas assez de puissance.

3ème montage

On peut relier 4 sorties d'Arduino à des transistors de puissance qui commandent les entrées du moteur.
Le circuit intégré ULN2003 en contient 7 dans la même puce. On en utilise 4 et on ignore les 3 autres.

carte driver

Les 4 entrées sont relièes à la carte Arduino, les 4 sorties et l'alim au moteur par le connecteur blanc.
Les led servent à visualiser la sortie alimentée à chaque instant.
L'alimentation de la carte se fait par les broches en bas de la photo. On les relie au +5 et à la GND d'Arduino.
Utilisez ce composant sans modifier votre programme sauf le délai qui revient à 250 ms.
Regardez ce qui se passe pour les led de la carte.

Que se passe-t-il quand 3 led sont éclairées et 1 éteinte ?
Réponse :
3 bobines sont alimentées en même temps. Deux agissent en senc contraire d'où gaspillage d'énergie et échauffement du moteur.

modification du programme

Le problème qu'on vient de découvrir est dû au rôle des transistors intégrés dans le ULN2003 : ils inversent les tensions.
On va faire une modification pour en tenir compte.
On déclare une variable qu'on mettra à 0 ou à 1 selon le type de montage. Ça évite de changer toutes les lignes qui commandent une sortie d'Arduino.

       /*         pas_a_pas_direct.ino
                utilisation du moteur pas à pas avec la variable "direct"
        */
        #define direct 1 // directive pour le compilateur. Pas de "=" ni de ";"
        byte numPin;
       
        void setup()        {
                for ( numpin=2 ; numpin<6 ; nupin++){
                        pinMode ( i, OUTPUT) ;
                        digitalWrite( numpin, direct);
                }
        numPin = 2;
        }
       
        void loop()        {
                digitalWrite( numPin, 1-direct );
                delay(250); // qu'on remplacera par 10 après mise au point
                digitalWrite( numPin, direct);
                numPin++;
                if (numPin==6) {
                        numPin=2;
                }
        }

On constate que le moteur a plus de couple qu'avant, mais il n'est toujours pas très puissant.

4ème montage

on utilise une alimentation extérieure
Par rapport au montage précédent, la seule différence est que les 2 fils d'alimentation de la petite carte ne viennent plus d'Arduino mais d'une alimentation extérieure réglée sur 5 volts parce que c'est la tention réclamée par le moteur. On peut lire sur le connecteur de la carte driver qu'elle peut fonctionner avec des tensions de 5 à 12 Volts.
La différence de couple est remarquable.

5ème montage

POur éviter d'avoir 3 bobines actives en même temps, on remplace notre carte driver par un autre modélè appelé double pont en H. Il évite d'envoyer au moteur 2 flux contraires sur la même branche.

La logique interne de ce driver est différente de celle du 1er utilisé, mais il s'utilise exactement de la même manière et avec le même programme.

module double pont en H

branchements du double pont

On utilise une alim extérieure donnant la tension réclamée par le moteur,
le + va sur VCC du connecteur et sur le(s) fil(s) d'alimentation du moteur
la masse de l'alim sur la borne GND du connecteur du bas.
dans certains cas, il peut être utile de relier cette masse à celle d'Arduino. En général c'est inutile.
les entrées (petit connecteur male) vont sur les broches 2 à 5 d'Arduino
les sorties (connecteurs latéraux) vont sur les phases du moteur.

cablage des phases du driver vers le moteur 28BYJ-48 :
out1 rose
out2 orange
out3 jaune
out4 bleu

Quelques compléments

Cette partie est destinée à ceux qui veulent approfondir. Vous pouvez l'ignorer.
Les ordres qu'Arduino peut envoyer à un moteur "normal" sont
- démarre
et
- arrête toi

Le seul ordre qu'Arduino peut envoyer à un moteur pas-à-pas est
- avance d'un pas
mais cet ordre peut être envoyé un très grand nombre de fois.

Double pont en H

Voici des liens pour mieux le comprendre
premier lien
deuxième lien
troisième lien

Moteur pas-à-pas

On peut augmenter le couple du moteur en activant 2 bobinages à la fois.
Dans le dessin ci-dessous, la bobine A met le moteur en position 1, la bobone B le met en position 3.
Les 2 ensemble le placent en position 2 avec plus de force puisque 2 bobines agissent en même temps. C'est le deuxième tableau

On peut aussi augmenter la précision en utilisant les tous les demi-pas donc les pas du tableau 1 et ceux du tableau 2. On a alors 8 pas par tour. C'est visible sur le tableau 3 qui est la réunion des deux premiers.

schéma des 8 pas séquence 1 2 3 4 Séquence de commande normale pour 4 pas entiers
séquence 5 6 7 8 Séquence de commande pour 4 pas entiers avec couple fort
demi-pas Séquence de commande pour 8 demi-pas (couple irrégulier)

Ces schémas viennent de cette page sur laquelle vous pouvez trouver plus de détails.




un peu de software

Nous savons déjà que nous écrivons des programmes source en langage C et que ceux ci sont transformés en langage objet qui est une suite de codes binaires compris par la carte Arduino.
L'ensemble de programmes qui effectue cette transformation est le compilateur.

Le préprocesseur

C'est le premier de ces programmes. Il s'exécute avant la traduction. Il lit chaque ligne pour en vérifier la syntaxe et s'arrête quand une ligne est incompréhensible. Il a aussi un autre rôle : gérer les lignes qui commencent par un #.

# include<machin.h>      le préprocesseur va chercher machin.h dans la bibliothèque et l'ajoute à votre programme avant                                                        la compilation.

# include"truc.h"            idem, mais il cherche truc.h dans votre répertoire au lieu d'aller dans la bibliothèque.
                                       Rappelez vous l'utilisation de mesNotes.h .

# define chouette 88      dans tout le programme source, il remplace la variable chouette par la valeur 88.



haut de la page
flèche gauche Retour à la leçon 16 : révisions           leçon 18 : la liaison SPI flèche droite