查看: 72571|回复: 752

《博哥玩Arduino》-WIFI小车-调试实操篇

  [复制链接]
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

    发表于 2016-11-27 22:33 | 显示全部楼层 |阅读模式
    本帖最后由 单片机菜鸟 于 2018-9-15 09:41 编辑

    一、前言  
        app源码下载地址
    游客:你好,这个内容被隐藏了,你先要购买才能查看此内容。

        app下载地址
    游客:你好,这个内容被隐藏了,你先要购买才能查看此内容。

       在阅读此篇已之前,请先看WIFI原理篇以及蓝牙小车篇章,并且按照原理篇讲解,做好ESP8266模块的基本配置,以下代码都是基于基本配置进行的。

         《博哥玩Arduino》-蓝牙小车-基础篇
               http://www.arduino.cn/forum.php? ... 31059&fromuid=93655   (出处: Arduino中文社区)
        《博哥玩Arduino》-蓝牙小车-实操篇
               http://www.arduino.cn/forum.php? ... 31096&fromuid=93655   (出处: Arduino中文社区)
        《博哥玩Arduino》-WIFI小车-基础篇
              http://www.arduino.cn/forum.php? ... 31228&fromuid=93655    (出处: Arduino中文社区)

         先上两个调试图,有图有真相:          234020odjjuhoj9f9riojo.png
          234029f3hi9vizo75nz5ca.png
         接线:
          234215sokbbc242l07o3ss.jpg

         这里我们采用软串口和8266模块通信,硬串口用来打印调试信息到电脑端串口调试助手。
          UTXD          ---->            10(软串口RX)
          URXD          ---->            11(软串口TX)


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

    kittenblock中小学创客名师推荐的图形化编程软件

    #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 == ':'){
              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;
    }
    


    三、WIFI小车 App
        app太大限制共享不了,需要的人请留言给楼主
            把App先安装到手机上,然后进行以下操作:
            第一步,先去wifi连接去寻找WifiCar这个热点,点击连接,输入密码123456123456,这是我自己设置的,个人喜好。
    235943j1n5bkxd5ekzv5g6.jpg 第二步,点击进入App
    235932k7cu7qzgzl7chqe5.jpg
    该页面有两个东西,首先先点击右下角的按钮,就会进入IP和端口设置页面,我默认设置为192.168.4.1/8080,这里支持自定义的,点击保存就好。
    235939zv1ww9z0wutg0k2w.jpg
    然后就可以点击“老司机发车,点击连接小车”,如无意外,应该就会进入下面页面:
    235936ojdqxlswiwad4nqa.jpg
    这里就可以看到上下左右停止5个按钮以及左下角自定义编码按钮。我默认设置为左3右4 上1下2 停0,这里也支持自定义,点击保存。
    235924cfhccfg5jc5leqle.jpg
    不过要记住同时要修改Arduino里面的代码。我测试时的截图如下:
    235909fx5styi3z3sz3t58.png
            这就证明整个通信过程是正确的,Arduino能够收到app端发起的正确指令。

       可惜的是,由于我的Arduino板子以及电机是同一个电源,当电机跑起来的时候经常会影响到我的8266模块,所以就没有录制视频。
        解决方案:独立供电,应该可以解决这个问题,由于楼主比较懒,故没有去做这个,只是把主要的东西讲解清楚,有意愿的可以自己尝试去弄。

       扩展:这里就是一种 Arduino + wifi +app的模式,其实跟物联网有点类似了,我们就可以基于这种模式,然后可以去DIY wifi遥控器  wifi遥控灯 之类的一些列东西。
       后期楼主,想利用一下yeelink这个物联网平台,使用8266模块,上传本地数据。

    博哥自建qq交流群:869920142

    博哥系列文章:

    《博哥玩Arduino》-测试RC522模块

          http://www.arduino.cn/forum.php? ... 24034&fromuid=93655   (出处: Arduino中文社区)
    《博哥玩Arduino》-蓝牙小车-基础篇
         http://www.arduino.cn/forum.php? ... 31059&fromuid=93655   (出处: Arduino中文社区)
    《博哥玩Arduino》-蓝牙小车-实操篇
         http://www.arduino.cn/forum.php? ... 31096&fromuid=93655   (出处: Arduino中文社区)
    《博哥玩Arduino》-WIFI小车-基础篇
         http://www.arduino.cn/forum.php? ... 31228&fromuid=93655   (出处: Arduino中文社区)
    《博哥玩Arduino》-WIFI小车-调试实操篇
        http://www.arduino.cn/forum.php? ... 31518&fromuid=93655    (出处: Arduino中文社区)
    《博哥玩Arduino》- 蓝牙模块HC06 重命名
        http://www.arduino.cn/forum.php? ... 31517&fromuid=93655    (出处: Arduino中文社区)
    《博哥玩Arduino》- 蓝牙RGB灯
        http://www.arduino.cn/forum.php? ... 31519&fromuid=93655   (出处: Arduino中文社区)
    《博哥玩Arduino》-Arduino语法手册
        http://www.arduino.cn/forum.php? ... 31521&fromuid=93655    (出处: Arduino中文社区)






    阅读此主题需要您支付 1元,请点击下方按钮支付。
  • TA的每日心情
    郁闷
    2016-12-27 17:10
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-11-28 13:48 | 显示全部楼层
    来个APP。同时,请教APP编写教程(特小白)
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-11-28 21:42 | 显示全部楼层
    MP76a5 发表于 2016-11-28 21:28
    楼主求APP, 谢谢啦!

    已发 请注意查收
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-11-28 08:44 | 显示全部楼层
    楼主自己镇楼
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-11-28 09:57 | 显示全部楼层

    谢谢哈哈哈哈哈
  • TA的每日心情
    郁闷
    2016-12-27 17:10
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-11-28 13:49 | 显示全部楼层
    ignore 发表于 2016-11-28 13:48
    来个APP。同时,请教APP编写教程(特小白)

    461142549@qq.com
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-11-28 14:20 | 显示全部楼层

    晚点再发给你  apk在家里电脑  有问题也可以加我qq  2421818708
  • TA的每日心情
    开心
    2019-2-21 09:05
  • 签到天数: 609 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-11-28 19:09 | 显示全部楼层

    已经给你发过去了
  • TA的每日心情
    郁闷
    2017-2-7 19:57
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2016-11-28 21:28 | 显示全部楼层
    楼主求APP,451360494@qq.com 谢谢啦!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库
    博哥零基础教你玩转ESP826
    帖子导航帖 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ)
    求助!WeMos D1 WiFi怎么
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ) 想用WeMos D1 WiFi接收服务器的数据然
    串口发送16进制指令求助
    串口发送16进制指令求助
    我准备串口发出16进制指令到我的外置设备 代码如下图 我分别监控ARDUINO的tx口和USB口
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    大神们!1602显示屏上的MQ2浓度示数不是实时监测的何解
    大神们!1602显示屏上的MQ
    本人小白,刚刚接触arduino,长时间的查阅资料后,通过复制修改代码接线实现了DHT11实
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表