美文网首页单片机学习物联网之家首页投稿(暂停使用,暂停投稿)
教菜鸟做蓝牙遥控小车——基于安卓平台和51单片机(开放源码)

教菜鸟做蓝牙遥控小车——基于安卓平台和51单片机(开放源码)

作者: W_Honor | 来源:发表于2017-08-04 10:06 被阅读1071次

    准备

    首先准备一下硬件材料:

    • 四驱(或二驱)小车底盘套件(一套)

    • STC89C52RC单片机(一个)

    • 51单片机最小系统(一个)

    • HC-05蓝牙模块(一个)

    • L298N电机驱动模块(一个)

    • 12V充电理电池组(一个)

    • 杜邦线(若干)

    小车套件

    这里L298N驱动模块一个芯片原设计是驱动两个电机,制作过程中我实验了一下,驱动四个电机是没问题的,只不过散热片发热量比较大,基于模块的耐用性使用起来是没有妨碍的。

    其次是软件平台的准备:

    • Keil 5 用来编写51单片机程序

    • AndroidStudio 2.2.3

    • Android SDK Version23

    • Gradle Version 2.14.1

    以上软件准备部分,除了第一个必备以外,其余的都是android开发的基础配置,也就是我开发过程的配置,没有基础的可以绕过,硬要自学的话也要大约一年的时间,后面我会给出全部的源码。


    配置HC-05蓝牙模块

    该模块有两种工作方式:命令响应模式和自动连接模式。

    命令响应模式就是AT指令模式,用USB转TTL模块连接蓝牙与电脑串口,通过AT指令修改相关参数。蓝牙模块默认的波特率是9600,0校验位,0停止位。通电之前一定要按住模块上的复位按钮直到通电约2秒后松开,用这种方式进入命令响应模式后,在串口助手中发送AT之前务必要选择38400波特率,如此便可正常通信。

    串口助手波特率设置

    自动连接模式分为三种模式:被动连接、主动连接、回环连接。回环连接也属于被动连接,不同之处在于是否返回数据信息。

    我用的都是默认参数,也就是9600波特率,被动模式。


    设定通信协议

    通信都有一定规则协议,要想实现上位机(安卓平台)和下位机(单片机)的同步,我们就要事先设定好我们这个系统的协议。

    以下是我设定的协议:

    命令 发送的字符 返回的字符
    前进 1 1
    后退 2 2
    右转 3 3
    左转 4 4
    停止 0或任意字符 stop

    安卓平台的APP会发送相应的字符到单片机中,之后会接收到单片机系统返回的字符信息,表明其成功接收。

    APP中的每个控制按键按下的动作都会对应一个特定的字符,同时弹起的动作都对应“停止”的命令字符。(这里的介绍会涉及到些许的安卓开发的内容)


    开发下位机程序

    单片机的程序主要涉及到串口通信,一方面是串口接收字符或字符串,一方面是串口发送字符或字符串,内容相对简单。需要学习的知识主要是串口中断、串口控制寄存器、串口方式寄存器、定时/计数器等。

    我在系统运用了STC89C52RC单片机的定时器2,让其作为波特率发生器,产生9600的波特率。如果在单片机系统中定时器够用的话,用定时器0或定时器1是绝对没问题的,因为我个人系统的冗余关系,其他定时器都被占用,所以用上了不常用的定时器2。其实还是推荐用定时器2作为波特率发生器的,由于它拥有16位寄存器,能装载更大的数字量,所以能够产生很高的波特率数值。它有自己独立的控制寄存器,用法与定时器0/1相同。

    定时器2初使化:

       RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;//FOSC是预定义的晶振
       RCAP2L = (65536-(FOSC/32/BAUD));//BAUD是预定义的波特率
       TH2 = RCAP2H;//设置此处为16位自动重载
       TL2 = RCAP2L;
       T2CON = 0x34;
       T2MOD = 0;
       ES = 1;
       EA = 1;
    

    蓝牙小车下位机系统中用到的串口程序主要有:

    1. 字符接收程序

      if(RI == 1)//当有字符传来时,机器自动接收并将接收标志位置1
      {
        RI = 0;
        RecData = SBUF;//接收一个字符
      }
      
    2. 字符发送程序:

         ES=0;//发送过程中避免干扰,关闭串口中断
         SBUF=dat;//随后发送一个字符
         while(!TI);//等待发送完
         TI=0;
         ES=1;
      
    3. 字符串发送程序:

          while(str[i] != '\0')//字符串以‘\0’为结尾,遍历每个字符
        {
          ES = 0;
          SBUF = str[i];
          while(!TI);
          TI = 0;
          i++;
          ES = 1;
         }
         i = 0;
      

    在主程序中其实没什么东西,让系统一直等待,直到串口产生中断,接收或发送协议内容。


    上位机程序

    主要是蓝牙API的运用,关于运行机制那就是看需求而定了。

    我编写的程序已经绑定好蓝牙模块的MAC地址,打开APP之前需打开设备的蓝牙功能并且配对成功,然后才可进入工作台,这样做方便了以后的运用。不更换模块还好,如果换作其它蓝牙模块的话就显的臃肿了,由于MAC地址变了,所以软件绑定的地址要重新改写,我并没有将这个操作提升到UI行为,只能在源代码中修改。源代码的核心部分是相同的,主体是建立连接发送字符流的行为,其运行机制每个人可以按需而定。

    这是我设计的app的UI:

    app~UI

    最后,概览整个系统,安卓app等于领导,蓝牙属于传话的介质,单片机属于员工,只要领导下达指令,经过信息送达给员工,那么员工就可以依据工作了。

    github源码地址

    相关文章

      网友评论

      本文标题:教菜鸟做蓝牙遥控小车——基于安卓平台和51单片机(开放源码)

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