硬件列表:
小车:
智能小车底盘 机器人小车底盘 寻迹小车 带码盘/测速/电池盒-淘宝网 (taobao.com)
开发板:
ESP8266 开发板 V3 (ESP-12N F NodeMcu Lua)( 需要CP2102驱动)
wifi物联网 ESP8266开发板 V3 ESP-12N F NodeMcu Lua CP2102-淘宝网 (taobao.com)
引脚图(资料):
电机驱动板:
(L293D ESP12E Lua电机驱动板):该驱动板默认占用控制板 D1、 D2、 D3、 D4 四个端口,分别作为 PWMA(电机 A 转速)、 PWMB(电机 B 转速)、 DA(电机 A 方向)、 DB(电机 B 方向) 功能。
模块同时引出 VIN、 3.3V、 DIO、 AIO、 SDIO、 UART、 SPI、 RST、 EN 等多个引脚,可以方便地接入各种传感器(温湿度、蜂鸣器、 照明、继电器等)。
ESP8266 WiFi 电机驱动扩展板 L293D ESP12E Lua 物联网 智能小车-淘宝网 (taobao.com)
接线:
如果接步进电机只能接一个,本文不需要,下图只是参考。
成品:
测试视频:
软件与代码:
Arduino中的代码
注意替换到auth[] ssid[] pswd[]的内容
#define BLINKER_WIFI
#define BLINKER_HTTP
#include <Blinker.h>
//#include <ESP8266WiFi.h>
#define L_PWM_PIN D1
#define R_PWM_PIN D2
#define L_DIR_PIN D3
#define R_DIR_PIN D4
char auth[] = "XXXXXXXXXXXX";
char ssid[] = "XXXXXXXXXXXX";
char pswd[] = "XXXXXXXXXXXX";
/* 新建组件对象*/
BlinkerButton Button_front("btn-front");
BlinkerButton Button_left("btn-turn-left");
BlinkerButton Button_back("btn-back");
BlinkerButton Button_right("btn-turn-right");
BlinkerButton Button_stop("btn-stop");
BlinkerButton Button_left_front("btn-left-front");
BlinkerButton Button_right_front("btn-right-front");
BlinkerButton Button_left_back("btn-left-back");
BlinkerButton Button_right_back("btn-right-back");
BlinkerNumber Number1("num-abc");
int counter = 0;
/* 前进*/
void Button_front_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 200);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 200);
digitalWrite(R_DIR_PIN, HIGH);
}
/* 后退*/
void Button_back_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 200);
digitalWrite(L_DIR_PIN, LOW);
analogWrite(R_PWM_PIN, 200);
digitalWrite(R_DIR_PIN, LOW);
}
/* 左转*/
void Button_left_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 0);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 200);
digitalWrite(R_DIR_PIN, HIGH);
}
/* 右转*/
void Button_right_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 200);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 0);
digitalWrite(R_DIR_PIN, HIGH);
}
/* 停止*/
void Button_stop_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
digitalWrite(L_PWM_PIN, 0);
//digitalWrite(L_DIR_PIN, HIGH);
digitalWrite(R_PWM_PIN, 0);
//digitalWrite(R_DIR_PIN, HIGH);
}
/* 左前进*/
void Button_left_front_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 100);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 200);
digitalWrite(R_DIR_PIN, HIGH);
}
/* 右前进*/
void Button_right_front_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 200);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 100);
digitalWrite(R_DIR_PIN, HIGH);
}
/* 左后退*/
void Button_left_back_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 100);
digitalWrite(L_DIR_PIN, LOW);
analogWrite(R_PWM_PIN, 200);
digitalWrite(R_DIR_PIN, LOW);
}
/* 右后退*/
void Button_right_back_callback(const String & state) /*理解成这是一个中断调用函数 state 是调用中断后手机app发来的值*/
{
BLINKER_LOG("get button state: ", state); /*在blinker和Monitor(监视器的意思)上显示这一项*/
analogWrite(L_PWM_PIN, 200);
digitalWrite(L_DIR_PIN, LOW);
analogWrite(R_PWM_PIN, 100);
digitalWrite(R_DIR_PIN, LOW);
}
/* 如果未绑定的组件被触发,则会执行其中内容*/
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
pinMode(L_PWM_PIN, OUTPUT);
pinMode(L_DIR_PIN, OUTPUT);
pinMode(R_PWM_PIN, OUTPUT);
pinMode(R_DIR_PIN, OUTPUT);
analogWrite(L_PWM_PIN, 0);
digitalWrite(L_DIR_PIN, HIGH);
analogWrite(R_PWM_PIN, 0);
digitalWrite(R_DIR_PIN, HIGH);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button_front.attach(Button_front_callback);
Button_left.attach(Button_left_callback);
Button_back.attach(Button_back_callback);
Button_right.attach(Button_right_callback);
Button_stop.attach(Button_stop_callback);
Button_left_front.attach(Button_left_front_callback);
Button_right_front.attach(Button_right_front_callback);
Button_left_back.attach(Button_left_back_callback);
Button_right_back.attach(Button_right_back_callback);
}
void loop() {
// put your main code here, to run repeatedly:
Blinker.run();
}
App的界面与按钮:
附录:
一个案例: NodeMCU Motor Shield L293D for ESP12E + Blynk – YouTube (基于Blynk)
官方案例资料(找了很久,但没帮上什么忙):1代智能小车 – 四博智联产品售后 – Powered by Discuz! (doit.am)
ESP12E Motor Shield (L293D ESP12E Lua电机驱动板)产品说明书(让我一顿好找啊,找了几个小时,资料太少了):
载入中…
源代码:














