内容正文:
任务8-5 WIFI遥控小车设计
1
一、任务导入
遥控小车使用安卓智能手机作为遥控器,首先在手机端安装“WIFI小车”APP,通过这个APP并利用手机内的WIFI模块发送控制命令,小车端的WIFI模块接收到控制信号后,通过51单片机的串行通信接口将控制信号传给单片机,单片机判断控制信号并作出相应的动作,如此就实现了小车的WIFI遥控。
设计要求
UART
系统框图
ESP8266模块介绍
802.11 b/g/n
频率范围 2.4G-2.5G(2400M-2483.5M)
WIFI @2.4 GHz,支持 WPA/WPA2 安全模式
内置低功率 32 位 CPU:可以兼作应用处理器
SDIO 2.0、 SPI、UART
待机状态消耗功率小于1.0mW (DTIM3)
工作温度范围 -40 ~ 125℃
ESP8266模块
ESP8266模块专用转接板
通过转接板后只引出四个输出线,分别为电源VCC,地GND,信号输出端TXD和信号输入端RXD,并且可以5V供电,可以直接配合51单片机使用,非常方便。由于ESP8266模块支持UART接口,因此把转接板的TXD、RXD分别和51单片机的RXD、TXD相连,通电后就可进行二者之间的串口通信了。
可外接5V电源,直接配合51单片机一起使用
四脚输出VCC、GND、TXD、RXD
ESP8266模块专用转接板
WIFI遥控小车的硬件电路图
在程序设计前,需要根据WIFI模块设置单片机的通信协议。这里我们采用的串口通信波特率为9600b/s;数据帧为串口工作方式1的帧格式。手机端发送的控制信号定义如下:字符‘0’代表前进,字符‘1’代表后退,字符‘2’代表左转,字符‘3’代表右转,字符‘5’和‘6’均代表停车。
控制信号 对应的小车执行动作
‘0’ 前进
‘1’ 后退
‘2’ 左转
‘3’ 右转
‘5’ 停止
‘6’ 停止
通信协议约定
二、wifi模块的AT指令测试
我们在使用WIFI模块前,通常需要先对其进行AT指令配置,以验证模块是否正常,并设置模块名称、波特率、工作模式、服务器等参数。
11
命令 描述
基础指令
AT 测试AT启动
AT+RST 重启模块
AT+GMR 查看版本信息
wifi功能指令
AT+CWMODE 选择WIFI应用模式
AT+CWJAP 加入AP
AT+CWLAP 列出当前可用AP
AT+CWQAP 退出与AP的连接
AT+CWSAP 设置AP模式下的参数
AT+ CWLIF 查看已接入设备的IP
命令 描述
TCP/IP指令
AT+CIPSTATUS 获得连接状态
AT+CIPSTART 建立TCP连接或注册UDP端口号
AT+CIPSEND 发送数据
AT+CIPCLOSE 关闭TCP或UDP
AT+CIFSR 获取本地IP地址
AT+CIPMUX 启动多连接
AT+CIPSERVER 配置为服务器
AT+CIPMODE 设置模块传输模式
AT+CIPSTO 设置服务器超时时间
ESP8266 AT指令集
AT指令集中的格式
利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。
ESP8266 支持softAP 模式,station 模式,softAP + station 共存模式三种。
softAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。
station:即无线终端,是一个无线网络的终端。
ESP8266 工作模式
RXD
TXD
GND
+5V
RXD
TXD
GND
+5V
使用一个USB到TTL的转接口来实现WIFI模块和PC机之间的串口连接。连线时要注意转接口的RXD要接WIFI模块的TXD,而转接口的TXD要接WIFI模块的RXD。
ESP8266 与PC机连接进行设置
1
2
4
3
串口调试助手设置
1、测试AT启动
发送:AT
返回:OK
1
2
4
3
2、设置ESP8266应用模式
发送: AT+CWMODE=<mode>
返回:OK
<mode>:
‣ 1:Station 模式
‣ 2:SoftAP 模式
‣ 3:SoftAP+Station 模式
在字符串输入框中输入AT+CWMODE=2指令来设置ESP8266工作在softAP模式。由于该指令需重启后才能生效,因此要接着输入AT+RST指令来重启模块。
3、重启模块
发送: AT+RST
返回:OK
4、设置ESP8266 softAP参数
发送:AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn>
返回:OK
指令参数:
<ssid>字符串参数,接入点名称
<pwd>字符串参数,密码最长64字节ASCII
<chl>通道号
<ecn>加密方式
0 OPEN
1 WEP
2 WPA_PSK
3 WPA2_PSK
4 WPA_WPA2_PSK
由于默认的名称太长,使用指令AT+CWSAP=“SZPT”,“”,1,0将名称改为SZPT。
设置WIFI模块的连接类型,这里需要设置为多连接模式,输入的指令为AT+CIPMUX=1。
设置这一步主要是为下一步建立TCP服务器做准备,因为建立TCP服务器必须在多连接模式下进行。
5、设置ESP8266连接类型
发送: AT+CIPMUX=<mode>
返回:OK
<mode>:
‣ 0:单连接模式
‣ 1:多连接模式
建立一个端口号为5000的TCP服务器,输入的指令为AT+CIPSERVER=1,5000。
6、建⽴ TCP 服务器
发送:AT+CIPSERVER=<mode>[,<port>]
返回:OK
<mode>:
‣ 0:关闭服务器
‣ 1:建⽴服务器
<port>:端⼝号,默认为 333。
7、设置波特率
发送: AT+CIOBAUD=<value>
返回:OK
指令参数:
<value>要设置的波特率数值
约定WIFI遥控小车项目中WIFI模块与单片机的串口通信波特率为9600,因此要用指令AT+CIOBAUD=9600将波特率设置为9600。
三、wifi遥控小车的程序测试
首选需要对单片机串口进行初始化,设置工作方式及波特率等。另外,由于部分AT指令断电不会保存,因此需要在程序中进行重新设置。等待接收手机端发来的控制信号,最后根据控制信号做出相应的动作。
注意:ES = 0,开启串口中断,因为在配置wifi模块时没有使用中断方式。
void Uart_Init( )
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD; //设置波特率 9600
TL1 = 0xFD;
TR1 = 1; //启动定时器1
ES = 0; //关闭串口中断
EA = 1; //开总中断
}
串口初始化子函数
void ESP8266_Set(uchar *puf) // 指针*puf指向字符串数组
{
while(*puf!='\0') //字符串结束跳出循环
{
SBUF=*puf; //向WIFI模块发送控制指令
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
puf++;
}
DelayMs(2000); //模块需要一定的反应时间,该延时时间需要根据硬件调整
}
注意:使用while语句完成了字符串的逐个发送;为了确保发送不受干扰,这里采用查询方式发送;每个AT指令字符串发送完成后,wifi模块还需要一定的反应时间,这个延时要根据系统硬件调整,这里的延时大概是2S的样子。
ESP8266WIFI模块设置子函数
void Uart_Interrupt() interrupt 4
{ uchar receive;
if(RI==1)
{RI=0;
receive=SBUF;
if(receive==‘+‘)
{i=0;start=1;}
if(start)
{Receive_table[i]=receive;
i=i+1;
if(i==10)start=0;}
}
}
注意:如果单片机接收到一个有效控制信号,则一定是以+IPD开头,并且真正有用的控制字符位于这个字符串的第10位。
多路连接时(+CIPMUX=1) 接收到的数据格式:
+IPD,<id>,<len>:<data>
参数说明:
<id>收到连接的id号
<len>数据长度
<data>收到的数据
举例:
+IPD,0,1:3
串口中断服务子函数
//定义的全局变量
uchar Receive_table[20];
//用来存放接收到的控制字符串
uchar i;
//全局变量i用来记录接收到的字符数
bit start;
//全局位变量start用来表征接收的状态
串口中断服务子函数
void Uart_Interrupt() interrupt 4
{ uchar receive;
if(RI==1)
{RI=0;
receive=SBUF;
if(receive==‘+‘)
{i=0;start=1;}
if(start)
{Receive_table[i]=receive;
i=i+1;
if(i==10)start=0;}
}
}
void gongneng()
{
switch(Receive_table[9])
{case '0': qianjin(); break;
case '1': houtui(); break;
case '2': zuozhuan(); break;
case '3': youzhuan(); break;
case '5': tingche(); break;
case '6': tingche(); break;
default:break;
}
}
判断控制信号并执行子函数
首先调用串口初始化子函数,然后配置ESP8266模块,最后就是不断处理接收到的控制信号。在配置ESP8266模块时,输入的AT指令写成字符串的形式,最后\r
是转义字符,\r是回车,
是换行,前者使光标到行首,后者使光标下移一格,两个放一起就和执行Enter键的作用一样。这里需要注意的是,在配置好ESP8266模块后一定要记得开串口中断。
void main()
{
Uart_Init();
ESP8266_Set("AT+CWMODE=2\r
"); //设置路由器模式 1 station模式 2 AP 3 station+AP混合模式
ESP8266_Set("AT+RST\r
"); //重新启动wifi模块
ESP8266_Set("AT+CIPMUX=1\r
"); //开启多连接模式,允许多个客户端接入
ESP8266_Set("AT+CIPSERVER=1,5000\r
"); //启动TCP/IP 端口为5000 实现基于网络//控制
ES=1; //允许串口中断
while(1)
if(!start) gongneng();
}
主函数
四、wifi小车APP的设置及系统运行调试
请大家下载“WIFI小车.apk”并安装在手机上,注意该APP只能在安卓系统上运行 。
手机端安装wifi小车遥控器APP
开启手机的无线局域网(WLAN)功能,找到ESP8266模块的名称并连接。然后打开“Unicorn WIFI小车”APP,这里192.168.4.1就是ESP8266模块的默认IP地址,端口号已经设置为5000,直接点击右上角的“连接”按钮。如果没有问题会出现“连接成功”的提示。
蓝
牙
连
接
系统测试
点击右上角的三个点来对按钮进行重新设置。在按钮设置页面,点击要设置的按钮就会出现设置界面。我们可以重新设置按钮的名称、按下及释放时分别发送的控制字符。
按钮重新设置
请大家将按键参数设置成如图表所示的内容,即按下前进、后退、左转、右转四个按键时分别发送1、2、3、4的控制字符,所有按键释放时均发送字符0。大家思考一下这时单片机的控制程序应如何修改呢?
拓
展
训
练
控制信号 对应的小车执行动作
‘1’ 前进
‘2’ 后退
‘3’ 左转
‘4’ 右转
‘0’ 停止
$$