
ESP12E Motor Shield 是一块扩展板,允许 Amica ESP8266 NodeMCU (V2) 驱动两个直流电机或一个步进电机。我们已经了解了如何使用 H 桥驱动直流电机,这在使用简单 IC 时可能需要大量接线。对于嵌入式应用程序,如 Willy 机器人,您必须并行驱动多个电机。有用于此目的的护罩,可以简化组装。
ESP12E Motor Shield 是兼容 ESP12E Dev Kit 和 NodeMCU 的一款大电流电机驱动模块。模块采用叠插式线路板设计,可以直接接入 ESP12E Dev Kit 或者NodeMCU Lua 模块。
模块采用意法半导体公司生产的优秀大功率电机专用驱动全桥芯片 L293DD,可直接驱动 2 路直流电机或者 1 路步进电机,驱动电流最大可以达到 1.2A。电路图布局合理、贴片封装、安装十分方便。
模块使用 ESP12E Dev Kit 的 IO 口作为控制端口,内部配置逻辑芯片完成电机IC 驱动,因此仅仅占用控制板 D1、D2、D3、D4 四个端口,分别作为 PWMA(电机 A 转速)、PWMB(电机 B 转速)、DA(电机 A 方向)、DB(电机 B 方向)功能。
模块同时引出 VIN、3.3V、DIO、AIO、SDIO、UART、SPI、RST、EN 等多个引
脚,可以方便地接入各种传感器(温湿度、蜂鸣器、照明、继电器等)。
模块采用人性化设计方案,使用电源按钮开关,用户可以方便地进行电源开关。
电脑
NodeMCU ESP8266 阿米卡 (V2)
USB 数据线 A 公头/B 公头
遮蔽电机 ESP12E
直流电机 x2 或步进电机 x1
ESP12E Motor Shield 使用 L293D 双 H 桥。它允许以 5 至 36V 的标称电压和 600mA 的电流驱动电机的方向和速度,使用外部电压源时高达 1.2A:
此屏蔽允许您使用:


电源输入:
电机电源(VM):4.5V~36V,可单独供电;
控制电源(VIN):4.5V~9V(10VMAX),可单独供电;
模块提供短路子(短路 VM 和 VIN),可以方便地使用一路电源(必
须 4.5V~9V)同时完成电机的驱动与控制;
逻辑工作电流 Iss:≤60mA(Vi=L),≤22mA(Vi=H);
驱动部分工作电流 Io:≤1.2A;
最大耗散功率:4W(T=90℃)
控制信号输入电平:高电平:2.3V≤VIH≤VIN;低电平:-0.3V≤VIL≤1.5V
工作温度:-25℃~+125℃
驱动形式:双路大功率 H 桥驱动
ESP12E Dev Kit 控制端口:D1,D3(A 电机);D2,D4(B 电机)
模块重量:约 20g
与 NodeMCU ESP8266 Amica 板兼容,扩展板直接放在微控制器上。电机的电源连接到 VM/GND 接线盒,电路板的电源连接到 VIN/GND 接线盒。如果电机的电源与 NodeMCU 的电源相同(<10V 最大值),则可以使用桥连接 VIN 和 VM 引脚。电机连接到接线端子 A+、A-、B+、B-。
在屏蔽的情况下,连接是预定义的。查看组件的技术文档以了解如何使用它。
电机连接详见下图。

注意板载和电机供电时需要跳帽短接VIN和VM

要与 ESP12E Motor Shield 交互,我们不使用特定的库。您始终可以创建自己的库来简化代码。
/*
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);
}
要驱动步进电机,必须以精确的顺序激活电机线圈。此序列在 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);
}
}
通过 WiFi 连接控制像 Willy 这样的两轮机器人