Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Autres constituants d’un robot > Les circuits spécialisés > Les contrôleurs de moteur > Moteur pas-à-pas piloté par un shield L293

Moteur pas-à-pas piloté par un shield L293

jeudi 27 décembre 2012, par Julien H.

Les contrôleurs de moteur pas-à-pas comme le L293 reproduisent avec une tension d’alimentation spécifique (plus élevée, avec un courant disponible plus important) les consignes transmises depuis un contrôleur avec une tension plus faible (3.3 volts ou 5 volts et surtout un courant faible).

La difficulté présentée ici provient de l’électronique ajoutée dans la conception des cartes d’extension qui facilitent la connexion. Pour éviter d’avoir à gérer 6 signaux (deux "Enable" qui activent ou désactivent le pont, et deux pattes par bobine), les entrées sont arrangées pour changer de sens.

Pour les moteurs à courant continu, c’est parfait. Pour les moteurs pas-à-pas, c’est plus délicat car la majorité des codes disponibles partent du principe que les 4 fils sont pilotables indépendamment. Difficulté supplémentaire pour les débutants, il y a bien 4 fils sur ces cartes et la confusion est grande.

Si vous disposez d’un circuit pont en H seul sans carte électronique, c’est cet article qu’il vous faut.

 Matériel nécessaire

- un shield contrôleur de moteur DFRobot L293 1A
- une Arduino ou similaire
- un moteur pas à pas bipolaire biphase (récupération)
- un câble et un ordinateur pour programmer (une Raspberry Pi par exemple)

Pour l’usage standard, vous trouverez des informations intéressantes sur mon club élec.

 Branchement

Il faut que les deux fils correspondant aux extrémités de la même bobine soient connectés. Comme généralement ces cartes d’extensions ont des borniers séparés ou avec une indication visuelle, peu de risque de se tromper mais encore faut-il connaître quels fils sont liés à une bobine : l’utilisation d’un ohmmètre permettra de les identifier (ceux qui ont une résistance non infinie sont ensemble).

JPEG - 487.1 ko

Ensuite, on pilote les pattes "vitesse" ou "speed" avec une valeur de puissance qu’on veut faire passer dans la bobine (avec une sortie PWM par exemple) et les pattes "direction" servent à changer le sens du courant qui passe dans la bobine.

 Résultat

Pour déterminer la séquence des orientations de courant et du démarrage / arrêt du courant dans les bobines, on se reportera à cet article sur la compréhension des pas d’un moteur.

Oui, ça fonctionne ! On peut donc piloter un moteur pas-à-pas avec un shield L293 en mode vitesse/direction.

 Code source pour pas entiers


/**
* Utilisation d’un shield DFRobot à base de L293B
* pour piloter un moteur pas à pas bipolaire (4 fils)
* aussi appelé "bipolar stepper motor" en anglais
*
* (c) Julien Holtzer / Pobot 2012
*
* version simple pour tester un moteur dans un seul sens
*/

// les sorties utilisées de l’Arduino (voir documentation Zartronic.fr)
// on conserve les appellations d’origine bien que les pattes "speed"
// (ou vitesse en anglais) ne servent pas à controler la vitesse du moteur
// mais la puissance libérée sur les bobines du pas-à-pas
#define SPEED_A 5
#define SPEED_B 6
#define DIR_A 4
#define DIR_B 7

// les variables

int vitesse = 200 ;
int puissance = 250 ;

// la vitesse est le temps entre chaque pas (ms)

// la puissance est la valeur PWM (entre 0 et 255)
// générée sur les pattes d’activation (enable L293 ou "speed" du shield)

void setup()

Serial.begin(9600) ;

pinMode(SPEED_A,OUTPUT) ;
pinMode(SPEED_B,OUTPUT) ;
pinMode(DIR_A,OUTPUT) ;
pinMode(DIR_B,OUTPUT) ;

// on démarre sans rien activer
digitalWrite(SPEED_A,LOW) ;
digitalWrite(SPEED_B,LOW) ;
digitalWrite(DIR_A,LOW) ;
digitalWrite(DIR_B,LOW) ;

delay(1000) ;

void loop()

Serial.println("__") ;

// on commande la direction pour orienter la magnétisation de chacune
// des deux bobines du moteur "stepper"
// donc les bobines A et B peuvent etre éteintes (off), haut et bas

// faites un schéma en représentant A comme axe des abcisses, B comme axe des ordonnées
// et bas comme -1, off comme 0 et haut comme 1

// ci-dessous, on utilise analogWrite pour générer le signal PWM
// de puissance et digitalWrite pour arreter la bobine mais on aurait pu
// écrire analogWrite(...,0) aussi bien.

// A off B haut
digitalWrite(SPEED_A,LOW) ;
analogWrite(SPEED_B,puissance) ;
digitalWrite(DIR_B,HIGH) ;
delay(vitesse) ;

// A haut B off
analogWrite(SPEED_A,puissance) ;
digitalWrite(SPEED_B,LOW) ;
digitalWrite(DIR_A,HIGH) ;
delay(vitesse) ;

// A off B bas
digitalWrite(SPEED_A,LOW) ;
analogWrite(SPEED_B,puissance) ;
digitalWrite(DIR_B,LOW) ;
delay(vitesse) ;

// A bas B off
analogWrite(SPEED_A,puissance) ;
digitalWrite(SPEED_B,LOW) ;
digitalWrite(DIR_A,LOW) ;
delay(vitesse) ;


 Code source pour demi-pas


//

#define SPEED_A 5
#define SPEED_B 6
#define DIR_A 4
#define DIR_B 7

int vitesse = 20 ;

int puissance = 250 ;

void setup()

Serial.begin(9600) ;

pinMode(SPEED_A,OUTPUT) ;
pinMode(SPEED_B,OUTPUT) ;
pinMode(DIR_A,OUTPUT) ;
pinMode(DIR_B,OUTPUT) ;

digitalWrite(SPEED_A,HIGH) ;
digitalWrite(SPEED_B,HIGH) ;
digitalWrite(DIR_A,HIGH) ;
digitalWrite(DIR_B,HIGH) ;

delay(1000) ;

digitalWrite(SPEED_A,LOW) ;
digitalWrite(SPEED_B,LOW) ;
digitalWrite(DIR_A,LOW) ;
digitalWrite(DIR_B,LOW) ;

delay(1000) ;

void loop()

Serial.println("__") ;

// A off B haut
Serial.print("A") ;
digitalWrite(SPEED_A,LOW) ;
analogWrite(SPEED_B,puissance) ;
digitalWrite(DIR_B,HIGH) ;
delay(vitesse) ;

// A haut B haut
Serial.print("*") ;
analogWrite(SPEED_A,puissance) ;
digitalWrite(DIR_A,HIGH) ;
delay(vitesse) ;

// A haut B off
Serial.print("B") ;
digitalWrite(SPEED_B,LOW) ;
delay(vitesse) ;

// A haut B bas
Serial.print("*") ;
digitalWrite(SPEED_B,puissance) ;
digitalWrite(DIR_B,LOW) ;
delay(vitesse) ;

// A off B bas
Serial.print("C") ;
digitalWrite(SPEED_A,LOW) ;
delay(vitesse) ;

// A bas B bas
Serial.print("*") ;
analogWrite(SPEED_A,puissance) ;
digitalWrite(DIR_A,LOW) ;
delay(vitesse) ;

// A bas B off
Serial.print("D") ;
digitalWrite(SPEED_B,LOW) ;
delay(vitesse) ;

// A bas B haut
Serial.print("*") ;
analogWrite(SPEED_B,puissance) ;
digitalWrite(DIR_B,HIGH) ;
delay(vitesse) ;


On peut faire encore bien autrement selon qu’on veut piloter plus facilement le sens de rotation et la vitesse. A vous de nous envoyer vos codes et de partager le résultat de vos tests ! Même les astuces les plus simples peuvent rendre d’énormes services. Pensez aux autres même si vous avez fini votre projet.

Vos commentaires

  • Le 27 décembre 2012 à 20:05, par alban En réponse à : Moteur pas-à-pas piloté par un shield L293

    Super ...Merci pour le code ..J’avais besoin de cet article pour m’essayer sur quelque chose de relativement simple avant d’attaquer quelque chose de plus costaud....
    Je fais le test sur un L298 et je t’envoie mes resultats

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document