快速玩转蓝牙小车

作者: lexinsmart | 来源:发表于2016-11-22 01:48 被阅读1333次

    一、高级玩法之Tickrobot蓝牙控制小车

    本章所讲述的小车,正是南通大学第七届嵌入式比赛中同学们所使用的智能小车,下面将快速的为大家讲解如何使用Tickrobot开发板搭建出一个可以使用手机蓝牙控制的智能小车。
    (本章主要提起大家对Arduino的认识和兴趣,至于怎么用,如何用后面会接着出详细的教程,希望同学们关注我们的简书,也希望广大同学能多多提出意见,我们将与大家一起成长)


    1、控制APP下载

    同样的,不好意思,到目前为止,我们还是只开发出了Android端的APP,用户可以扫描下面的二维码进行下载.

    乐芯智能

    2、控制原理

    本书所使用的Arduino开发板中,上面的蓝牙芯片与Arduino主控芯片使用的是串口连接,其中蓝牙芯片中已经烧录好配套的固件,成功的做到了串口收到的数据能直接通过蓝牙透传到手机上,同样的,蓝牙从手机上接收到的数据也可以直接通过串口发送到Arduino开发板上。所以用户在开发程序的时候只需要按照一定的协议收发数据就能与本章使用的手机APP进行通信,就能使用手机控制Arduino外设(执行器件)和使用外设(传感器器件)控制手机。
    至于同学们要了解什么是串口,和Arduino串口的使用,可自行点击查询使用教程,我这里就不做重复造轮子讲解了
    下面给出的本小节中手机APP上小车的控制界面

    小车控制界面

    其中,左边是小车的方向和速度控制部分,右边是4个功能键,用户可以根据自己系统要求更改功能键的作用。
    当我们转动操作盘或者点击功能键时,手机就会通过蓝牙发送数据到配对好的蓝牙芯片上,蓝牙芯片会自动解码然后通过串口告诉Arduino此时手机上发生了什么,我们现在要做的就是需要把这段数据解析出来,然后让Arduino执行相应的动作。
    以上这些相信你也看不懂,也没什么用,就接着往下做吧。


    3、代码编写

    同样的,打开电脑端的ArduinoIDE编程软件,没有安装或不知道怎么使用的请移步至环境搭建,
    打开Arduino IDE软件后我们新建一个空的工程:点击文件->新建

    新建工程文档

    选中里面的所有代码,删除

    删除自动生成的代码

    然后我们复制下面的代码段,全部选中 复制,粘贴到新的工程文档中

    //  Arduino 智能小车 自动驾驶
    //--------------乐芯出品--------------------
    int Left_motor_Speed=3;     //左电机速度控制
    int Left_motor_DIR=7;     //左电机方向控制
    
    int Right_motor_Speed=5;    // 右电机速度控制
    int Right_motor_DIR=8;    // 右电机方向控制
    
    #define left_DIR_Change 0
    #define right_DIR_Change 1
    
    float left_speed_scale=0.8;     //左轮速度比例调节
    float right_speed_scale=1.0 ;    //右轮速度比例调节
    
    int temp_V=0;
    int temp_W=0;
    int temp_R=0;
    
    String comdata = "";
    String Speed = "";
    String Angle = "";
    
    
    void setup()
     {
        //初始化电机驱动IO为输出方式
      Serial.begin(115200);
        pinMode(Left_motor_Speed,OUTPUT);   
        pinMode(Left_motor_DIR,OUTPUT);     
        pinMode(Right_motor_Speed,OUTPUT);  
        pinMode(Right_motor_DIR,OUTPUT);    
     }
    void advance(int car_speed)     // 前進
    {   
        analogWrite(Right_motor_Speed,car_speed*right_speed_scale);//PWM比例0~255调速,左右轮差异略增减
        digitalWrite(Right_motor_DIR,right_DIR_Change-LOW);
        analogWrite(Left_motor_Speed,car_speed*left_speed_scale);//PWM比例0~255调速,左右轮差异略增减
        digitalWrite(Left_motor_DIR,left_DIR_Change-LOW); 
    }
    
    void right2(int car_speed)        //右转
    {
    
        analogWrite(Right_motor_Speed,car_speed*right_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Right_motor_DIR,right_DIR_Change-LOW);
      analogWrite(Left_motor_Speed,car_speed*left_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Left_motor_DIR,left_DIR_Change-HIGH); 
    }
    void left2(int car_speed)         //左转(单轮)
    {
      analogWrite(Right_motor_Speed,car_speed*right_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Right_motor_DIR,right_DIR_Change-HIGH);
      analogWrite(Left_motor_Speed,car_speed*left_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Left_motor_DIR,left_DIR_Change-LOW); 
    }
    
    void Brake()         //刹车,停车
    {
        analogWrite(Right_motor_Speed,0);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Right_motor_DIR,right_DIR_Change-LOW);
      analogWrite(Left_motor_Speed,0);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Left_motor_DIR,left_DIR_Change-LOW); 
    }
    
    void Reverse(int car_speed)          //後退
    {
    
      analogWrite(Right_motor_Speed,car_speed*right_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Right_motor_DIR,right_DIR_Change-HIGH);
      analogWrite(Left_motor_Speed,car_speed*left_speed_scale);//PWM比例0~255调速,左右轮差异略增减
      digitalWrite(Left_motor_DIR,left_DIR_Change-HIGH); 
    }
    
    void loop()
    {
    
      while (Serial.available() > 0)//监听是否有数据被接收,如果没有收到,就一直循环监听,直到收到数据
      {
        comdata += char(Serial.read());
        delay(1);
      }
      if (comdata.length() > 0)//
       {
         if (comdata.indexOf("angle:") != -1)//获取方向盘角度(0~360度)
         {
           Angle=comdata.substring(comdata.indexOf("angle:") + 6,comdata.indexOf('/'));
           temp_W=Angle.toInt();
         }
         
         if (comdata.indexOf("speed:") != -1)//获取方向盘速度(0~15)
         {
           Speed=comdata.substring(comdata.indexOf("speed:") + 6,comdata.indexOf(';'));
           temp_V=Speed.toInt();
         }
         if (comdata.indexOf('A') != -1)
         {
           //A键触发
         }
         if (comdata.indexOf('B') != -1)
         {
           //B键触发
         }
         if (comdata.indexOf('C') != -1)
         {
           //C键触发
         }
         if (comdata.indexOf("beep") != -1)
         {
           //喇叭按键触发
         }
         //------------------------>角度速度融合控制小车前进后退和转向
         if((temp_W<=45)||(temp_W>315))
         {
          right2(temp_V*17);
         }
         else if((temp_W<=135)&&(temp_W>45))
         {
         advance(temp_V*17);
         }
         else if((temp_W<=225)&&(temp_W>135))
         {
         left2(temp_V*17);
         }
         else if((temp_W<=315)&&(temp_W>225))
         {
         Reverse(temp_V*17);
         }
         //<-------------------------------------
         //Serial.println(comdata);
         comdata = "";
         Speed="";
         Angle="";
         temp_V=0;
         temp_W=0;
         temp_R=0;
       }
      delay(10);
      
      
    }
    
    粘贴的代码

    然后点击文件->保存,保存在哪里大家自便。
    后面就只需要编译,下载就行。(不懂的请移步至如何点亮第一个LED灯


    4、手机蓝牙连接Arduino开发板,玩转小车

    (1)第一步

    给我们的Arduino开发板接上电源,确定蓝牙模块区域的蓝色小灯此时正处于闪烁状态

    (2)第二步

    打开刚下载好的乐芯智能APP,第一个界面将会是搜索我们的Arduino蓝牙设备,我这里的Arduino蓝牙设备是乐芯智能,同学们选择好自己的蓝牙设备点击即可


    蓝牙设备选择

    (3)第三步

    进入界面后,选择右上角的功能按钮,进入小车控制模式,或者从屏幕右边缘往左滑动

    小车控制模式

    (4)第四步

    嗨起来的玩吧!


    5、玩不起来的继续往下看

    问题一:小车方向不确定

    由于大家小车硬件上电机的正负极焊接时没有统一,会有方向不对的问题,这里就需要大家稍微改代码
    在代码中,有两个定义段:
    #define left_DIR_Change 0
    #define right_DIR_Change 0
    同学们只需要在这里做更改就好。
    我们把小车控制盘往前开,如果左轮方向是反的,就把left_DIR_Change后的0改成1,右轮也是一样的。
    改好之后插上USB连接线重新下载

    问题二:手机APP兼容性问题

    这里希望同学们谅解,手机APP还在兼容测试当中,希望同学们积极反馈,我们会尽快修复问题。
    我们会尽快推出ios端的版本,敬请期待。

    问题三

    根据同学反映,车子在前进时走的不是直线,而是弧线,这是因为直流电机在受到阻力时速度是不可控的,各种原因会导致电机受到的阻力不一样,所以在给相同的PWM波时,电机的转速会不一样,所以我们这里需要对代码进行适当修改
    在代码中,有两个定义段:

    float left_speed_scale=0.85     //左轮速度比例调节
    float right_speed_scale=1.0     //右轮速度比例调节
    

    这里是在左右轮速度上分别乘一个比例,举个栗子:车子前进时是向右弧线前进,就说明左轮速度快了,我们把左轮速度乘以一个比例,比如0.85,然后重新编译,下载,继续尝试前进时走的是否是直线,如果不是则继续调节比例,直到自己认为可以时就行。同理,右轮也是一样的。
    注意:这里的比例不能大于1!

    问题四

    这里有的同学程序下载进去了发现小车不受控制,而且有一个轮子一直在瞎转,这里有可能是Arduino核心板到驱动板的排线接错了,驱动板排线附近标有的A0 A1 A2 P2 P3………P11对应到核心板的编号分别是:
    驱动板—Arduino核心板
    A0————A0
    A1————A1
    A2————A2
    P2————2
    P3————3
    P4————4
    P5————5
    P6————6
    P7————7
    P8————8
    P9————9
    P10————10
    P11————11

    驱动板编号位置 核心板编号位置

    希望同学们关注我们的简书,多提出宝贵意见,我们将以一种全新的方式带领大家轻轻松松过二级,学会基本的电子电路设计。

    相关文章

      网友评论

        本文标题:快速玩转蓝牙小车

        本文链接:https://www.haomeiwen.com/subject/snkppttx.html