Aller dans tous les sens : Pilotage avancé d'un moteur à courant continu avec un pont en H

De Wiki L.A.B
Aller à : navigation, rechercher
Matériel
Principe

Jusqu'à présent nous avons commandé des moteurs à courant continu uniquement avec un seul transistor. Cette solution est suffisante tant que l'on n'a pas besoin de changer de sens de rotation. Pour changer de sens de rotation, il faut changer la polarité du courant.

Pour réaliser cette tache, il faut utiliser un montage spécial appelé pont en H :

Pont H.png

Le pont en H permet de choisir le sens du courant en fonction de l'état des 4 interrupteurs (ils peuvent être remplacés par des transistors) qui le composent. Pour comprendre le fonctionnement de ce pont en H (appelé ainsi à cause de sa forme), imaginons que l'on ferme les transistors 1 et 4 en laissant ouverts le 2 et le 3. Le courant passe de la gauche vers la droite.

Pont H sens 1.png

Si en revanche on fait le contraire (2 et 3 fermés et 1 et 4 ouverts), le courant ira dans l’autre sens.

Pont H sens 2.png

Le pont en H a d'autres configurations valides permettant de gérer le freinage du moteur.

Dans notre cas, nous n'allons pas câbler le pont en H mais nous allons directement utiliser le shield moteur. Ce shield est basé sur un L298 qui contient 2 ponts en H permettant de piloter des moteurs demandant une intensité maximale inférieure à 2A.

MotorShield R3 Front 450px.jpg

Le câblage du shield est le suivant :

Fonction Canal A Canal B
Direction Digital 12 Digital 13
Vitesse (PWM) Digital 3 Digital 11
Frein Digital 9 Digital 8
Intensité Analog 0 Analog 1
Montage

Le montage du shield revient juste à emboîter le shield dans l'arduino et à câbler les deux moteurs dans les borniers à vis étiquetés A et B.

MotorShield R3 Montage.jpg

Shield moteur bb.png

Programme

Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino.

const int vitesseMotA=3; // Constante pour la broche 3
const int sensMotA=12; // Constante pour la broche 12
const int freinMotA=9; // Constante pour la broche 9
const int intensiteMotA=A0; // intensité du moteur 0

const int vitesseMotB=11; // Constante pour la broche 11
const int sensMotB=13; // Constante pour la broche 13
const int freinMotB=8; // Constante pour la broche 8
const int intensiteMotB=A1; // intensité du moteur 1

void setup()   {
    
    Serial.begin(115200); 

    pinMode (vitesseMotA,OUTPUT); // Broche vitesseMotA configurée en sortie
    pinMode (freinMotA,OUTPUT); // Broche freinMotA configurée en sortie
    pinMode (vitesseMotB,OUTPUT); // Broche vitesseMotB configurée en sortie
    pinMode (sensMotA,OUTPUT); // Broche sensMotA configurée en sortie
    pinMode (sensMotB,OUTPUT); // Broche senMotB configurée en sortie
    digitalWrite(vitesseMotA,LOW); // a l'arret
    digitalWrite(sensMotA,LOW); 
    digitalWrite(freinMotA,LOW); // frein off 

    digitalWrite(vitesseMotB,LOW); // à l'arret 
    digitalWrite(sensMotB,LOW);  
    digitalWrite(freinMotB,LOW); // frein off

} 


void loop(){
    //------ test initial du moteur A ---- 
    //- sens 1
    digitalWrite(sensMotA,LOW); // sens 1
    digitalWrite(vitesseMotA, HIGH); // vitesse maximale
    delay(2000); // 2 secondes
    digitalWrite(vitesseMotA, LOW); // vitesse maximale
    
    //- sens 2
    digitalWrite(sensMotA,HIGH); // sens 2
    digitalWrite(vitesseMotA, HIGH); // vitesse maximale
    delay(1000); // 2 secondes
    Serial.println(analogRead(intensiteMotA)); 
    delay(1000); // 2 secondes
    digitalWrite(vitesseMotA, LOW); // vitesse maximale
    
    
    //------ test initial du moteur B ---- 
    //- sens 1
    digitalWrite(sensMotB,LOW); // sens 1
    digitalWrite(vitesseMotB, HIGH); // vitesse maximale
    delay(2000); // 2 secondes
    digitalWrite(vitesseMotB, LOW); // vitesse maximale
    
    //- sens 2
    digitalWrite(sensMotB,HIGH); // sens 2
    digitalWrite(vitesseMotB, HIGH); // vitesse maximale
    delay(1000); // 2 secondes
    Serial.println(analogRead(intensiteMotB)); 
    delay(1000); // 2 secondes
    digitalWrite(vitesseMotB, LOW); // vitesse maximale
    
    //---- test vitesse variable moteur A --- 
    
    for (int i=0; i<=255; i++) {
      analogWrite(vitesseMotA,i); // PWM croissant
      delay(50); // pause
      Serial.println(analogRead(intensiteMotA)); 
    
    }
    
    for (int i=0; i<=255; i++) {
      analogWrite(vitesseMotA,255-i); // PWM décroissant
      delay(50); // pause
      Serial.println(analogRead(intensiteMotA)); 
    }
    
    //---- test vitesse variable moteur B --- 
    
    for (int i=0; i<=255; i++) {
      analogWrite(vitesseMotB,i); // PWM croissant
      delay(50); // pause
      Serial.println(analogRead(intensiteMotB)); 
    
    }
    
    for (int i=0; i<=255; i++) {
      analogWrite(vitesseMotB,255-i); // PWM décroissant
      delay(50); // pause
      Serial.println(analogRead(intensiteMotB)); 
    
    }
     
    while(1); // stop loop
}