基于51单片机的自动避障感光小车

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
1 引言 (1)
2 方案设计与论证 (1)
2.1 主控系统 (1)
2.2 电机驱动模块 (2)
2.3 电源模块 (3)
2.4 避障模块 (3)
2.5 感光模块 (3)
2.6 自动停车模块 (4)
3 硬件设计 (4)
3.1 总体设计 (4)
3.2 驱动电路 (5)
3.3 超声波避障模块 (5)
3.4 光敏电阻感光模块 (5)
3.5 停车模块 (6)
4 软件设计 (6)
4.1主程序流程图 (6)
4.2 避障功能设计 (7)
4.3感光功能设计 (11)
5 系统的仿真与调试 (14)
5.1概述 (14)
5.2避障功能的仿真 (16)
5.3感光模块的仿真 (17)
6 总结 (19)
参考文献 (20)
致谢 (22)
附录A 源程序清单 (23)
附录B 电路硬件仿真图 (27)
1 引言
在科学探险和现实救助中经常会遇到一些人类无法到达的危险地域的探测,这时就需要机器人为我们获取一些数据及情报。

这就需要机器人可以自动定位探测目标向探测目标自动行进并能通过传感器了解周围环境以及自身状态。

在复杂的地形中,机器人的自动避障与自动导航是必须要求的,所以自动避障技术以及自动导航就由此发展起来了。

我的智能小车就是基于这一技术设计出来的。

智能小车是一个集环境感知、规划决策、自动行驶等功能于一体的综合系统, 它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体[1]。

智能小车算是简单的机器人,它们经常被用在那些人类无法适应的工作环境中,因此它们在人类生活中得到了广泛的应用。

在很多工作领域中它们可以超越人类工作的质量与效率。

生活中有很多这样的例子如焊接、医疗、喷漆、探测等。

在相对恶劣的工作环境中,机器人不会受到任何影响,并能继续保持良好的工作效率,而人类则不行,时间久了不但会疲惫而且对身体有害。

我此次的设计主要实现自动避障及自动导航功能。

此次设计对于未来智能系统、自动化等方面的发展都有非常重要的作用,所以本设计与实际具有紧密联系,具有重要的现实意义。

2方案设计与论证
根据要求,确定如下方案:把买来的玩具电动车进行改装,在车上安装一个单片机最小系统,车体上安装一个避障系统和一个感光系统,通过感光系统来大致确定光源的方向,使小车自动向目标光源行进。

避障系统用来检测障碍物与小车的距离,当避障系统检测到障碍物时会向单片机发送信号,单片机控制小车执行动作,进而避开障碍物。

然后小车再次调用感光系统,如此循环直到小车到达光源前停车。

2.1 主控系统
根据设计要求,此设计属于多输入量的复杂程序控制问题。

因此,拟定了以下两种方案并进行了综合的比较论证,具体如下:
方案一:
采用CPLD作为处理器。

CPLD[2]可以实现各种复杂的逻辑功能、规模大、密度高、
体积小、稳定性高、IO资源丰富、易于进行功能扩展。

该芯片处理速度快,但本设计不需要复杂的逻辑功能,对数据的处理速度的要求也不是很高,且从使用及经济的角度考虑放弃了此方案。

方案二:
采用51单片机作为整个系统的核心,80C51 单片机共包括以下几个部分[3]微处理器、程序存储器、数据存储器、定时器与计数器、串行口中、并行I/O 口以及中断系统和特殊功能寄存器等,它采用特殊功能寄存器对各功能部件进行集中控制;此外,其所构成的最小系统结构简单,且可靠性高。

用其控制行进中的小车,可实现各项要求。

所以我选定了80C51单片机作为本设计的主控核心。

51单片机[4]具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计已经足够了,综合考虑各方面,选择80C51作为主控芯片。

2.2 电机驱动模块
方案一:
采用电阻网络调节电动机的分压,来实现对电机的控制。

但电阻网络只能实现有级调速,并且数字电阻器件价格都相对来说比较高。

而一般的电动机电阻分压会降低效率并且实现起来也是非常困难的。

方案二:
采用PWM调速技术。

通过单片机控制调节占空比可实现电动机的精确调速,这种电路由于工作在晶体管的饱和和截止状态下,效率非常高,H型桥式电路[5]可实现对两电机的分别调速进而可实现小车的转弯。

它的工作效率高并且稳定性好。

现市面上有很多这类芯片,我选择L298N。

L298N[6]内部包含4通道逻辑驱动电路,是一种二相和四相电机的专用驱动器,可驱动46V、2A以下的电机。

图1为L298N的引脚图。

图1 L298N的引脚
PWM调速技术调整连续、调速域比较大并且可以频繁的进行动作变化。

所以我们采用方案二作为电机驱动模块。

2.3 电源模块
方案一:
采用实验室的电源通过稳压器供电,其优点是可稳定的提供5V电压,但占用资源相对较大,并且不能在户外使用。

方案二:
采用4支1.5V电池单电源供电,但6V的电压太小不能同时给单片机与两电机供电。

方案三:
采用8支1.5V电池分别给单片机与电动机各提供6V电压,此时方案二的问题就解决了,所以方案三最合适。

2.4 避障模块
方案一:
采用红外传感器,目前主要采用红外反射式传感器。

红外反射式传感器[7]通过红外线的发射与接收引起电流的变化进而影响电压然后向主控系统发送信号,其优点主要是反应速度快并且电路简单,但它也具有非常严重的缺点,它受光线灰尘的影响大。

在本设计中若采用此方案则需要对障碍物做一定的规范,因此我们提出了方案二。

方案二:
采用超声波传感器,由于超声波指向性强,在介质中传播距离远,能量消耗慢并且具有频率高、波长短、绕射现象小等诸多优点故而超声波已经广泛应用于社会各个行业中。

超声波传感器[7]前面的障碍物通过将超声波传感器发射端发射的超声波反射到超声波传感器的接收端,进而检测到障碍物。

由于超声波传感器对外界环境有很强的适应能力,对被测物可以精确定位并且对障碍物没有特殊要求,所以我选择方案二。

2.5 感光模块
方案一:
采用光敏二极管和A/D转换电路来确定目标光源的大致方向。

由于光敏二极管具
有光敏特性,所以当有光照时,形成光电流,它会随光的强度的增大而增大。

它的输出是电压变化量,通过与单片机的连接,进而控制小车,确定光源的大致方向。

但是它也有严重的缺点,当光源移动时光它的反应过于敏感,所以小车不能正确判断目标光源的方向。

所以我们提出了方案二。

方案二:
采用光敏电阻和电压比较器来确定目标光源的大致方向。

由于光敏电阻的阻值会随着光照强度的增大而减小,我们可以通过电压比较器转换的输出信号来控制单片机,进而小车可以自己对光源进行定位。

光敏电阻虽然不如光敏二极管灵敏,但其稳定性比光敏二极管要好很多并且经电压比较器输出后的数据线性良好,以满足设计要求。

所以我们采用方案二。

2.6 自动停车模块
方案一:
采用热敏电阻。

本设计采用的光源是白炽灯。

它在工作时能够产生大量的热,热敏电阻的阻值会随着离光源距离的变化而变化,当小车行进到光源前一定距离时热敏电阻上的电压会达到某个值,通过比较器控制小车靠近光源时自动停车。

但热敏电阻制作的停车模块对热不是很敏感,所以放弃此方案。

方案二:
利用光敏电阻的感光效应。

将中间光敏电阻的电压值与一固定的小电压值通过电压比较器比较。

当小车离光源越近时,光敏电阻的电压值会越来越小,直到比固定电压值还小,此时电压比较器的输出会发生变化,进而通过单片机控制小车自动停车。

3 硬件设计
3.1 总体设计
本智能小车在后边两只轮子上分别安装一个直流电机,前边按一个万向轮,它既可以起支撑作用又对小车的转弯有一定的帮助。

调节后面两电机的转速差从而达到小车转弯的目的。

将三对超声波传感器分别安装于车体前方及车体两侧,当超声波传感器没有检测到障碍物时,小车通过光敏电阻感光来确定光源的方向,然后通过单片机控制小车向光源前进。

当车体左边的超声波传感器检测到障碍物时,单片机控制右轮停止,实现左转;当车体右边的超声波传感器检测到障碍物时,单片机控制左轮停止,
实现右转;当车体前面的超声波传感器检测到障碍物时,单片机控制车右转。

3.2 驱动电路
电机驱动一般采用H桥式驱动电路[8],L298N 内部集成了H桥式驱动电路,从而可以采用L298N电路来驱动电机单片机,通过调节信号的占空比来控制两个电机的转速,驱动原理图如图2所示。

图2 L298N驱动原理图
3.3 超声波避障模块
超声波模块采用HC—SR04超声波模块[10],这个模块可四米以内的障碍物,测距精度非常也不错,非常适合小车的障碍物检测。

模块包括超声波发射器、接收器与控制电路产品应用领域:机器人避障、物体测距、液位检测、公共安防、停车场检测。

测试距离=(高电平时间*声速(340m/s))/2。

此模块非常容易操作,它通过超声波的发射与接收的时间差可计算出障碍物离小车的距离,当距离小于5cm时,此时小车进入障碍区,超声波传感器向单片机发射信号,小车执行对应动作,避开障碍物。

3.4 光敏电阻感光模块
在小车上安装自制的光敏电阻码盘[11]来接收白炽灯的光线,正中一个光敏电阻,在它两边60度角处各装一个光敏电阻,用黑纸裹住光敏电阻,以防外界光线干扰。

将三个光敏电阻的端电压分别接入电压比较器LM339的三个电压比较端[12],进而比较哪个光敏电阻的电压最小当正中光敏电阻的电压最小时,小车直行;当左边光敏电阻的电压最小时,小车左拐;当右边光敏电阻的电压最小时,小车右拐。

这样就可实
现小车的自动导航。

LM339的引脚如图3所示。

图3 LM339引脚
3.5 停车模块
将小车正中光敏电阻的端电压与一已知小电压(此电压需要实验取得)入电压比较器的电压比较端,当小车距离白炽灯一定距离时,电压比较器的输出值[13]将会出现一个由0变为1的突变,向单片机发出信号控制小车停车。

4 软件设计
4.1主程序流程图
本设计实现功能的主流程图如图4所示。

图4 主程序流程图4.2 避障功能设计
本设计在避障功能设计的流程图如图5所示。

图5 避障功能流程图
部分程序:
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit p1_0 = P1^0; // 前面超声波传感器sbit p1_1 = P1^1; // 左边超声波传感器sbit p1_2 = P1^2; // 右边超声波传感器
sbit p2_0 = P2^0; //驱动电机
sbit p2_1 = P2^1;
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit ena = P2^4;
sbit enb = P2^5;
void delay(uint count) //延时1ms { uint j;
while(count--!=0)
{
for(j=0;j<72;j++);
}
}
void ZhiXing()
{ p2_0=0;
p2_1=1;
p2_2=0;
p2_3=1;
}
void ZuoZhuan()
{ p2_0=0;
p2_1=0;
p2_2=0;
p2_3=1;
}
void YouZhuan()
{ p2_0=0;
p2_1=1;
p2_2=0;
p2_3=0;
}
void Stop()
{
p2_0=0;
p2_1=0;
p2_2=0;
p2_3=0;
}
void main()
{
int i;
ena=enb=1;
while(1)
{
if(p1_0==0 && p1_1==0 && p1_2==0 )
{
ZhiXing();
}
else if(p1_0==1 && p1_1==0 && p1_2==0 )
{
YouZhuan();
}
else if(p1_0==0 && p1_1==1 && p1_2==0 )
{
YouZhuan();
}
else if(p1_0==0 && p1_1==0 && p1_2==1 ) {
ZuoZhuan();
}
else
{
Stop();
}
}
}
4.3感光功能设计
图6 感光功能流程图
感光功能设计的流程图如图6所示。

部分程序:
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit p2_0 = P2^0; //驱动电机sbit p2_1 = P2^1;
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit ena = P2^4;
sbit enb = P2^5;
sbit p1_3 = P1^3;
sbit p1_4 = P1^4;
void delay(uint count) //延时1ms {
uint j;
while(count--!=0)
{
for(j=0;j<72;j++)
}
}
void ZhiXing()
{
p2_0=0;
p2_1=1;
p2_2=0;
p2_3=1;
}
void ZuoZhuan()
{
p2_0=0;
p2_1=0;
p2_2=0;
p2_3=1;
}
void YouZhuan()
{
p2_0=0;
p2_1=1;
p2_2=0;
p2_3=0;
}
void houtui()
{
p2_0=1;
p2_1=0;
p2_2=1;
p2_3=0;
}
void Stop()
{
p2_0=0;
p2_1=0;
p2_2=0;
p2_3=0;
}
void delay(int z) //延时1ms {
int y;
while(z--)
{
for(y=0;y<120;y++);
}
}
void ganguang(void) //感光函数{
while(1)
{
if(p1_3==1&&p1_4==0) //正中光敏电阻的电压最小,小车执行前
{
ZhiXing();
}
else if(p1_3==0&&p1_4==0) //左边光敏电阻的电压最小,小车执行左转{
ZuoZhuan( );
}
else if(p1_3==1&&p1_4==1) //右边光敏电阻的电压最小,小车执行右转
{
YouZhuan();
}
}
}
5 系统的仿真与调试
5.1概述
仿真我们使用的是protues,并通过Keil C对C程序进行汇编,将得到的hex文件注入80C51芯片中,最终实现系统各对功能的仿真,检测设计是否达到了预期效果。

Keil C操作步骤:首先建立工程,然后在所建工程下建立文件,具体操作:project-new project--file-new file,最后在新建文件中输入程序进行编译连接,查看程序是否正确,是否生成hex文件。

操作界面如图7所示。

图7 Keil C操作界面
Protues操作步骤:打开界面,在元件库中选出所需器件,根据设计原理连接器件,然后写入由KeilC 生成的hex文件,进行模拟仿真。

操作界面如图8所示
图8 protues 操作界面
5.2避障功能的仿真
由于超声波传感器模块给单片机的输入信号是数字信号,当进入障碍区输入1,反之输入0,所以在仿真中我采用开关来代替超声波传感器模块。

当开关闭合时没有检测到障碍,开关断开时小车进入障碍区。

避障模块的仿真图K1、K2、K3分别代表前方、左边、右边的超声波传感器模块。

当K1、K2、K3均闭合时,小车未遇到障碍物,两电机顺时针转动,小车前进,如图9;当K1断开时,前面的超声波传感器检测到障碍物,左电机顺时针转动右电机停止,小车右转,如图10;当K2断开时,左边的超声波传感器检测到障碍物,左电机顺时针转动右电机停止,小车右转,如图11;当K3断开时相当于右边的超声波传感器检测到障碍物,右电机顺时针转动左电机停止,小车左转,如图12。

图9 未检测到障碍物
图10 前面超声波检测到障碍物
图11 左边超声波传感器检测到障碍物
图12 右边超声波传感器检测到障碍物
此次仿真基本达到设计要求,避障功能会最终调节小车三个超声波传感器都检测不到障碍物,然后小车前进。

5.3感光模块的仿真
由于光敏电阻的阻值会随着光照强度的增大而变小,由电压比较器原理得:当光源位于不同的位置时,其输出信号会不同,进而可通过单片机控制电机的转动情况。

在仿真中,LDR1的入射光为4.0,,LDR2的入射光为2.0,LDR3的入射光为
1.0时,表示光源在小车左边,仿真结果为右轮转动,左轮停止,小车左转,如图13所示;当LDR1的入射光为1.0,,LDR2的入射光为
2.0,LDR3的入射光为4.0时,表示光源在小车右边,仿真结果为左轮转动,右轮停止,小车右转,如图14所示;LDR1的入射光为1.0,,LDR2的入射光为4.0,LDR3的入射光为1.0时,此时表示光源在小车正前方,仿真结果为两轮同时转动,小车前进,如图15所示。

图13 光源在小车左边
图14 光源在小车右边
图15 光源在小车正前方
此次仿真基本达到了预期效果,光源位于不同位置时,可实现小车的自动感光,调整车头朝着光源前进。

6 总结
本设计以80C51为控制核心,依靠超声波传感器来检测障碍物,通过光敏电阻罗盘来确定光源方向的避障寻光智能小车,该小车开始运动后,先通过感光系统调整车头基本对着光源,小车前进,然后当小车遇到障碍物时,小车可自动调节车上的三个超声波模块均检测不到障碍物,小车继续前进,感光与避障循环使用,直到小车走到光源前停车。

此次设计通过模拟仿真基本完成了设计要求。

通过此次设计使我系统的学习了单片机的基础知识,并了解了超声波传感器还学到了PWM调速技术,但本次设计还有很多不足:(1)在避障功能上,没有考虑到多个传感器同时检测到障碍物的情况;(2)在感光功能上,由于光敏电阻罗盘上只安装了三个电阻,所以无法精确定位光源的方向;(3)在驱动电路上,没有对电机的转速的改变进行控制。

我认为本设计是非常具有研究价值的,希望在以后的日子里继续努力,把小车的不足进行弥补,并努力提高系统的可靠性及稳定性。

参考文献
[1] 寸晓非. 基于16位单片机的智能小车设计[J].荆门职业技术学院学报2008,23(3).
[2] 周淑娟.基于单片机智能寻迹小车的设计方案[B].工业设计与职业教育2011,09(2).
[3] 叶伟慧.80C51单片机智能小车设计分析[A].计算机光盘软件与应用2012(7).
[4] 张俊谟.单片机中级教程-原理与应用[M].北京:北京航空航天大学出版社,2006,10.
[5] 杨丽风等.单片机原理与接口技术[M].北京:清华大学出版社,2007,2.
[6] 史洪宇.基于单片机的多功能智能小车的设计[B].仪表技术2010(12).
[7] 谭广通.基于超声波的移动测距洗系统的设计[A].电子世界2012(12).
[8] 王晓明.电动机的单片机控制[J].学术期刊2012,13(15).
[9] 王文华.基于80C51的智能小车设计[A].山西电子技术2010(4).
[10] 黄崇富,刘勇.基于单片机超声波避障智能寻迹运物小车系统设计[A].金山2012(11).
[11] 龙贵铃,徐磊.基于单片机的智能车避障的实现[A].计算机与数字工程2011(3).
[12] V.Yu. Teplov,A. V. Anisimov. Thermostatting System Using a Single-Chip Microcomputer
and Thermoelectric Modules Based on the Peltier Effect[J] ,2002.
[13] Taylor. D.Nonlinear control of electric machines: an over view, IEEE Control Syst
Mag[M],1994,14.
Automatic Obstacle Avoidance and Sensor Car
Based on 51 MCU
Abstract:51 MCU is a eight bit and quite powerful MCU, more important is that it is very easy to operate, so it is widely used by people. The design is based on SCM control 51 and the use of ultrasonic sensors to detect obstacles on the road, through the PWM technology to control the speed of the back two rounds, then the car turn around the obstacles. A incandescent lamp as the target to the car, it determine the direction of the light source using photosensitive resistance compass, finally reaching the target position. The car with automatic direction using 80C51 to control the automatic obstacle avoidance and automatic parking. Driving circuit of trolley mainly depends on the L298N. The whole system of the circuit structure is sample, reliable and high performance.
Keywords: MCU; ultrasonic sensors;80C51;L298N
致谢
经过两个月的努力我的毕业设计基本完成了,由于经验的缺乏以及自身知识的欠缺,本次设计并没有达到完美的效果,只是完成了智能小车的基本功能。

在论文的写作过程中,我得到了郭雄英老师的许多指导和帮助。

她在我从论文的选题、设计方案、软件设计到论文的修改、定稿等方面都做了精心的指导,使我不仅顺利地完成了论文的写作,而且使我的专业理论和科研能力都上了一个新的台阶。

每次遇到我解决不了的难题,我都会向郭老师求助,而郭老师不管多忙,总会给我耐心的指导,然后一起商量解决的办法。

她认真的工作态度,巧妙的学习方法以及创新的思维,都给我很大的影响。

在此谨向郭老师致以诚挚的谢意。

还要感谢张雯同学,她在我设计过程中给予了很多良好的建议与帮助。

最后,感谢我的母校大同大学,为我提供了良好的学习环境和成长的舞台,在这里我学到了很多并将收益终身,大学时代将成为我永远的记忆。

附录A源程序清单
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit p1_0 = P1^0; //前面超声波传感器
sbit p1_1 = P1^1; //左边超声波传感器
sbit p1_2 = P1^2; //右边超声波传感器
sbit p1_3 = P1^3; //左边光敏电阻与中间光敏电阻电压比较输出值sbit p1_4 = P1^4; //右边光敏电阻与中间光敏电阻电压比较输出值sbit p1_5 = P1^5; //中间光敏电阻与小电压的电压比较输出值
sbit p2_0 = P2^0; //驱动电机
sbit p2_1 = P2^1;
sbit p2_2 = P2^2;
sbit p2_3 = P2^3;
sbit ena=P2^4;
sbit enb=P2^5;
void delay(uint count) //延时1ms
{
uint j;
while(count--!=0)
{
for(j=0;j<72;j++)
;
}
}
void ZhiXing()
{
p2_0=0;
p2_1=1;
p2_2=0;
p2_3=1;
}
void ZuoZhuan()
{
p2_0=0;
p2_1=0;
p2_2=0;
p2_3=1;
}
void YouZhuan()
{
p2_0=0;
p2_1=1;
p2_2=0;
p2_3=0;
}
void Stop()
{
p2_0=0;
p2_1=0;
p2_2=0;
p2_3=0;
}
void bizhang(void) //避障函数{
ena=enb=1;
while(1)
{
if(p1_0==1 && p1_1==0 && p1_2==0 )
{
YouZhuan();
}
else if(p1_0==0 && p1_1==1 && p1_2==0 )
{
YouZhuan();
}
else if(p1_0==0 && p1_1==0 && p1_2==1 )
{
ZuoZhuan();
}
else if(p1_0==0 && p1_1==0 && p1_2==0 )
{
ZhiXing();
break;
}
}
}
void ganguang(void) //感光函数
{
while(1)
{
if(p1_3==0&&p1_4==0) //左边光敏电阻的电压最小,小车执行左转{
ZuoZhuan( );
}
else if(p1_3==1&&p1_4==1) //右边光敏电阻的电压最小,小车执行右转{
YouZhuan();
}
else if(p1_3==1&&p1_4==0) //正中光敏电阻的电压最小,小车执行前进{
ZhiXing();
break;
}
}
}
/*************主函数*********************/
void main()
{
delay(1000);//按下电源给小车1s的缓冲时间
while(1) //进入总循环
{
TMOD=0x11;//确定1时器工作方式
EA=1; //开总中断
ET1=1; //开定时器1中断
ET0=1; //开定时器0中断
while(1)
{
if(p1_5==0)
{ ganguang();
bizhang();
}
else Stop();
}
}
}
附录B 电路硬件仿真图。

相关文档
最新文档