Le Motor Shield ESP12E est une carte d’extension qui permet un NodeMCU ESP8266 Amica (V2) de piloter deux moteurs CC ou un moteur pas-à-pas. Nous avons vu comment piloter un moteur CC en utilisant un pont en H ce qui peut nécessiter beaucoup de branchement lorsqu’on utilise le circuit intégré simplement. Pour une application embarquée, comme un robot Willy, vous serez amené à piloter plusieurs moteurs en parallèle. Ils existent pour cela des Shields qui simplifieront le montage.
Matériel
- Ordinateur
- NodeMCU ESP8266 Amica (V2)
- Câble USB A Mâle/B Mâle
- Motor Shield ESP12E
- Moteur CC x2 ou Moteur pas-à-pas x1
Principe de fonctionnement
Le Motor Shield ESP12E utilise le double pont en H L293D. Il permet de piloter des moteurs en direction et en vitesse avec une tension nominale entre 5 et 36V et un courant de 600mA, jusqu’à 1.2A avec une source de tension extérieure.
Ce shield permet d’utiliser:
- jusqu’à deux moteurs à courant continu ou un moteur pas à pas bipolaire
- un capteur analogiques
- Les GPIO
- les bus I2C, SPI et UART
Schéma
Compatible avec la carte NodeMCU ESP8266 Amica, le shield se place directement sur le microcontrôleur. L’alimentation des moteurs se branche au bornier VM/GND et celle de la carte au bornier VIN/GND. Il est possible de relier les broche VIN et VM à l’aide d’un pont, si l’alimentation des moteurs est la même que l’alimentation du NodeMCU (<10V Max). Les moteurs se branchent sur les borniers A+,A-,B+,B-.
- D1, D3 (motor A/ Stepper 1,2)
- D2, D4 (motor B / Stepper 3,4)
- Entrées disponibles A0
- GPIO disponibles sur les broches 0 à 8
Dans le cas d’un shield, les branchements sont prédéfinis. Vérifiez bien dans la documentation technique du composant comment l’utiliser.
Les branchements des moteurs sont détaillés dans les schémas suivants.
Code de gestion d’un moteur CC
Pour interagir avec le Motor Shield ESP12E, nous n’utilisons pas de librairie particulière. Il vous est toujours possible de créer votre librairie pour simplifier votre code.
/* Board pin | NodeMCU GPIO | Arduino IDE A- 1 5 or D1 A+ 3 0 or D3 B- 2 4 or D2 B+ 4 2 or D4 */ const int pwmMotorA = D1; const int pwmMotorB = D2; const int dirMotorA = D3; const int dirMotorB = D4; int motorSpeed = 500; void setup() { Serial.begin(115200); Serial.println(); pinMode(pwmMotorA , OUTPUT); pinMode(pwmMotorB, OUTPUT); pinMode(dirMotorA, OUTPUT); pinMode(dirMotorB, OUTPUT); Serial.println("Motor SHield 12E Initialized"); delay(5000); } void loop() { Serial.println("Activate A"); digitalWrite(pwmMotorA, motorSpeed); digitalWrite(dirMotorA, LOW); delay(1500); Serial.println("Reverse A"); digitalWrite(dirMotorA, HIGH); delay(1500); Serial.println("Stop A"); digitalWrite(pwmMotorA, 0); digitalWrite(dirMotorA, LOW); delay(3000); Serial.println("Activate B"); digitalWrite(pwmMotorB, motorSpeed); digitalWrite(dirMotorB, LOW); delay(1500); Serial.println("Reverse B"); digitalWrite(dirMotorB, HIGH); delay(1500); Serial.println("Stop B"); digitalWrite(pwmMotorB, 0); digitalWrite(dirMotorB, LOW); delay(3000); }
Code de gestion d’un moteur pas-à-pas
Pour piloter un moteur pas-à-pas, il faut activer les bobines du moteur en suivant un enchainement précis. Cet enchainement est décrit dans la fonction nextStep().
const int pwmMotorA = D1; const int pwmMotorB = D2; const int dirMotorA = D3; const int dirMotorB = D4; int delayBtwnStep = 3; void setup() { Serial.begin ( 115200 ); Serial.println(); pinMode(pwmMotorA, OUTPUT); pinMode(pwmMotorB, OUTPUT); pinMode(dirMotorA, OUTPUT); pinMode(dirMotorB, OUTPUT); Serial.println("Motor SHield 12E Initialized"); } void loop() { stepperRotate(10, 0); delay(500); stepperRotate(10, 1); delay(500); } void stepperRotate(int nbStep, int dirStep) { for (int i = 0; i <= nbStep; i++) { if (dirStep == 0) { // sens horaire nextStep(i % 4); } if (dirStep == 1) { // sens antihoraire nextStep(3 - (i % 4)); } delay(delayBtwnStep); } } void nextStep(int index) { if (index == 0) { digitalWrite(pwmMotorA, true); digitalWrite(pwmMotorB, false); digitalWrite(dirMotorA, true); digitalWrite(dirMotorB, false); } if (index == 1) { digitalWrite(pwmMotorA, false); digitalWrite(pwmMotorB, true); digitalWrite(dirMotorA, true); digitalWrite(dirMotorB, false); } if (index == 2) { digitalWrite(pwmMotorA, false); digitalWrite(pwmMotorB, true); digitalWrite(dirMotorA, false); digitalWrite(dirMotorB, true); } if (index == 3) { digitalWrite(pwmMotorA, true); digitalWrite(pwmMotorB, false); digitalWrite(dirMotorA, false); digitalWrite(dirMotorB, true); } }
Applications
- Piloter un robot à deux roues comme Willy via une connexion WiFi
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Working mutch better like this :
void nextStep(int index) {
if (index == 0) {
digitalWrite(pwmMotorA, true);
digitalWrite(pwmMotorB, false);
digitalWrite(dirMotorA, false);
digitalWrite(dirMotorB, false);
}
if (index == 1) {
digitalWrite(pwmMotorA, false);
digitalWrite(pwmMotorB, true);
digitalWrite(dirMotorA, false);
digitalWrite(dirMotorB, false);
}
if (index == 2) {
digitalWrite(pwmMotorA, true);
digitalWrite(pwmMotorB, false);
digitalWrite(dirMotorA, true);
digitalWrite(dirMotorB, false);
}
if (index == 3) {
digitalWrite(pwmMotorA, false);
digitalWrite(pwmMotorB, true);
digitalWrite(dirMotorA, false);
digitalWrite(dirMotorB, true);
}
}
Cela dépend beaucoup du branchement mais merci beaucoup pour le complément