Le but de cet article est de reproduire rapidement une expérience simple : faire tourner un moteur électrique à courant continu ou un moteur pas-à-pas (tels que ceux qu’on récupère dans des imprimantes) avec un composant simple et peu cher. Bien sûr, il faut adapter votre choix de pont en H selon la puissance nécessaire : un gros moteur aura besoin d’un pont plus important (tel le L298).
Pas de grande théorie sur les ponts en H, mais juste un rappel : les moteurs électriques que nous allons utiliser font tourner un aimant en faisant circuler un courant dans des bobines. Un contrôleur de moteur est donc un composant de puissance capable d’alimenter un moteur électrique en fonction des consignes (le contrôle) que vous lui donnez.
Si vous disposez d’une carte électronique intégrant ce pont en H, c’est plutôt cet article qu’il vous faut.
Le circuit intégré
Nous utilisons le composant L293D (à 3€ chez Zartronic) intégrant les diodes de roue libre (le "D" derrière le L293) qui protègent le circuit et évitent d’avoir à rajouter d’autres composants. Il y a un équivalent, le SN754410 (à 2,30$ chez Sparkfun) qui permet de faire passer plus de courant en étant entièrement compatible.
Ces deux circuits intègrent 4 contrôleurs indépendants acceptant en entrée la consigne (actif ou inactif, comme un interrupteur), et reproduisant en sortie l’alimentation correspondante (0 volts ou tension d’entrée "puissanc" différente de la tension "logique" du signal en entrée).
Chaque sortie doit être reliée à une extrémité d’une bobine. Dans le cas d’un moteur à courant continu, il suffit de 2 sorties associées (l’une fermée lorsque l’autre est ouverte) pour faire tourner le moteur dans un sens ou dans l’autre. Avec un seul CI, on fait ainsi fonctionner deux moteurs (utile pour un robot mobile simple comme le muPobot.
Vous trouverez la documentation technique dans cette rubrique (lien corrigé, merci).
Il existe des alternatives à ce montage "fait à la main", comme l’utilisation d’un circuit de puissance intégré à la carte Arduino Romeo ou utiliser une extension Arduino ("motor shield") telle qu’on en trouve sur Zartronic.fr.
Le schéma de test
Cet article sert aussi de démonstration d’utilisation de Fritzing pour des circuits simples.
Voici pour un moteur à courant continu :
Comme vous le constatez en lisant la "datasheet" (doc technique), on utilise les deux sorties 3 et 4 (juste pour que le schéma soit lisible, ça marche de la même manière pour 1 et 2. Chacune de ces sorties "de puissance" (tension pour les moteurs) est contrôlée par une entrée "logique" (tension pour les signaux) qui est connectée à la carte programmable Arduino.
Mais vous remarquerez qu’une troisième connexion est utilisée entre la carte et le contrôleur de moteur, reliée à l’entrée "Enable 3,4" qui correspond à l’activation des sorties, indépendamment des entrées. Cette activation peut changer très vite, et pour un moteur à courant continu elle va permettre de faire varier la vitesse (merci à Christophe pour ce complément).
Voici pour un moteur pas à pas :
Code source
Pour le moteur à courant continu
#define PILOT_A 11 // entrée A du pont en H
#define PILOT_B 12 // entrée B du pont en H
#define PILOT_PWM 6 // entrée "Enable" du pont en H
void direction (byte dir)
if (dir == 0)
digitalWrite (PILOT_A, HIGH) ;
digitalWrite (PILOT_B, LOW) ;
else
digitalWrite (PILOT_A, LOW) ;
digitalWrite (PILOT_B, HIGH) ;
void setup()
pinMode(PILOT_A, OUTPUT) ;
pinMode(PILOT_B, OUTPUT) ;
pinMode(PILOT_PWM, OUTPUT) ;
direction(0) ;
void loop()
int valeur = analogRead(0) ;
analogWrite(PILOT_PWM, analogRead(0)*2) ;
Pour le moteur pas à pas
/**
* Controle d’un moteur pas à pas avec un L293D sur protoshield
* (montage classique)
*
* (c) Julien Holtzer et Frédéric Rallo / Pobot 2012
*/
void setup()
Serial.begin(9600) ;
// les déclarations des 4 pattes de controle des bobines
pinMode(4,OUTPUT) ;
pinMode(5,OUTPUT) ;
pinMode(6,OUTPUT) ;
pinMode(7,OUTPUT) ;
// la patte d’enable
pinMode(12,OUTPUT) ;
analogWrite(12,250) ;
int TEMPS = 2000 ;
void loop()
Serial.println("..") ;
// A off, B haut
digitalWrite(4,LOW) ;
digitalWrite(5,LOW) ;
digitalWrite(6,LOW) ;
digitalWrite(7,HIGH) ;
delay(TEMPS) ;
// A haut, B off
digitalWrite(4,LOW) ;
digitalWrite(5,HIGH) ;
digitalWrite(6,LOW) ;
digitalWrite(7,LOW) ;
delay(TEMPS) ;
// A off, B bas
digitalWrite(4,LOW) ;
digitalWrite(5,LOW) ;
digitalWrite(6,HIGH) ;
digitalWrite(7,LOW) ;
delay(TEMPS) ;
// A bas, B off
digitalWrite(4,HIGH) ;
digitalWrite(5,LOW) ;
digitalWrite(6,LOW) ;
digitalWrite(7,LOW) ;
delay(TEMPS) ;