极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 163246|回复: 90

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

[复制链接]
发表于 2016-11-19 00:15:22 | 显示全部楼层 |阅读模式
本帖最后由 单片机菜鸟 于 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程序  
     
      请烧入以下代码:
     
  1. #include <SoftwareSerial.h>
  2. /*
  3. 日期:2016/11/18
  4. 功能:wifi小车程序
  5. 作者:单片机菜鸟
  6. */

  7. #define IN1 6 // 7 6 右轮
  8. #define IN2 7
  9. #define IN3 4 // 5 4 左轮
  10. #define IN4 5

  11. #define LEFT "3" //左转编码
  12. #define RIGHT "4"//右转编码
  13. #define GO "1"//前进编码
  14. #define BACK "2"//后退编码
  15. #define STOP "0"//停止编码

  16. SoftwareSerial mySerial(10,11);

  17. void setup() {
  18.   pinMode(IN1,OUTPUT);
  19.   pinMode(IN2,OUTPUT);
  20.   pinMode(IN3,OUTPUT);
  21.   pinMode(IN4,OUTPUT);
  22.   // set the data rate for the SoftwareSerial port
  23.   mySerial.begin(9600);
  24.   Serial.begin(9600);
  25.   delay(1000);
  26.   //开启多连接模式命令
  27.   mySerial.println("AT+CIPMUX=1");
  28.   //开启服务器模式    8080为端口号,手机连接时会用到
  29.   delay(2000);
  30.   mySerial.println("AT+CIPSERVER=1,8080");
  31.   delay(3000);
  32.   while(Serial.read() >= 0){}
  33.   while(mySerial.read() >= 0){}
  34.   initCar();
  35.   Serial.println("wificar init");
  36. }

  37. void loop() {
  38.     char buf[100];
  39.     int leng = ReceiveWifiMessage(buf);

  40.     if(leng>0){
  41.       if(strcmp(buf, GO) == 0){
  42.         Serial.println("go");
  43.          //前进
  44.          go();
  45.       }else if(strcmp(buf, BACK) == 0){
  46.         Serial.println("back");
  47.          //后退
  48.          back();
  49.       }else if(strcmp(buf, LEFT) == 0){
  50.          //左转
  51.          Serial.println("left");
  52.          turnLeft();
  53.       }else if(strcmp(buf, RIGHT) == 0){
  54.         //右转
  55.         Serial.println("right");
  56.         turnRight();
  57.       }else if(strcmp(buf, STOP) == 0){
  58.         //停车
  59.         Serial.println("stop");
  60.         stopCar();
  61.       }
  62.     }
  63. }

  64. void initCar(){
  65.   //默认全是低电平 停止状态
  66.   digitalWrite(IN1,LOW);      
  67.   digitalWrite(IN2,LOW);
  68.   digitalWrite(IN3,LOW);   
  69.   digitalWrite(IN4,LOW);
  70. }

  71. /**
  72. * 左转
  73. */
  74. void turnLeft(){
  75.   digitalWrite(IN1,HIGH);      
  76.   digitalWrite(IN2,LOW);         //右轮前进
  77.   digitalWrite(IN3,LOW);      
  78.   digitalWrite(IN4,LOW);         //左轮不动
  79. }

  80. /**
  81. * 右转
  82. */
  83. void turnRight(){
  84.   digitalWrite(IN1,LOW);      
  85.   digitalWrite(IN2,LOW);         //右轮不动
  86.   digitalWrite(IN3,HIGH);      
  87.   digitalWrite(IN4,LOW);         //左轮前进
  88. }

  89. /**
  90. * 前进
  91. */
  92. void go(){
  93.   digitalWrite(IN1,HIGH);      
  94.   digitalWrite(IN2,LOW);         //右轮前进
  95.   digitalWrite(IN3,HIGH);      
  96.   digitalWrite(IN4,LOW);         //左轮前进
  97. }

  98. /**
  99. * 倒车
  100. */
  101. void back(){
  102.   digitalWrite(IN1,LOW);      
  103.   digitalWrite(IN2,HIGH);        //右轮后退
  104.   digitalWrite(IN3,LOW);      
  105.   digitalWrite(IN4,HIGH);        //左轮后退
  106. }

  107. /**
  108. * 停车
  109. */
  110. void stopCar(){
  111.   initCar();
  112. }

  113. /**
  114. * 读取串口缓冲区里面的数据
  115. */
  116. int ReceiveWifiMessage(char *buf){
  117.   //+IPD,<len>:<data>
  118.   //+IPD,<id>,<len>:<data>
  119.   String data = "";
  120.   if (mySerial.available()>0){
  121.     unsigned long start;
  122.     start = millis();
  123.     char c0 = mySerial.read();
  124.     if (c0 == '+')
  125.     {
  126.       while (millis()-start<100)
  127.       {
  128.         if (mySerial.available()>0)
  129.         {
  130.           char c = mySerial.read();
  131.           data += c;
  132.         }
  133.         if (data.indexOf("\nOK")!=-1)
  134.         {
  135.           break;
  136.         }
  137.       }

  138.       int sLen = strlen(data.c_str());
  139.       int i,j;
  140.       for (i = 0; i <= sLen; i++){
  141.         if (data[i] == ':'){
  142.           break;
  143.         }
  144.       }
  145.       //判断是否存在id
  146.       boolean found = false;
  147.       for (j = 4; j <= i; j++){
  148.         if (data[j] == ','){
  149.           found = true;
  150.           break;
  151.         }
  152.       }
  153.       int iSize;
  154.       if(found ==true){
  155.         //+IPD,<id>,<len>:<data>
  156.           String _size = data.substring(j+1, i);
  157.           iSize = _size.toInt();
  158.           String str = data.substring(i+1, i+1+iSize);
  159.           strcpy(buf, str.c_str());     
  160.       }else{
  161.         //+IPD,<len>:<data>     
  162.           String _size = data.substring(4, i);
  163.           iSize = _size.toInt();
  164.           String str = data.substring(i+1, i+1+iSize);
  165.           strcpy(buf, str.c_str());
  166.       }
  167.       return iSize;
  168.     }else{
  169.       while(mySerial.read() >= 0){}  
  170.     }
  171.   }
  172.   return 0;
  173. }
复制代码
   

    代码解释: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  (出处: 极客工坊)

   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 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 | 显示全部楼层
理解原理,可惜我是菜鸟不会移植程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 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模块,在此学习了。

可以买来玩玩  还是不错  也不贵
回复 支持 反对

使用道具 举报

发表于 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
回复 支持 反对

使用道具 举报

发表于 2016-11-21 10:41:24 | 显示全部楼层
请问: while (millis()-start<100) 此处延时有什么意义?此外,楼主如果改成透传模式,是不是更方便呢?谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 05:56 , Processed in 0.054136 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表