教菜鸟做蓝牙遥控小车——基于安卓平台和51单片机(开放源码)
准备
首先准备一下硬件材料:
-
四驱(或二驱)小车底盘套件(一套)
-
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;
蓝牙小车下位机系统中用到的串口程序主要有:
-
字符接收程序
if(RI == 1)//当有字符传来时,机器自动接收并将接收标志位置1 { RI = 0; RecData = SBUF;//接收一个字符 }
-
字符发送程序:
ES=0;//发送过程中避免干扰,关闭串口中断 SBUF=dat;//随后发送一个字符 while(!TI);//等待发送完 TI=0; ES=1;
-
字符串发送程序:
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等于领导,蓝牙属于传话的介质,单片机属于员工,只要领导下达指令,经过信息送达给员工,那么员工就可以依据工作了。