蓝牙小车作品展示.docx
《蓝牙小车作品展示.docx》由会员分享,可在线阅读,更多相关《蓝牙小车作品展示.docx(19页珍藏版)》请在冰豆网上搜索。
![蓝牙小车作品展示.docx](https://file1.bdocx.com/fileroot1/2022-11/27/6a6310cd-377b-4c54-8a40-f550fc0e88e4/6a6310cd-377b-4c54-8a40-f550fc0e88e41.gif)
蓝牙小车作品展示
河南理工大学
电器开发部电子作品设计报告
题目:
手机控制的蓝牙小车
姓名:
学号:
专业班级:
指导人员:
所在学院:
电气学院
2015年4月24日
摘要
本设计是做成这样的一款蓝牙小车,灵感来自于《无线电》--一本偶然碰到的书,书中对车的制作勾起了我对童年的回忆。
我曾经玩过四驱赛车,也玩过遥控车,但还没有玩过通过手机便可控制的蓝牙小车,所以头脑发热从京东上买了一辆小遥控车决定自己改装一下。
当各种模块都做好之后,我先仔细研究了几天L298N电路原理,然后我下载了好几种手机蓝牙软件通过比较确定了一款好用的。
然后我对51单片机最小系统进行了简化,只留下了晶振电路,这样不仅不影响整体功能的实现,也减少了投入成本和工作量。
通过改装买来的遥控小车,将其遥控设备用手机蓝牙代替,将从360助手上下载的蓝牙小车软件作为上位机,将拥有hc06蓝牙模块的蓝牙小车作为下位机,将L298作为小车的电机驱动。
可以实现小车的前进、后退、左拐、右拐、刹车、重力感应、加速、减速等功能。
做完这件作品我的收获有很多,对单片机的一些知识有了更深一步的理解。
同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。
这也是我的梦想,用科技改变生活。
1概述..........................................................4
2系统总体方案及硬件设计........................................5
2.1L298N电机驱动模块........................................5
2.2HC06蓝牙模块说明.........................................5
2.3最小系统板说明............................................5
3课程设计体会...................................................6
附1:
源程序代码................................................7
附2:
系统原理图...............................................23
1概述
通过改装买来的遥控小车,将其遥控设备用手机蓝牙代替,将从360助手上下载的蓝牙小车软件作为上位机,将拥有hc06蓝牙模块的蓝牙小车作为下位机,将L298作为小车的电机驱动。
可以实现小车的前进、后退、左拐、右拐、刹车、重力感应、加速、减速等功能。
在我眼里没有完美的东西,只有更完美的东西,而快乐就在追求完美的路上。
小车能动后我发现从网上下载的程序有错误,导致小车的左拐右拐相反,并且前进后退都会拐弯,没有加速减速。
这样的作品我怎么能拿的出手?
刚好那时电开给我们培训中断,定时器等内容,再加上寒假我学了点C语言,便对程序进行了大刀阔斧的改革。
终于前进后退左拐右拐正常了,可加减速怎么办呢?
之前通过学长我稍微了解了pwm,随后我对pwm的原理深入了解了一下,我先通过借用延时函数模拟pwm让led灯渐亮渐灭随后我应用到直流电机上,结果,成功了!
当然对于目前的作品,我还是觉得不太完美,我准备再给他加上转向灯、喇叭甚至更多功能。
做完这件作品我的收获有很多,对单片机的一些知识有了更深一步的理解。
同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。
这也是我的梦想,用科技改变生活。
2系统总体方案及硬件设计
2.1L298N电机驱动模块
298n是直流电机驱动集成电路,内部包含4通道逻辑驱动电路,可以方便地驱动两个直流电机,或一个两相步进电机。
l298n可接受标准ttl逻辑电平信号vss,9脚vss可接4.5~7v的电压。
4脚vs接电源电压,vs电压范围vih为+2.5~46v[2]。
1脚和15管脚下的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。
l298可驱动2个电动机,此时out1,out2和out3,out4之间可分别接电动机。
5、7、10、12脚接输入控制电平,控制电机正反转;ena,enb脚接控制使能端,控制电机的停转[3]。
l298n采取输入输出并联的连接方式,即in1与in4(5脚和12脚)、in2与in3(7脚和10脚)、out1与out4(2脚和14脚)、out2与out3(3脚和13脚)分别连接在一起。
(电路图见附录2)
2.2HC06蓝牙模块说明
本作品使用的是hc06从机,设置其波特率为9600
2.3最小系统板说明
经过多次修改简化本作品只使用了晶振电路,这样不仅对作品的功能没有影响而且减少了成本与工作量。
(电路图见附录2)
3课程设计及体会
做成这样的一款蓝牙小车,灵感来自于《无线电》--一本偶然碰到的书,书中对车的制作勾起了我对童年的回忆。
我曾经玩过四驱赛车,也玩过遥控车,但还没有玩过通过手机便可控制的蓝牙小车,所以头脑发热从京东上买了一辆小遥控车决定自己改装一下。
买回来的当天我就把它拆了(一副很败家的样子)。
当时我对单片机知识还是零基础,对于串口、中断、定时器什么的都不懂,于是我就去问负责我的学长,我说:
“我要做这么个车,但我对单片机还什么都不懂,你说我可以吗?
”他说:
“赶紧做吧,做好的话就可以进实验室了。
”激情再一次被点燃,本来只想自己做个玩的,没想到做好还能进实验室,下定决心getit!
从图书馆借了基本单片机入门的书,便疯狂的搞起。
做完这件作品之后我的收获有很多,首先我对单片机的一些知识有了更深一步的理解。
同时给了我一种畅想,我畅想着未来我们将会用手机控制我们所有的家用电器,不再需要那么多的遥控器了,我们的生活将会更便捷。
这也是我的梦想,用科技改变生活。
成功的道路是被无数的失败铺就的。
当各种模块都做好之后,我迫不及待的将它们连接起来,连接蓝牙之后却发现小车没像预想的那样动起来。
我XX了蓝牙模块的连接方式后发现RXD与TXD应交叉连接,交换之后,还是不能动。
我又仔细研究了几天L298N电路原理,发现原来自己的电路驱动连接有错误,改过之后小车还是没反应,再次陷入绝望。
我又怀疑是不是手机软件的是我又换了好几个软件,都不行。
持续一个星期没有任何进展。
有一天我在单片机上的txd上加了一个上拉电阻,小车奇迹般的动了,我简直欣喜若狂,赶紧跑到实验室告诉丁柯学长,可到实验室怎么连蓝牙也连不上。
沮丧地又回到宿舍研究了一下午用万用表测量到底哪的问题,可什么也没发现。
我又一次绝望。
躺在床上想既然能动一次就一定能再动一次。
我要从头再来!
我把原来的最小系统板扔掉,重新再焊一个,这次我把复位电路甩掉,只留下晶振电路,重新连接,这一次没再让我失望蓝牙连接非常顺利。
在我眼里没有完美的东西,只有更完美的东西,而快乐就在追求完美的路上。
小车能动后我发现从网上下载的程序有错误,导致小车的左拐右拐相反,并且前进后退都会拐弯,没有加速减速。
这样的作品我怎么能拿的出手?
刚好那时电开给我们培训中断,定时器等内容,再加上寒假我学了点C语言,便对程序进行了大刀阔斧的改革。
终于前进后退左拐右拐正常了,可加减速怎么办呢?
之前通过学长我稍微了解了pwm,随后我对pwm的原理深入了解了一下,我先通过借用延时函数模拟pwm让led灯渐亮渐灭随后我应用到直流电机上,结果,成功了!
当然对于目前的作品,我还是觉得不太完美,我准备再给他加上转向灯、喇叭甚至更多功能。
附1源程序代码
/***************************************************************************
******作品名称:
蓝牙小车****************************************************
*******作者:
*****************************************
*******功能:
实现通过手机蓝牙控制小车***************************************
****************************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharBuffer[10]={1};//从串口接收的数据
uinti,j;
sbiten1=P2^4;/*L298的EnableA*/
sbiten2=P2^5;/*L298的EnableB*/
sbits1=P2^0;/*L298的Input1*/
sbits2=P2^1;/*L298的Input2*/
sbits3=P2^2;/*L298的Input3*/
sbits4=P2^3;/*L298的Input4*/
uchart=0;/*中断计数器*/
ucharm1=0;/*电机1速度值*/
ucharm2=0;/*电机2速度值*/
uchartmp1,tmp2;/*电机当前速度值*/
/***********************************************函数功能:
微秒级精确延时
*参数范围:
1us~65535us(0.001ms~65.535ms)
*运行环境:
STC12@32.000MHz
*最大误差:
0.00%
*作者日期:
电器开发部-(2015-2-23)
**********************************************/
#pragmaoptimize(4,SPEED)
voiddelay_us(unsignedintn)
{
externvoid_nop_(void);
registerunsignedchari=n,j=(n>>8);
_nop_();_nop_();_nop_();
if((--i)|j)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
if(0xFF==(i--))j--;else{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
}while(i|j);
}
}
/*毫秒延时函数*/
voiddelay_ms(unsignedintn){while(n--)delay_us(1000);}
/********************************************************************
*名称:
Init()//系统初始化
*功能:
初始化,晶振11.0592,波特率9600,使串口中断,同时定时器0控制PWM?
*输入:
无
*输出:
无
***********************************************************************/
voidInit()
{
TMOD=0x22;//T/c方式寄存器
PCON=0x00;//电源控制寄存器
SCON=0x50;//UART串口控制寄存器,此处为10位异步收发
TH0=0x9b;//高八位
TL0=0x9b;//低八位
TH1=0xFd;//设置波特率9600
TL1=0xFd;//T/c1计数寄存器低八位
TR1=1;/*启动定时器1
ET0=1;/*ET0时定时计数器0溢出中断允许控制位
ET1时定时计数器1溢出中断允许控制位*/
TR0=1;
ES=1;//开串口中断
EA=1;//开总中断
}
voidmotorL(charspeed)
{
m1=abs(speed);//取速度的绝对值(返回数字的绝对值)
if(speed>0)
{
s1=0;
s2=1;
}
elseif(speed==0)
{
s1=1;
s2=1;
}
else
{
s1=1;
s2=0;
}
}
voidmotorR(charspeed)
{
m2=abs(speed);/*电机2的速度控制*/
if(speed>0)
{
s3=0;
s4=1;
}
elseif(speed==0)
{
s3=1;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
voidGO(void)
{
motorL(50);
motorR(0);
}
voidBACK()
{
motorL(-20);
motorR(0);
}
voidTR(void)
{
motorL(20);
motorR(-20);
}
voidTL(void)
{
motorL(-20);
motorR(20);
}
voidSTOP(void)
{
s1=1;
s2=1;
s3=1;
s4=1;
}
voidSPEED1(void)//通过不同的速度,实现加减速
{
s2=1;s3=1;s4=1;
s1=0;delay_us
(1);
s1=1;delay_us(10000);
}
voidSPEED2(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(100);
s1=1;delay_us(1000);
}
voidSPEED3(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(200);
s1=1;delay_us(1000);
}
voidSPEED4(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(300);
s1=1;delay_us(100);
}
voidSPEED5(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(400);
s1=1;delay_us(100);
}
voidSPEED6(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(500);
s1=1;delay_us(100);
}
voidSPEED7(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(600);
s1=1;delay_us(100);
}
voidSPEED8(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(700);
s1=1;delay_us(100);
}
voidSPEED9(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(800);
s1=1;delay_us(100);
}
voidSPEED10(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(900);
s1=1;delay_us(100);
}
voidSPEED11(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1000);
s1=1;delay_us(100);
}
voidSPEED12(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1100);
s1=1;delay_us(100);
}
voidSPEED13(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1200);
s1=1;delay_us(100);
}
voidSPEED14(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1300);
s1=1;delay_us(100);
}
voidSPEED15(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1400);
s1=1;delay_us(100);
}
voidSPEED16(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1500);
s1=1;delay_us(100);
}
voidSPEED17(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1600);
s1=1;delay_us(100);
}
voidSPEED18(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1700);
s1=1;delay_us(100);
}
voidSPEED19(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(1900);
s1=1;delay_us(100);
}
voidSPEED20(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2000);
s1=1;delay_us(100);
}
voidSPEED21(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2100);
s1=1;delay_us(100);
}
voidSPEED22(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2200);
s1=1;delay_us(100);
}
voidSPEED23(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2300);
s1=1;delay_us(100);
}
voidSPEED24(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2400);
s1=1;delay_us(100);
}
voidSPEED25(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2500);
s1=1;delay_us(100);
}
voidSPEED26(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2600);
s1=1;delay_us(100);
}
voidSPEED27(void)
{
s2=1;s3=1;s4=1;
s1=0;delay_us(2700);
s1=1;delay_us(100);
}
voidmain(void)
{
delay_ms(100);
Init();//初始化
while
(1)
{
switch(Buffer[0])
{
case1:
STOP();break;
case4:
GO();break;
case5:
TL();break;
case7:
BACK();break;
case6:
TR();break;
case0x7D:
SPEED1();break;
case0x82:
SPEED2();break;
case0x87:
SPEED3();break;
case0x8C:
SPEED4();break;
case0x91:
SPEED5();break;
case0x96:
SPEED6();break;
case0x9B:
SPEED7();break;
case0xA0:
SPEED8();break;
case0xA5:
SPEED9();break;
case0xAA:
SPEED10();break;
case0xAF:
SPEED11();break;
case0xB4:
SPEED12();break;
case0xB9:
SPEED13();break;
case0xBE:
SPEED14();break;
case0xC3:
SPEED15();break;
case0xC8:
SPEED16();break;
case0xCD:
SPEED17();break;
case0xD2:
SPEED18();break;
case0xD7:
SPEED19();break;
case0xDC:
SPEED20();break;
case0xE1:
SPEED21();break;
case0xE6:
SPEED22();break;
case0xEB:
SPEED23();break;