首页 > 代码库 > 自己动手做个智能小车(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;

}

?

好了,这段程序烧写进去后,就说明小车上的程序以及硬件都完工了,就差个手机端控制了。

同时,为测试这些,同样可以用串口调试器来向其发送这些命令。

?