首页 > 代码库 > 自己动手做个智能小车(7)
自己动手做个智能小车(7)
自己动手做个智能小车(7)
——整入蓝牙设备
写个程序小车可以自己跑了,但没法遥控啊,得给它安个通讯设备。目前比较方便的就是蓝牙了,有了蓝牙后,就可以与手机、电脑来进行通讯,很是方便。
单片机要发蓝牙信号,那就只有采用蓝牙模块了。
本系统中采用了HC-06无线蓝牙串口透传模块,样子如下:
采用这个,主要是因为简单,只要4个引脚,电源正负极,以及串口的输入输出口即可,所以看好了单片机的串口引脚:
P3.6 P3.7然后直接连接上即可。
为了连接方便,我们可以在板子上焊一个接插件,如下图:
然后把蓝牙模块的引脚拉垂直,然后反插上去即可:
?
好了,这下硬件就连接上了。接下来就是配置软件和调试了。
这里关于串口程序编写就不多说了,网上资料很多,就直接上程序了:
建一个bluetooth.c文件:
?
#include "Bluetooth.h"
#include "common.h"
?
void send_char(unsigned char* str);
?
/*
本实验注意事项:
1. 定时器2作为波特率发生器是16位自动重装,而定时器1作为波特率发生器是8位自动重装,
定时器2使用RCAP2H去重装TH2,用RCAP2L去重装TL2;定时器1是使用TH2去重装TL2。
2. 定时器2作为波特率发生器,工作在模式1和模式3,
波特率=振荡期频率/[32×(0xFFFF-<RCAP2H,RCAP2H>)],
<RCAP2H,RCAP2H>指RCAP2H作为高8位、RCAP2L作为低8位构成的16位无符号整数。
*/
?
uchar flag;
void InitBluetooth()
{
TMOD |= 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
//IE = 0x0; // 禁止任何中断
?
IE |= 0x90 ; //Enable Serial Interrupt
?
print("Wait command!");
?
while(1)
{
;
}
}
?
char buf[20];
unsigned char index;
?
//串口接收中断函数
void serial () interrupt 4 //using 3
{
unsigned char* rec;
if (RI) //RI==开始接收
{
unsigned char ch;
ch=SBUF;
?
if (ch==‘!‘ || index>19) //ch==‘\r‘ ||
{
buf[index] =‘\0‘;
index=0;
rec= ReceiveCommand(buf) ;
send_char(rec);
}
else
{
buf[index]= ch;
index++;
}
RI = 0 ; //软件RI=0
}
}
?
void send_char(unsigned char * str)
{
unsigned char i;
i=0;
while(*str != ‘\0‘) //‘\0‘是数组结束标志
{
SBUF=*str;
str++;
while(!TI); // 等特数据传送
TI=0; //软件请发送中断
}
}
?
这个程序对外有两个个接口
InitBluetooth()初使化工作
ReceiveCommand() 这个函数需要在外定义,然后蓝牙处理程序中会自动在收到命令后调用,并把这个函数的返回字符串,再回发回去。同时接收字符串,以\0结束。
OK,这里我们需要在main.c文件中定义一下该函数,并写入测试程序:
void main()
{
InitBluetooth();
while(1)
{
;
}
}
?
unsigned char * ReceiveCommand(unsigned char * cmd)
{
print(cmd);
return "OK";
}
?
这个测试程序比较容易,就是将收到的命令,显示在小车的LCD屏上,然后返回OK字符串。
?
好了,如何测试呢,那当然是先用电脑咯,
首先,现在小车是一个蓝牙设备了,所以在电脑上添加该蓝牙设备,并输入默认密码
然后在电脑的设备管理中,就可以看到这个蓝牙设备了,并作为串口使用着,记下这个COM口号。
打开串口调试器:
选择对应的COM口,在发送里输入Hello Car 然后点手动发送,在小车LCD屏上就看到字符了,同时在串口调试器上面的接收输入框中,看到OK。说明程序就通了。
如果没看到,就要查查了,多数原因是,蓝牙的接收输入与单片机的接反了。
如果没有反,也可以将输入输出短路,然后再测,应该是收到内容与发送内容一样。
?
好了,在调通通讯后,就要写一下控制程序了,即把ReceiveCommand函数中的内容换掉即可。
这里为了方便,我们采用这样的格式:CAR:L+100R-020! 这一句中就可以直接控制小车的两个轮子了,速度、方向。
程序改造如下:
unsigned char * ReceiveCommand(unsigned char * cmd)
{
char tmp[10];
int left,right;
print(cmd);
?
if (strcmp(cmd,"GO")==0)
CarGo(100,100);
left =0;
?
if (cmd[0]==‘C‘ && cmd[1] ==‘A‘ && cmd[2] ==‘R‘)
{//车子指令 CAR:L+100R-020!
left = 100 *(cmd[6]-‘0‘) ;
left += 10*(cmd[7]-‘0‘);
left+=cmd[8]-‘0‘;
if (cmd[5]==‘-‘)
left = -left;
right = 100 *(cmd[11]-‘0‘);
right+= 10 *(cmd[12]-‘0‘);
right +=cmd[13]-‘0‘;
if (cmd[10]==‘-‘)
right = -right;
?
num2char(right, tmp);
print(tmp);
?
CarGo(left,right);
return "OK";
}
return cmd;
}
?
好了,这段程序烧写进去后,就说明小车上的程序以及硬件都完工了,就差个手机端控制了。
同时,为测试这些,同样可以用串口调试器来向其发送这些命令。
?