O ESP12E Motor Shield é uma placa de expansão que permite a um Amica ESP8266 NodeMCU (V2) accionar dois motores CC ou um motor passo-a-passo. Já vimos como conduzir um motor CC utilizando uma ponte-H que pode exigir muita cablagem quando se utiliza o simples CI. Para uma aplicação incorporada, como um robô Willy, terá de conduzir vários motores em paralelo. Existem escudos para este fim que simplificarão a montagem.
Matériel
- Computador
- NodeMCU ESP8266 Amica (V2)
- Cabo USB A Macho/B Macho
- Escudo do motor ESP12E
- Motor CC x2 ou Stepper motor x1
Princípio funcional
O ESP12E Motor Shield utiliza a ponte-H dupla L293D. Permite accionar motores na direcção e velocidade com uma tensão nominal entre 5 e 36V e uma corrente de 600mA, até 1,2A com uma fonte de tensão externa:
Este escudo permite o uso:
- até dois motores CC ou um motor passo-a-passo bipolar
- um sensor analógico
- GPIOs
- ônibus I2C, SPI e UART

Esquema
Compatível com a placa Amica NodeMCU ESP8266, o escudo é colocado directamente sobre o microcontrolador. A alimentação dos motores está ligada ao bloco de terminais VM/GND e a da placa ao bloco de terminais VIN/GND. É possível ligar os pinos VIN e VM com uma ponte, se a alimentação dos motores for a mesma que a alimentação do NodeMCU (<10V Max). Os motores são ligados aos blocos terminais A+,A-,B+,B-.
- D1, D3 (motor A/ Stepper 1,2)
- D2, D4 (motor B / Stepper 3,4)
- Entradas disponíveis A0
- GPIO disponível nos pinos 0 a 8
No caso de um escudo, as ligações são pré-definidas. As ligações do motor são detalhadas nos diagramas seguintes.


Código de gestão para um motor CC
Para interagir com o ESP12E Motor Shield, não utilizamos uma biblioteca específica. Pode sempre criar a sua própria biblioteca para simplificar o seu código.
/*
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);
}
Código de gestão do motor passo-a-passo
Para conduzir um motor passo-a-passo, é necessário activar as bobinas do motor seguindo uma sequência precisa. Esta sequência é descrita na funçãoStep() seguinte.
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);
}
}
Aplicações
- Controlar um robô de duas rodas como Willy através de uma ligação WiFi
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie