找回密码
 立即注册

QQ登录

只需一步,快速开始

点击进入授权页面

只需一步,快速开始

  • QQ空间
  • 回复
  • 收藏

参加活动: 1

组织活动: 0

  • TA的每日心情
    开心
    2017-9-21 08:41
  • 签到天数: 255 天

    [LV.8]以坛为家I

    本帖最后由 单片机菜鸟 于 2017-8-2 17:03 编辑

    一、前言
         在阅读此篇已之前,请先看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程序  
         
          请烧入以下代码:
          
    [C] 纯文本查看 复制代码
    #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;
    }
    


    三、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模块,上传本地数据。


    博哥系列文章:

    《博哥玩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中文社区)
    打赏作者鼓励一下!
    来个APP。同时,请教APP编写教程(特小白)
    楼主自己镇楼
    打赏作者鼓励一下!

    1人打赏


    谢谢哈哈哈哈哈
    打赏作者鼓励一下!
    ignore 发表于 2016-11-28 13:48
    来个APP。同时,请教APP编写教程(特小白)

    461142549@qq.com

    晚点再发给你  apk在家里电脑  有问题也可以加我qq  2421818708
    打赏作者鼓励一下!

    已经给你发过去了
    打赏作者鼓励一下!
    楼主求APP,451360494@qq.com 谢谢啦!
    MP76a5 发表于 2016-11-28 21:28
    楼主求APP, 谢谢啦!

    已发 请注意查收
    打赏作者鼓励一下!
    发表评论
    高级模式  
    您需要登录后才可以回帖 登录 | 立即注册  
    关闭

    推荐主题 上一条 /2 下一条