《博哥玩Arduino》-WIFI小车-调试实操篇
本帖最后由 单片机菜鸟 于 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;
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 == ':'){
break;
}
}
//判断是否存在id
boolean found = false;
for (j = 4; j <= i; j++){
if (data == ','){
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(出处: 极客工坊)
自己做第一个冷板凳 楼主辛苦,谢谢分享!我没有Arduino板子,只有STC单片机。可惜我是菜鸟。:'( 独行者 发表于 2016-11-19 10:57
楼主辛苦,谢谢分享!我没有Arduino板子,只有STC单片机。可惜我是菜鸟。
Arduino板子是次要的主要还是理解原理 用STC单片机应该也是可以的 理解原理,可惜我是菜鸟不会移植程序。:funk: 独行者 发表于 2016-11-19 11:15
理解原理,可惜我是菜鸟不会移植程序。
这个应该不难只要懂单片机原理加上去看一下arduino的基本语法就可以移植了。arduino算是比较简单的 是的,真是会者不难,难者不会,只好慢慢的以后再说!谢谢你。 独行者 发表于 2016-11-19 16:09
是的,真是会者不难,难者不会,只好慢慢的以后再说!谢谢你。
慢慢弄了 这个也是急不来的 把基础弄好 是呀E文不好,那些程序语句老是记不住更别说编程啦!:'( 还没摸WIFI模块,在此学习了。 独行者 发表于 2016-11-20 08:20
是呀E文不好,那些程序语句老是记不住更别说编程啦!
E文不好不太影响编程 血阳 发表于 2016-11-20 22:22
还没摸WIFI模块,在此学习了。
可以买来玩玩还是不错也不贵 请问六线ESP8266是不是只需要连接RX TX GND VCC,没用过这个模块,有没有调试码 ILLUSION 发表于 2016-11-21 09:28
请问六线ESP8266是不是只需要连接RX TX GND VCC,没用过这个模块,有没有调试码
可以看一下我写的 基础篇http://www.geek-workshop.com/thread-27850-1-1.html 请问: while (millis()-start<100) 此处延时有什么意义?此外,楼主如果改成透传模式,是不是更方便呢?谢谢!