本帖最后由 单片机菜鸟 于 2016-11-28 12:53 编辑
一、前言
在阅读此篇已之前,请先看WIFI原理篇以及蓝牙小车篇章,并且按照原理篇讲解,做好ESP8266模块的基本配置,以下代码都是基于基本配置进行的。
《博哥玩Arduino》-蓝牙小车-基础篇
http://www.geek-workshop.com/thread-27767-1-1.html(出处: 极客工坊)
《博哥玩Arduino》-蓝牙小车-实操篇
http://www.geek-workshop.com/thread-27777-1-1.html(出处: 极客工坊)
《博哥玩Arduino》-WIFI小车-基础篇
http://www.geek-workshop.com/thread-27850-1-1.html (出处: 极客工坊)
先上两个调试图,有图有真相:
接线:
这里我们采用软串口和8266模块通信,硬串口用来打印调试信息到电脑端串口调试助手。
UTXD ----> 10(软串口RX)
URXD ----> 11(软串口TX)
二、烧录Arduino程序
请烧入以下代码:
- #include <SoftwareSerial.h>
- /*
- 日期: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);
- void setup() {
- 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");
- }
-
- void loop() {
- char buf[100];
- int leng = ReceiveWifiMessage(buf);
- if(leng>0){
- if(strcmp(buf, GO) == 0){
- Serial.println("go");
- //前进
- go();
- }else if(strcmp(buf, BACK) == 0){
- Serial.println("back");
- //后退
- back();
- }else if(strcmp(buf, LEFT) == 0){
- //左转
- Serial.println("left");
- turnLeft();
- }else if(strcmp(buf, RIGHT) == 0){
- //右转
- Serial.println("right");
- turnRight();
- }else if(strcmp(buf, STOP) == 0){
- //停车
- Serial.println("stop");
- stopCar();
- }
- }
- }
- void initCar(){
- //默认全是低电平 停止状态
- digitalWrite(IN1,LOW);
- digitalWrite(IN2,LOW);
- digitalWrite(IN3,LOW);
- digitalWrite(IN4,LOW);
- }
- /**
- * 左转
- */
- void turnLeft(){
- digitalWrite(IN1,HIGH);
- digitalWrite(IN2,LOW); //右轮前进
- digitalWrite(IN3,LOW);
- digitalWrite(IN4,LOW); //左轮不动
- }
- /**
- * 右转
- */
- void turnRight(){
- digitalWrite(IN1,LOW);
- digitalWrite(IN2,LOW); //右轮不动
- digitalWrite(IN3,HIGH);
- digitalWrite(IN4,LOW); //左轮前进
- }
- /**
- * 前进
- */
- void go(){
- digitalWrite(IN1,HIGH);
- digitalWrite(IN2,LOW); //右轮前进
- digitalWrite(IN3,HIGH);
- digitalWrite(IN4,LOW); //左轮前进
- }
- /**
- * 倒车
- */
- void back(){
- digitalWrite(IN1,LOW);
- digitalWrite(IN2,HIGH); //右轮后退
- digitalWrite(IN3,LOW);
- digitalWrite(IN4,HIGH); //左轮后退
- }
- /**
- * 停车
- */
- void stopCar(){
- initCar();
- }
- /**
- * 读取串口缓冲区里面的数据
- */
- int ReceiveWifiMessage(char *buf){
- //+IPD,<len>:<data>
- //+IPD,<id>,<len>:<data>
- String data = "";
- if (mySerial.available()>0){
- unsigned long start;
- start = millis();
- char c0 = mySerial.read();
- if (c0 == '+')
- {
- while (millis()-start<100)
- {
- if (mySerial.available()>0)
- {
- char c = mySerial.read();
- data += c;
- }
- if (data.indexOf("\nOK")!=-1)
- {
- break;
- }
- }
- int sLen = strlen(data.c_str());
- int i,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;
- }
- }
- int iSize;
- if(found ==true){
- //+IPD,<id>,<len>:<data>
- 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,<len>:<data>
- String _size = data.substring(4, i);
- iSize = _size.toInt();
- String str = data.substring(i+1, i+1+iSize);
- strcpy(buf, str.c_str());
- }
- return iSize;
- }else{
- while(mySerial.read() >= 0){}
- }
- }
- return 0;
- }
复制代码
代码解释:setup里面初始化串口以及ESP8266模块,loop中就不断监听app发过来的控制命令
三、WIFI小车 App
需要楼主共享app的麻烦在帖子留言
把App先安装到手机上,然后进行以下操作:
第一步,先去wifi连接去寻找WifiCar这个热点,点击连接,输入密码123456123456,这是我自己设置的,个人喜好。
第二步,点击进入App
该页面有两个东西,首先先点击右下角的按钮,就会进入IP和端口设置页面,我默认设置为192.168.4.1/8080,这里支持自定义的,点击保存就好。
然后就可以点击“老司机发车,点击连接小车”,如无意外,应该就会进入下面页面:
这里就可以看到上下左右停止5个按钮以及左下角自定义编码按钮。我默认设置为左3右4 上1下2 停0,这里也支持自定义,点击保存。
不过要记住同时要修改Arduino里面的代码。我测试时的截图如下:
这就证明整个通信过程是正确的,Arduino能够收到app端发起的正确指令。
可惜的是,由于我的Arduino板子以及电机是同一个电源,当电机跑起来的时候经常会影响到我的8266模块,所以就没有录制视频。
解决方案:独立供电,应该可以解决这个问题,由于楼主比较懒,故没有去做这个,只是把主要的东西讲解清楚,有意愿的可以自己尝试去弄。
扩展:这里就是一种 Arduino + wifi +app的模式,其实跟物联网有点类似了,我们就可以基于这种模式,然后可以去DIY wifi遥控器 wifi遥控灯 之类的一些列东西。
后期楼主,想利用一下yeelink这个物联网平台,使用8266模块,上传本地数据。
博哥系列文章:
《博哥玩Arduino》-蓝牙小车-基础篇
http://www.geek-workshop.com/thread-27767-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-蓝牙小车-实操篇
http://www.geek-workshop.com/thread-27777-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-Arduino语法手册
http://www.geek-workshop.com/thread-27843-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-WIFI小车-基础篇
http://www.geek-workshop.com/thread-27850-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-WIFI小车-调试实操篇
http://www.geek-workshop.com/thread-27853-1-1.html (出处: 极客工坊)
《博哥玩Arduino》- 蓝牙模块HC06 重命名
http://www.geek-workshop.com/thread-27897-1-1.html (出处: 极客工坊)
《博哥玩Arduino》- 蓝牙RGB灯
http://www.geek-workshop.com/thread-27892-1-1.html (出处: 极客工坊)
|