锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Wemos D1 实现小车的控制

时间:2022-11-29 10:30:00 继电器2864150mini

文章目录

  • 一、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 ------- 不转

四、串口实现前后左右

测试L9110s步进电机控制器(用串口实现代码如下):

#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连接以及在开发版上搭建一个服务器用来控制小车的运动。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章