Wemos D1 实现小车的控制
时间:2022-11-29 10:30:00
文章目录
- 一、Wemos D1和WIFI
- 二、Wesmos D1的C/S模式
- 三、Wemos和L9110s步进电机控制器
- 四、串口实现前后左右
- 五、WiFi实现前后左右
- 六、汽车优化超声波避障
- 总结
一、Wemos D1和WIFI
Wemos D1上搭载板载无线网卡
支持AP(路由),STA(上网设备模式)
AP :相当于允许其他设备访问路由器。
STA:相当于手机可以连接其他无线设备。
Wemos的WiFi模块测试(代码如下):
//STA(上网设备模式) #include // 引入WiFi模块头文件 char* ssid = "TP-LINK"; // “wifi热点名称” char* passwd = "111111111"; // “wifi热点密码” //初始化WiFi设置 void InitWifiSta() {
WiFi.mode(WIFI_STA); // 设置STA模式 WiFi.begin(ssid, passwd); // 连接网络函数 while (WiFi.status() != WL_CONNECTED) {
// WiFi.status()函数是判断WiFi连接状态,WL_CONNECTED是这个函数其中一个返回值,连接上返回WL_CONNECTED Serial.print("."); ///每500微秒打印一次 delay(500); } } void setup() {
InitWifiSta(); // 初始化WiFi设置 Serial.begin(115200); // 波特率为115200 } void loop(){
Serial.println(WiFi.localIP()); // 连接上WiFi后通过串口打印Wemos的IP地址
delay(500);
}
二、Wesmos D1的C/S模式
C/S:客户端/服务器模式
服务器两大要素:
地址 :ip地址,域名等
端口号 :一台电脑或者设备有多个服务每个服务用端口号区别
用Wemos D1架设一个简单的ftp服务器(代码如下):
#include // 引入WiFi模块头文件
char* ssid = "hpy"; // “wifi热点名称”
char* passwd = "2225341578"; // “wifi热点密码”
int port=8888; // 设置一个端口号
WiFiServer server(port); // 设置服务器端口号
//初始化WiFi设置
void InitWifiSta()
{
WiFi.mode(WIFI_STA); // 设置STA模式
WiFi.begin(ssid, passwd); // 连接网络
while (WiFi.status() != WL_CONNECTED) {
// 判断WiFi是否连接成功
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP()); // 连接成功通过串口打印Wemos的IP地址
}
void setup() {
Serial.begin(115200); // 初始化串口,设置波特率为115200
InitWifiSta(); // 初始化WiFi设置
server.begin(); // 服务器开始运行
}
void loop(){
char cmd;
WiFiClient client = server.available(); // 获取连接到服务器
while (client.connected()) {
// 等待客户端连接
while (client.available() > 0) {
// 判断是否有数据到来,类似串口的那个函数
cmd = client.read(); // 读取数据
if(cmd=='1'){
Serial.println("hpy1");
}
else
{
Serial.println("hpy2");
}
}
}
}
注:手机上下载一个 tcp App,通过APP连接板载WiFi
三、Wemos和L9110s步进电机控制器
控制方式:
B-1A ----B-2A ----电机1
0 --------- 1 ------- 正转(假设)
1 --------- 0 ------- 反转
0 --------- 0 ------- 不转
1 --------- 1 ------- 不转
A-1A ---- A-2 ---- 电机1
0 --------- 1 ------- 正转(假设)
1 --------- 0 ------- 反转
0 --------- 0 ------- 不转
1 --------- 1 ------- 不转
四、串口实现前后左右
#define Dong1 D6 // 宏定义D6引脚
#define Dong2 D7 // 宏定义D7引脚
#define Zhuan1 D4 // 宏定义D4引脚
#define Zhuan2 D5 // 宏定义D5引脚
//初始设置L9110s
void InitL9110s(){
pinMode(Dong1,OUTPUT); // 设置各个引脚输出
pinMode(Dong2,OUTPUT);
pinMode(Zhuan1,OUTPUT);
pinMode(Zhuan2,OUTPUT);
}
//设置前进
void qian(){
digitalWrite(Dong1,LOW); // Dong1低电平,Dong2高电平前进
digitalWrite(Dong2,HIGH);
}
//设置后退
void hou(){
digitalWrite(Dong1,HIGH); // Dong1高电平,Dong2低电平后退
digitalWrite(Dong2,LOW);
}
//设置左转
void zuo(){
digitalWrite(Zhuan1,HIGH); // Zhuan1高电平,Zhuan2低电平左转
digitalWrite(Zhuan2,LOW);
}
//设置右转
void you(){
digitalWrite(Zhuan1,LOW); // Zhuan1低电平,Zhuan2高电平右转
digitalWrite(Zhuan2,HIGH);
}
void setup() {
InitL9110s();
Serial.begin(115200); // 初始化串口,设置波特率为115200
}
void loop(){
char c;
if(Serial.available()>0){
// 判断串口是否有数据
c=Serial.read(); // 读取串口数据
switch(c){
// 通过串口实现小车的前后左右运行
case 'q': qian();break;
case 'h': hou(); break;
case 'z': zuo(); break;
case 'y': you(); break;
}
}
}
注:此时小车必须通过Wemos连接在电脑上通过串口调试助手实现小车的控制。
五、WiFi实现前后左右
串口实现小车的控制必须通过usb数据线与电脑连接,小车不能自由的运动。WiFi方式就实现了小车随意运动。
WiFi实现小车的前后运动(测试代码如下):
#include // 引入WiFi模块头文件
//宏定义以下引脚
#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D4
#define Zhuan2 D5
//初始化设置L9110s输出引脚
void InitL9110s(){
pinMode(Dong1,OUTPUT);
pinMode(Dong2,OUTPUT);
pinMode(Zhuan1,OUTPUT);
pinMode(Zhuan2,OUTPUT);
}
//实现小车前后操作的封装
void qian(){
digitalWrite(Dong1,LOW);
digitalWrite(Dong2,HIGH);
}
void hou(){
digitalWrite(Dong1,HIGH);
digitalWrite(Dong2,LOW);
}
void zuo(){
digitalWrite(Zhuan1,HIGH);
digitalWrite(Zhuan2,LOW);
}
void you(){
digitalWrite(Zhuan1,LOW);
digitalWrite(Zhuan2,HIGH);
}
char* ssid="hpy"; // “wifi热点名称”
char* passwd="2225341578"; // “wifi热点密码”
//初始设置WiFi模块
void InitWiFi(){
WiFi.mode(WIFI_STA); // 设置STA模式
WiFi.begin(ssid,passwd); // 连接网络
while(WiFi.status()!=WL_CONNECTED){
// 判断是否连接
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP()); // 打印服务器的地址
}
int port=8888; // 设置一个端口号
WiFiServer server(port); // 设置服务器端口号
void setup() {
Serial.begin(115200); // 初始化串口,设置波特率为115200
InitL9110s(); // 初始化步进电机
InitWiFi(); // 初始化WiFi模块
server.begin(); // 服务器开始运行
}
void loop(){
char c;
WiFiClient client=server.available(); // 获取连接到服务器
while(client.connected()){
// 判断是否连接上
while(client.available()>0){
// 判断是否有数据到来,类似
c=client.read(); // 读取数据
switch(c){
// 实现前后左右控制
case 'q': qian();break;
case 'h': hou();break;
case 'z': zuo();break;
case 'y': you(); break;
}
}
}
}
注:如此就可以实现小车脱离电脑自由运动,可在手机上下载一个 tcp App,通过APP连接板载WiFi并发送数据给板子上的服务器实现小车的自由运动。
六、小车优化实现超声波避障
当小车在行驶过程中如果遇到障碍物使小车可以紧急制动并倒退
(测试代码如下):
#include
// 引入WiFi头文件 //--------------------------------- //超声波输入输出口 #define Echo D2 #define Trig D8 //--------------------------------- //步进 继电器输入输出口 #define Dong1 D6 #define Dong2 D7 #define Zhuan1 D4 #define Zhuan2 D5 //---------------------------------- //初始化步进继电器 void initL9110s(){ pinMode(Dong1,OUTPUT); pinMode(Dong2,OUTPUT); pinMode(Zhuan1,OUTPUT); pinMode(Zhuan2,OUTPUT); } //----------------------------------- //设置控制前后左右 void qian(){ digitalWrite(Dong1,LOW); digitalWrite(Dong2,HIGH); } void hou(){ digitalWrite(Dong1,HIGH); digitalWrite(Dong2,LOW); } void ting(){ // 停止运动 digitalWrite(Dong1,LOW); digitalWrite(Dong2,LOW); } void zuo(){ digitalWrite(Zhuan1,HIGH); digitalWrite(Zhuan2,LOW); } void you(){ digitalWrite(Zhuan1,LOW); digitalWrite(Zhuan2,HIGH); } void zhen(){ // 方向回正 digitalWrite(Zhuan1,LOW); digitalWrite(Zhuan2,LOW); } //----------------------------------------- //初始要连WiFi的名字和密码 char* ssid="hpy"; char* passwd="2225341578"; //初始化WiFi void initWiFi(){ WiFi.mode(WIFI_STA); // 设置开发板为STA模式 WiFi.begin(ssid,passwd); // 连接网络 while(WiFi.status()!=WL_CONNECTED){ // 判断是否连接上 Serial.print("."); delay(500); } Serial.println(WiFi.localIP()); // 打印开发板IP地址 } //--------------------------------------------- //设置端口号 int port=6666; WiFiServer server(port); //--------------------------------------------- //获取超声波时间 long gettime(){ digitalWrite(Trig,HIGH); delayMicroseconds(10); //维持10微妙 digitalWrite(Trig,LOW); return pulseIn(Echo,HIGH);//返回echo接收高电平的时间 } //--------------------------------------------- //初始化超声波 void initchaosheng(){ pinMode(Trig,OUTPUT); pinMode(Echo,INPUT); } //---------------------------------------------- void setup() { Serial.begin(115200); // 设置串口频率 initchaosheng(); // 初始化超声波 initL9110s(); // 初始化步进继电器 initWiFi(); // 初始化WiFi server.begin(); // 打开端口 } void loop(){ char c; long dis; WiFiClient client=server.available(); // 获取连接客户端 while(client.connected()){ // 判断客户端是否连接 while(client.available()>0){ dis=gettime()/58; // 超声波返回的距离 Serial.println(dis); c=client.read(); // 读客户端发送的信号 Serial.println(c); switch(c){ // 通过客户端的信号判断前进后退 case 'q': if(dis<10){ // 如果超声波测距发现前面10cm有障碍物后退5微妙 hou(); delay(500); qian(); }else{ qian(); } break; case 'h': hou(); break; case 't': ting();break; case 'z': zuo(); break; case 'y': you(); break; case 'v': zhen();break; } } } }
总结
实现小车的自由运动最重要的就是实现WiFi连接以及在开发版上搭建一个服务器用来控制小车的运动。