《博哥玩Arduino》-WIFI小车

网友投稿 2018-09-11 23:51

本文说明:本实验由博哥发布,经本人实践通过后,分享给大家,有兴趣的朋友可以试一下,不明的地方可以留言。但是我觉得文中已经说的很详细了,当然小Q也发现这当中有一些不够完美之处,有能力的可以修改一下APP,那就更完美了。

以下是正文:

1.前言
上个星期做了蓝牙小车,见到WIFI模块8266 挺便宜,所以就上网买了两块8266,准备把蓝牙小车改成WIFI小车。(原因:蓝牙的传输距离还是有点短,估计距离稍微远点(大于10M)就连不上小车了,所以就考虑8266,据说空旷地带能达到400M,具体的数据并没有去测试过,对于我的WIFI小车来说,50M内可靠传输就可以满足我的要求了)。
     由于我的小车是基于蓝牙小车开发的,所以很多关于小车的介绍我就不重复说明了,想了解具体设置的可以去看看这前面一篇文章《博哥玩Arduino》-蓝牙小车
     我的习惯,先说原理,再说现象,所以WIFI小车也分为两个部分,基础篇以及实操篇。
2.设计原理
     概念流程如下:
     1.ESP8266连接到Arduino UNO R3的串口(前期测试AT指令可以用软串口),8266作为AP模块
     2.手机端安装 wifi小车 app,然后WIFI热点上寻找 8266 AP,连接上它。
     3.打开app,点击连接到小车(其实就是连接到8266),之后就可以两者通信了,把前进后退左转右转的编码发给8266,8266通过串口发给Arduino,Arduino处理指令,控制电机。8266模块只接收数据,不发生数据。

3.材料
     配件如下:
     ARDUINO UNO 开发板     1块
     ESP8266 WIFI模块             1个
     安卓手机                            1部
     车模                                   1个
     蓄电池及充电线                 1套
     L298N驱动模块                  1个               杜邦线                                若干
4.具体过程
     废话少说,这里只是测试ESP8266,另外的模块请到蓝牙小车介绍去看:
     4.1 ESP8266 引脚图

https://cdn.china-scratch.com/timg/180913/2351452207-0.jpg 

引脚说明 :

       引脚名 接线说明 与Arduino UNO上相连接的引脚
       UTXD 接单片机RX 10(软串口RX)
      URXD 接单片机TX 11(软串口TX)
     CH_PD 接3.3V 3.3V
       VCC 电源 3.3V
      GND GND


https://cdn.china-scratch.com/timg/180913/23514553H-1.jpg 
先共享两份资料,我就不详细介绍8266,只关注测试过程:
https://cdn.china-scratch.com/timg/180913/2351452219-2.jpg ESP8266新手入门调试指导(补全).pdf 
https://cdn.china-scratch.com/timg/180913/2351454401-3.jpg ESP8266__AT 指令.rar 
串口调试助手:

在这里我们暂时不用UNO板子来测试8266模块,我们直接用USB转TTL串口线来连接8266模块,然后通过串口调试助手来给8266发送AT指令。

https://cdn.china-scratch.com/timg/180913/2351455O7-4.jpg 
https://cdn.china-scratch.com/timg/180913/23514C050-5.jpg 
https://cdn.china-scratch.com/timg/180913/23514B035-6.jpg 
ESP8266可以配置成station 、AP、station+AP三种模式,就是说模块可以当成一个设备(client)连接区域网内的路由,也可以设置成是一个路由(sever),也可以既作为局域网里面的client同时又是其他client的sever。
     我自己的话就用到AP模式,那么就需要了解以下几个指令(注意:有些命令是可以写入ESP8266模块的flash里面的,意味着掉电重启也是有效的,既然这样,那意味着我们可以用串口调试助手先做好基本配置,然后其他的配置可以通过Arduino板子来配置),其他的指令可以自行查阅手册:

   1. AT+RST 重新启动模块 
          返回:OK 以及一堆乱码,忽略乱码
     2. AT+CWMODE=2 设置AP模式(重启后生效(AT+RST))(测试发现会写入flash)
          返回:OK
     3. AT+CWSAP=”WifiCar”,”123456123456”,1,3     配置AP参数          指令:AT+ CWSAP=,,,(测试发现会写入flash)
          说明:指令只有在AP模式开启后有效
                     :字符串参数,接入点名称
                     :字符串参数,密码最长64字节,ASCII
                     :通道号
                     < ecn >:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK  (这样就意味着别人连接可能需要密码,除非是OPEN直接连接)
          返回:OK     此时手机WLAN列表中会找到ESP8266的热点(可能需要等一会),点击连接         
     4. AT+CIFSR   查看模块IP地址命令
             返回一个IP地址,这个要记住,手机连接会用到(假设这里是192.168.4.1)
     5.  AT+CIPMUX=1     开启多连接模式命令(掉电需要重新设置,Arduino写入)
     6. AT+CIPSERVER=1,8080   开启服务器模式    8080为端口号,手机连接时会用到(手机连接就会用192.168.4.1/8080)(掉电需要重新设置,Arduino写入)
     7.AT+UART_DEF=,,,,<flow control> (设置波特率)
          参数说明:     UART 波特率 
                               数据位           
                                5:5 bit 数据位          
                                6:6 bit 数据位           
                                7:7 bit 数据位           
                                8:8 bit 数据位 
                               停⽌止位           
                                1:1 bit 停⽌止位           
                                2:1.5 bit 停⽌止位           
                                3:2 bit 停⽌止位 
                               校验位           
                                   0:None           
                                   1:Odd           
                                   2:EVEN 
                             <flow control>  流控           
                                   0:不使能流控           
                                   1:使能 RTS           
                                   2:使能 CTS           
                                   3:同时使能 RTS 和 CTS 
     注意,非常重要:有个地方需要注意一下,ESP8266模块默认的波特率是115200,由于我们用到软串口调试,可能软串口波特率达不到115200,只能到19200,所以我就干脆都用9600波特率。所以我拿到8266模块之后的第一个任务就是修改波特率。执行以下两个命令:
     AT+RST
     AT+UART_DEF=9600,8,1,0,0
     修改完之后,记住需要重新设置串口调试助手的波特率。(注意:在串口调试软件中每个指令都需要回车后再发送)

所以总结如下:
     首先,通过串口调试助手和USB转串口线先给8266模块进行基本设置,顺序执行以下命令:
      一、重新设置波特率
             AT+RST
             AT+UART_DEF=9600,8,1,0,0 (会写入Flash)
            https://cdn.china-scratch.com/timg/180913/2351463E0-7.jpg 
    二、进行基本设置
              第一步: AT+RST
              第二步: AT+CWMODE=2 以及 AT+RST  (会写入Flash)
              第三步: AT+CWSAP=”WifiCar”,”123456123456”,1,3     (会写入Flash)
              第四步: AT+CIPMUX=1 (不会写入Flash,掉电需要重新设置)
              第五步: AT+CIPSERVER=1,8080(不会写入Flash,掉电需要重新设置)
              第六步: AT+CIFSR  (手机端App需要用到这个,记录一下)

    https://cdn.china-scratch.com/timg/180913/23514K930-8.jpg 
    这样,通过串口线就进行完基本设置了,剩下的就是Arduino 代码以及 App,这个在实操篇讲解。

附上简单的AT指令:
        AT+GMR         查看版本号
        AT+RST         重启
        AT+CWMODE=2   设置工作模式(1客户端,2服务器,3)
        AT+CWMODE?     查询工作模式
        AT+CWLIF       查看接入的客户端IP
        AT+CWLAP       返回AP列表
        AT+CWJAP="ssid","87654321"      加入AP
        AT+CIFSR       获取本模块ip
        AT+CIPSTART="TCP","121.9.25.1",9800  连接服务器
        AT+CIPMODE?    查询模块传输模式   1透传,0不透传
        AT+CIPMODE=1   设置模块传输模式
        AT+CIPSEND     进入透传模式
        每次重启后需要重新执行一条连接服务器指令
        //服务器模式
        AT+CIPMUX=1           0单路连接模式,1多路连接模式
        AT+CIPMUX?            查询连接模式
        AT+CIPSERVER=1,8080   配置为服务器 
        AT+ CIPSTATUS  返回当前模块的连接状态和连接参数
       其他的请自行查阅上面的pdf文档。

接着是调试:

先上两个调试图,有图有真相:         https://cdn.china-scratch.com/timg/180913/23514G622-9.jpg 
      https://cdn.china-scratch.com/timg/180913/23514GI0-10.jpg 
     接线:
      https://cdn.china-scratch.com/timg/180913/23514553H-1.jpg 
     这里我们采用软串口和8266模块通信,硬串口用来打印调试信息到电脑端串口调试助手。
      UTXD          ---->            10(软串口RX)
      URXD          ---->            11(软串口TX)

二、烧录Arduino程序  
     
      请烧入以下代码:

[C] 纯文本查看 复制代码

?

代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include
/*
日期:2016/11/18
功能:wifi小车程序
作者:单片机菜鸟
*/
 
#define IN1 6 // 7 6 右轮
#define IN2 7
#define IN3 4 // 5 4 左轮
#define IN4 5
 
#define LEFT "3" //左转编码
#define RIGHT "4"//右转编码
#define GO "1"//前进编码
#define BACK "2"//后退编码
#define STOP "0"//停止编码
 
SoftwareSerial mySerial(10,11);
 
voidsetup() {
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
  //开启多连接模式命令
  mySerial.println("AT+CIPMUX=1");
  //开启服务器模式    8080为端口号,手机连接时会用到
  delay(2000);
  mySerial.println("AT+CIPSERVER=1,8080");
  delay(3000);
  while(Serial.read() >= 0){}
  while(mySerial.read() >= 0){}
  initCar();
  Serial.println("wificar init");
}
  
voidloop() {
    charbuf[100];
    intleng = ReceiveWifiMessage(buf);
 
    if(leng>0){
      if(strcmp(buf, GO) == 0){
        Serial.println("go");
         //前进
         go();
      }elseif(strcmp(buf, BACK) == 0){
        Serial.println("back");
         //后退
         back();
      }elseif(strcmp(buf, LEFT) == 0){
         //左转
         Serial.println("left");
         turnLeft();
      }elseif(strcmp(buf, RIGHT) == 0){
        //右转
        Serial.println("right");
        turnRight();
      }elseif(strcmp(buf, STOP) == 0){
        //停车
        Serial.println("stop");
        stopCar();
      }
    }
}
 
voidinitCar(){
  //默认全是低电平 停止状态
  digitalWrite(IN1,LOW);     
  digitalWrite(IN2,LOW);
  digitalWrite(IN3,LOW);  
  digitalWrite(IN4,LOW);
}
 
/**
* 左转
*/
voidturnLeft(){
  digitalWrite(IN1,HIGH);     
  digitalWrite(IN2,LOW);        //右轮前进
  digitalWrite(IN3,LOW);     
  digitalWrite(IN4,LOW);        //左轮不动
}
 
/**
* 右转
*/
voidturnRight(){
  digitalWrite(IN1,LOW);     
  digitalWrite(IN2,LOW);        //右轮不动
  digitalWrite(IN3,HIGH);     
  digitalWrite(IN4,LOW);        //左轮前进
}
 
/**
* 前进
*/
voidgo(){
  digitalWrite(IN1,HIGH);     
  digitalWrite(IN2,LOW);        //右轮前进
  digitalWrite(IN3,HIGH);     
  digitalWrite(IN4,LOW);        //左轮前进
}
 
/**
* 倒车
*/
voidback(){
  digitalWrite(IN1,LOW);     
  digitalWrite(IN2,HIGH);       //右轮后退
  digitalWrite(IN3,LOW);     
  digitalWrite(IN4,HIGH);       //左轮后退
}
 
/**
* 停车
*/
voidstopCar(){
  initCar();
}
 
/**
* 读取串口缓冲区里面的数据
*/
intReceiveWifiMessage(char*buf){
  //+IPD,:
  //+IPD,,:
  String data ="";
  if(mySerial.available()>0){
    unsignedlongstart;
    start = millis();
    charc0 = mySerial.read();
    if(c0 =='+')
    {
      while(millis()-start<100)
      {
        if(mySerial.available()>0)
        {
          charc = mySerial.read();
          data += c;
        }
        if(data.indexOf("nOK")!=-1)
        {
          break;
        }
      }
 
      intsLen =strlen(data.c_str());
      inti,j;
      for(i = 0; i <= sLen; i++){
        if(data[i] ==':'){
          break;
        }
      }
      //判断是否存在id
      boolean found =false;
      for(j = 4; j <= i; j++){
        if(data[j] ==','){
          found =true;
          break;
        }
      }
      intiSize;
      if(found ==true){
        //+IPD,,:
          String _size = data.substring(j+1, i);
          iSize = _size.toInt();
          String str = data.substring(i+1, i+1+iSize);
          strcpy(buf, str.c_str());    
      }else{
        //+IPD,:    
          String _size = data.substring(4, i);
          iSize = _size.toInt();
          String str = data.substring(i+1, i+1+iSize);
          strcpy(buf, str.c_str());
      }
      returniSize;
    }else{
      while(mySerial.read() >= 0){} 
    }
  }
  return0;
}


三、WIFI小车 App
    app太大限制共享不了,需要的人请留言给楼主
        把App先安装到手机上,然后进行以下操作:
        第一步,先去wifi连接去寻找WifiCar这个热点,点击连接,输入密码123456123456,这是我自己设置的,个人喜好。
https://cdn.china-scratch.com/timg/180913/23514R3J-12.jpg 第二步,点击进入App
https://cdn.china-scratch.com/timg/180913/23514UF3-13.jpg 
该页面有两个东西,首先先点击右下角的按钮,就会进入IP和端口设置页面,我默认设置为192.168.4.1/8080,这里支持自定义的,点击保存就好。
https://cdn.china-scratch.com/timg/180913/2351492O6-14.jpg 
然后就可以点击“老司机发车,点击连接小车”,如无意外,应该就会进入下面页面:
https://cdn.china-scratch.com/timg/180913/2351504535-15.jpg 
这里就可以看到上下左右停止5个按钮以及左下角自定义编码按钮。我默认设置为左3右4 上1下2 停0,这里也支持自定义,点击保存。
https://cdn.china-scratch.com/timg/180913/2351501N2-16.jpg 
不过要记住同时要修改Arduino里面的代码。我测试时的截图如下:
https://cdn.china-scratch.com/timg/180913/2351514252-17.jpg 
        这就证明整个通信过程是正确的,Arduino能够收到app端发起的正确指令。
   可惜的是,由于我的Arduino板子以及电机是同一个电源,当电机跑起来的时候经常会影响到我的8266模块,所以就没有录制视频。
    解决方案:独立供电,应该可以解决这个问题,由于楼主比较懒,故没有去做这个,只是把主要的东西讲解清楚,有意愿的可以自己尝试去弄。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com