单片机菜鸟 发表于 2016-11-19 00:15:22

《博哥玩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(出处: 极客工坊)
   

单片机菜鸟 发表于 2016-11-19 00:17:37

自己做第一个冷板凳

独行者 发表于 2016-11-19 10:57:23

楼主辛苦,谢谢分享!我没有Arduino板子,只有STC单片机。可惜我是菜鸟。:'(

单片机菜鸟 发表于 2016-11-19 11:01:27

独行者 发表于 2016-11-19 10:57
楼主辛苦,谢谢分享!我没有Arduino板子,只有STC单片机。可惜我是菜鸟。

Arduino板子是次要的主要还是理解原理 用STC单片机应该也是可以的

独行者 发表于 2016-11-19 11:15:10

理解原理,可惜我是菜鸟不会移植程序。:funk:

单片机菜鸟 发表于 2016-11-19 11:32:14

独行者 发表于 2016-11-19 11:15
理解原理,可惜我是菜鸟不会移植程序。

这个应该不难只要懂单片机原理加上去看一下arduino的基本语法就可以移植了。arduino算是比较简单的

独行者 发表于 2016-11-19 16:09:51

是的,真是会者不难,难者不会,只好慢慢的以后再说!谢谢你。

单片机菜鸟 发表于 2016-11-19 16:31:33

独行者 发表于 2016-11-19 16:09
是的,真是会者不难,难者不会,只好慢慢的以后再说!谢谢你。

慢慢弄了 这个也是急不来的 把基础弄好

独行者 发表于 2016-11-20 08:20:39

是呀E文不好,那些程序语句老是记不住更别说编程啦!:'(

血阳 发表于 2016-11-20 22:22:44

还没摸WIFI模块,在此学习了。

单片机菜鸟 发表于 2016-11-20 22:49:33

独行者 发表于 2016-11-20 08:20
是呀E文不好,那些程序语句老是记不住更别说编程啦!

E文不好不太影响编程

单片机菜鸟 发表于 2016-11-20 22:50:45

血阳 发表于 2016-11-20 22:22
还没摸WIFI模块,在此学习了。

可以买来玩玩还是不错也不贵

ILLUSION 发表于 2016-11-21 09:28:57

请问六线ESP8266是不是只需要连接RX TX GND VCC,没用过这个模块,有没有调试码

单片机菜鸟 发表于 2016-11-21 09:44:37

ILLUSION 发表于 2016-11-21 09:28
请问六线ESP8266是不是只需要连接RX TX GND VCC,没用过这个模块,有没有调试码

可以看一下我写的 基础篇http://www.geek-workshop.com/thread-27850-1-1.html

z586 发表于 2016-11-21 10:41:24

请问: while (millis()-start<100) 此处延时有什么意义?此外,楼主如果改成透传模式,是不是更方便呢?谢谢!
页: [1] 2 3 4 5 6 7
查看完整版本: 《博哥玩Arduino》-WIFI小车-调试实操篇