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