Aller dans tous les sens : Pilotage avancé d'un moteur à courant continu avec un pont en H : Différence entre versions
(Une révision intermédiaire par le même utilisateur non affichée) | |||
Ligne 7 : | Ligne 7 : | ||
===== Principe ===== | ===== Principe ===== | ||
− | Jusqu'à présent nous avons commandé des moteurs à courant continu | + | Jusqu'à présent nous avons commandé des moteurs à courant continu avec uniquement 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 | 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. | rotation, il faut changer la polarité du courant. | ||
Ligne 25 : | Ligne 25 : | ||
[[Fichier:Pont H sens 2.png]] | [[Fichier:Pont H sens 2.png]] | ||
− | Le pont en H a d'autres configurations valides permettant de | + | 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 | 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 |
Version actuelle en date du 4 janvier 2016 à 16:04
Sommaire
Matériel
- Arduino Uno
- Plaque d'essai (breadboard)
- Straps ou fils de liaison
- 1 moteur à courant continu 5v
- 1 Arduino Motorshield (http://arduino.cc/en/Main/ArduinoMotorShieldR3)
Principe
Jusqu'à présent nous avons commandé des moteurs à courant continu avec uniquement 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 :
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.
Si en revanche on fait le contraire (2 et 3 fermés et 1 et 4 ouverts), le courant ira dans l’autre sens.
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.
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.
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
}