基于单片机的蓝牙遥控小车Word格式文档下载.docx
《基于单片机的蓝牙遥控小车Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的蓝牙遥控小车Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
4.1.2遥控任务分配11
4.2.3蓝牙遥控操作流程12
第五章软硬件调试14
5.1硬件调试14
5.2软件调试14
第一章绪论
1.1研究背景和意义
智能化无处不在。
各种智能化设备在不同的领域中发挥着自己的特长,而在家用方面的智能有着相当重要的意义。
本次所设计的智能小车系统包含着对周围环境的检测、舵机控制以及短距离无线遥控等的功能,它需要实现微控制器、多传感器技术、蓝牙遥控、机械结构原理、数字逻辑、自动控制等各学科技术内容的渗透融合。
智能小车通过其上部搭载的89C52芯片作为核心控制器,通过多种传感器来获取周围环境信息并将采集到的信息输送给CPU然后由CPU来给各个部分下达相对应的指令。
智能小车不仅价格低廉,而且甚至能够担任人类难以从事的任务,它在工业、农业以及社会生产生活等许多领域都起到了重要作用。
本次课题设计中所采用到的短距离无线遥控、单片机控制原理、多传感器技术、自动避障技术等等。
现在在工业制造、农业生产、国家安全、军事武器,医疗保健、太空探测等许多领域都日益发挥着其作用,在军事侦察、反恐、防暴、防核化等高危任务方面、环境污染检测方面和在恶劣环境中均有着非常好的发展前景,从这些方面可知本课题研究意义非凡。
第二章系统框架及软硬件结构设计
2.1系统要求
在综合考量了单片机的使用性能、成本和时间等问题,本次课题主要旨在实现以下性能指标:
1)根据力学结构完成小车整体框架的搭建,稳固其整体重心;
2)完成底层运动系统的搭建,保证小车能够正常行进;
3)完成小车自主避障功能,能够在简单地形避开障碍物;
4)完成小车的简单路径规划;
5)完成手机遥控功能,通过手机控制底层小车的工作方式。
整体小车车身采用深圳欧鹏公司设计生产的金属框架,通过自己的设计和搭建,完成底层硬件系
统的搭载,再通过上层安卓手机APP遥控,通过无线蓝牙通信协议,实现小车能够遵从指令实
现在室内的自主避障的巡航功能与手机遥控功能,整体电路图如图所示
系统整体电路设计图2-1
2.2系统整体算法流程所示。
2-1整个系统的算法结构具体流程如图
2-2系统整体算法流程图图2.3总体任务设计所示。
小车总体任务分配如下图2-2
按键3按键4按键5按键621按键按键按键7按键8
停止第三档前进后退左转右转第一档第二档蓝牙遥控按键任务选择
STC89C52
小车任务分配2-3图
2.4整体硬件结构设计
智能小车系统整体硬件结构以89C51单片机为中心主要分为以下几个部分:
1)运动结构,即舵机模块是整个系统的基础,通过对舵机性能参数的测定对舵机进行标定、控速;
2)供电结构,采用分压式供电。
由于各,模块对电压的要求不同,所以需要通过分压以适应不
同模块对电压的需求。
其中舵机需要8v电压的供应,而单片机、传感器、蓝牙等模块则需要较
低一点的电压5v供电;
3)无线通信结构,通过对蓝牙模块与单片机通信电路的设计与单片机串口功能的调试,做到小车与手机的无线通信。
小车实物图如下图2-3所示。
小车实物图图2-4
整体软件结构设计2.5
当启动电源系统初始化完成后,小车进入等待的任务模式,等待上层安卓终端手机的小车接收到
上层手机发送的小车行进方向的指令后相对应的前进APP客户端发送任务指令。
等。
(stop)、停
止(right)、右转(left)、左转(backward)、后退(forward).
第三章模块的详细设计
3.1L293D电机驱动模块
3.1.1模块介绍
L293D采用16引脚DIP封装,其内部集成了双极型H-桥电路,所有的开量都做成n型。
这种双极型脉冲调宽方式具有很多优点,如电流连续;
电机可四角限运
行;
电机停止时有微振电流,起到“动力润滑”作用,消除正反向时的静摩擦死区:
低速平稳性好等。
L293D通过内部逻辑生成使能信号。
H-桥电路的输入量可以用来设置马达转动方向,使能信号可以用于脉宽调整(PWM)。
另外,L293D将2个H-桥电路集成到1片芯片上,这就意味着用1片芯片可以同时控制2个电机。
每1个电机需要3个控制信号EN12、IN1、IN2,其中EN12是使能信号,IN1、IN2为电机转动方向控制信号,IN1、IN2分别为1,0时,电机正转,反之,电机反转。
选用一路PWM连接EN12引脚,通过调整PWM的占空比可以调整电机的转速。
选择一路I/O口,经反向器74HC14分别接IN1和IN2引脚,控制电机的正反转。
实物图如下图3-1所示。
模块实物图3-1图
3.1.2PWM脉冲控制原理
所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。
脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。
反之脉冲宽度越小,则占空比越越小。
提供给电机的平均电压越小,电机转速就低。
PWM不管是高电平还是低电平时电机都是转动的,电机的转速取决于平均电压。
3.1.3脉冲控制代码
voidT0_time()interrupt1//定时器1中断程序
{
PWMCnt1++;
PWMCnt2++;
if(PWMCnt1>
=200)
PWMCnt1=1;
}
//230if(PWMCnt1<
=cntPWM1)
PWM1=1;
else
PWM1=0;
if(PWMCnt2>
PWMCnt2=1;
if(PWMCnt1<
=cntPWM2)〃230
PWM2=1;
PWM2=0;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
3.2HC05蓝牙模块
3.2.1模块简介
HC-05蓝牙无线通信模块有两种工作方式,一个是命令响应工作模式,另一个是
自动连接工作模式。
在命令响应工作模式下,使用者通过向模块发送AT工作指
令来对模块的控制参数进行设定和下达控制指令。
而在自动连接工作模式下,模块又有三种工作模式,分别为主机(Master)、从机(Slave)和回环(Loopback)三种工作模式,选定工作模式后,模块就自动按照提前设定好的方式进行数据传输。
通过调节模块外部引脚的输入电平来动态转换模块的工作状态。
模块实物图
所示。
3-5如图
实物图图3-2HC05蓝牙串口程序说明3.2.2串口中断程序voidusart_receive(void)interrupt4//{
if(RI==1)//收到字符
软件清零RI=0;
//
读取数据bluetoothdata=SBUF;
//}
if(TI==1)//发送数据
清零TI=0;
}}
模块引脚说明3.2.3
3-7、3-6模块引脚说明及电路原理图如下图
模块引脚说明图3-3.
3-4HC05原理图图TTL3.3USB转模块本次课题需要通过使用串口调试软件使得上位
机与底层小车进行通信达到调试小车的所以需要使但是目前笔记本电脑因为空间的限制和其他方面考虑的原因都没有串口,目的,转串口模块。
USB用到这一个
3-8所示相连接。
模块与单片机需要按下图
单HC05
3-5USB图转TTL
片蓝牙机模块
模块与单片机的连接示意图
转图3-6USBTTL串口模块实物图。
.
第四章系统功能设计与实现
4.1安卓手机蓝牙遥控的设计与实现
4.1.1设计基本思路
遥控功能的实现基于蓝牙通信协议的建立,需要从依次实现以下几个步骤:
1)检测HC05蓝牙模块是否能够正常工作,将蓝牙模块按要求接上5v或3.3v电压,等待一段时间后,使用安卓终端搜索,查看蓝牙模块是否能够被搜索并与其相连接;
2)单片机串口能否正常通信,编写好串口通信程序并将其烧录字单片机中,将单片机通过开发板与电脑串口连接,打开电脑端串口调试工具查看是否能够正常通信;
3)查看蓝牙模块是否能够正常发送和接收数据,将蓝牙模块通过USB转TTL模块与电脑USB口
相连,打开电脑串口调试助手。
安装好手机APP,与蓝牙模块连接好后,使用手机端APP查看是
否能够正常发送和接收数据;
4)将蓝牙模块的串口与智能小车上的单片机串口相连,并编写好遥控选择功能代码,使用手机
发送数据,查看智能小车能否执行相应的的指令。
下图为电脑端的串口调试助手。
串口调试工具图4-1
4.1.2遥控任务分配上层安卓终端主要可以实现以下小车的行进方向,通过无线蓝牙通信的实现,进入的工作模式等,具体功能如下表所示。
•
表4-2蓝牙遥控按键及选择功能表
3
功能前进
按键第一档第二档后退停止左转第三档右转
4.2.3蓝牙遥控操作流程
蓝牙遥控操作流程示意图如下。
图4-3蓝牙遥控流程图
首先将智能小车正常上电工作,待小车初始化完成后,打开安卓终端的APP进行连接,连接成功后即可选择功能。
可按avoid键进入自主避障模式,如需进键返回上一层。
back入遥控模式则仅需按..
蓝牙模块连接示意图图4-4
界面APP安卓终端4-5图
第五章软硬件调试
5.1硬件调试硬件调试采用从整体到部分的考量方法。
1)智能小车整体框架的搭建,确保各模块能够搭载在其上面而相互没有影响;
2)完成整体电源电路、工作电路的设计,保证各模块之间供电正常使用和与单片机之间的合理连接;
3)烧录测试程序,保证单片机能够正常进行烧录和擦除程序,同时还需要测试其串口功能,实现单片机与手机之间的正常通信;
4)小车底层运动系统的完成,测试舵机的基本性能,保证其能正常工作;
5)对HC05蓝牙模块进行基本性能测试,保证其在正常工作电压下能够正常工作。
再通过上位机的测试,确保其能够正常的收发数据。
5.2软件调试
1)通过编写代码实现对底层小车的驱动,包括舵机参数的测定,电机的标定,对电机进行速度调控,实现小车的方向控制;
2)避障算法的设计,通过考量3个传感器将出现的8种情况(000、001、010、011、100、101、110、111),考虑每一种情况出现时的应对方式,设计出较为合理的避障算法,并将传感器采集的数据与舵机控制结合起来,实现智能小车的避障功能;
3)蓝牙模块与单片机、上位机、上层安卓终端的正常通信。
先使用上位机端的串口调试工具测试蓝牙模块是否能够正常与上位机之间进行正常通信,然后编写串口调试代码烧录至单片机,使用手机发送数据确保单片机能够接收指令并命令小车作出相应反应;
4)选择功能算法设计,设计出简洁合理的算法,使得小车在初始化完成后操作者使用APP能够
选择相应功能,进入自主避障模式或者是手机的蓝牙遥控模式;
5)将舵机驱动代码、小车避障算法和选择功能算法有机结合起来,使得小车的功能完善,各个模块能够独立工作完成各自任务,并且有效率的执行小车的工作。
.
代码
#include<
reg52.h>
sbitPWM1=P2A0;
//PWM波产生的端口
sbitPWM2=P2A1;
sbitmotor_control_1=P2A7;
//左轮控制
sbitmotor_control_2=P2A6;
sbitmotor_control_3=P2A5;
sbitmotor_control_4=P2A4;
unsignedintPWMCnt1=0;
unsignedintcntPWM1=60;
unsignedintPWMCnt2=0;
unsignedintcntPWM2=60;
unsignedcharbluetoothdata;
voidinitial_myself();
voidinitial_interrupt();
voidusart_service(void);
voiddelay_long(unsignedinttime);
voidgo_forward(void);
voidstop();
voidturn_right();
voidturn_left();
voidback();
voidmain()
initial_myself();
delay_long(100);
initial_interrupt();
stop();
while
(1)
usart_service();
voidusart_service()
switch(bluetoothdata)
case'
f'
:
go_forward();
delay_long(100);
SBUF='
;
//返回数据到手机bluetoothdata='
a'
break;
s'
stop();
bluetoothdata='
break;
r'
turn_right();
l'
turn_left();
b'
back();
1'
cntPWM1=60;
cntPWM2=60;
2'
cntPWM1=100;
cntPWM2=100;
3'
cntPWM1=140;
cntPWM2=140;
voidusart_receive(void)interrupt4//串口中断程序{
if(RI==1)//收到字符
RI=0;
//软件清零bluetoothdata=SBUF;
//读取数据
if(TI==1)//发送数据
TI=0;
//清零
中断程序1定时器voidT0_time()interrupt1//
PWMCnt1++;
PWMCnt2++;
if(PWMCnt1>
PWMCnt1=1;
//230if(PWMCnt1<
=cntPWM1)
if(PWMCnt2>
PWMCnt2=1;
=cntPWM2)
}else
TL0=(65536-50)%256;
voidinitial_myself()
TMOD=0x01;
50定时TH0=(65536-50)/256;
//微秒TL0=(65536-50)%256;
SCON=0x50;
TMOD=0x21;
TH1=TL1=0xfd;
//设置波特率9600
IP=0x10;
//设置串口中断为高优先级}
voidinitial_interrupt()
EA=1;
//开总中断
ES=1;
//开串口中断
ET0=1;
//开定时器0中断?
TR0=1;
//开定时器0
TR1=1;
//开定时器1
voiddelay_long(unsignedinttime){
unsignedinti;
unsignedintj;
for(i=0;
i<
time;
i++)
for(j=0;
j<
500;
j++);
voidgo_forward()
motor_control_1=0;
motor_control_2=1;
motor_control_3=0;
motor_control_4=1;
voidstop()
motor_control_2=0;
motor_control_3=0;
motor_control_4=0;
voidturn_left()
inti=5000;
for(;
i>
=0;
i--){if(i){
}else
motor_control_4=0;
voidturn_right()
{inti=5000;
i--){if(i)
motor_control_2=1;
motor_control_2=0;
voidback()
motor_control_1=1;
motor_control_3=1;