自动追光自动避障电动小车.docx
《自动追光自动避障电动小车.docx》由会员分享,可在线阅读,更多相关《自动追光自动避障电动小车.docx(26页珍藏版)》请在冰豆网上搜索。
自动追光自动避障电动小车
自动追光自动避障电动小车
摘要
本设计基于AT89S52单片机为控制器,设计实现了一个带有自动寻光、自动避障、自动追光太阳能充电系统的电动小车。
本系统包含控制器、步进电机及驱动、小车寻光、超声波避障、太阳能板充电以及太阳能板自动追光等模块。
该电动小车能够在2m*2m的场地内自动寻找光源前进;能够检测前方多个障碍物并能绕道前行;车上太阳能板能够自动追光始终对准光源并给锂电池充电,且有LED显示充电状态;小车能在规定的时间内跑完全程并能自行停止。
整个系统实现了全部功能要求,运行稳定。
关键词:
AT89S52步进电机寻光避障太阳能板
1.引言
随着生产自动化、环保的发展需要,电动车、太阳能已经越来越广泛地应用到实际中。
随着科学技术的发展,电动车的传感器种类也越来越多,其中红外传感器、超声波传感器已经成为自动行走和避障的重要部件;太阳能技术也渐渐地进入人类的生活。
设计小车必须能够在2m×2m的场地内自动寻找光源前进;能够检测前方多个障碍物并能绕道前行;车上太阳能板能够自动追光始终对准光源并给锂电池充电,且有显示充电状态;小车能在规定的时间内跑完全程并能自行停止。
为实现设计要求,电动小车必须由多种多个传感器控制完成,寻光、避障传感器的选择及电路设计是本设计的关键,而实际的检测对此类的传感器的要求较高,怎样避免和解决上述问题也是本次设计的难点。
因此,本设计将围绕这些方面展开。
系统的设计框图如图1所示。
图1电动小车系统框图
本设计电动小车由步进电机驱动后轮前行,通过车头的红外对管电路寻找光源,在遇到路障时通过超声波传感器电路能够检测障碍并绕道继续寻光前进。
在小车行进过程中,由车顶的三个红外对管电路追踪光源,通过转动步进电机控制太阳能板旋转,并面对光源给蓄电池充电。
在整个过程中,控制器控制各模块的协调运行。
2.方案设计
2.1方案比较与选择
2.1.1小车寻光、太阳能板追光模块
方案一:
采用普通发光二极管及光敏电阻组成的发射接收方案。
该方案在实际使用时,容易受到外界光源的干扰,有时甚至检测不到。
主要是因为可见光的反射效果跟地表的平坦程度、地表材料的反射情况都有直接关系。
虽然可采取超高亮度发光二极管降低一定的干扰,但这又增加额外的功率损耗。
方案二:
采用红外接收管,虽然易受环境的影响,识别的可靠程度不高,但是由于其结构简单,体积小巧,易于安装,完全能用多个该传感器构成高精度的控制辐射网络提高识别的可靠性、准确性。
考虑到红外接收管接收光源的灵敏度较高,价格便宜,电路较简单,结合实际的应用环境,因此我们采用方案二。
2.1.2避障模块
方案一:
用超声波传感器进行避障。
超声波传感器的原理是:
超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。
超声波传感器在避障的设计中应用广泛。
方案二:
用漫反射式光电开关进行避障。
光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。
当有光线反射回来时,输出低电平。
当没有光线反射回来时,输出高电平。
考虑到本系统需要迎光检测障碍物,环境复杂。
白炽灯对光电开关的接收干扰较大,为了使用方便,便于操作和调试,系统最终选择了方案一。
2.1.3电机模块
方案一:
采用直流电机。
直流电机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速启动、制动和反转;能满足生产自动化系统各种不同的特殊运行要求。
方案二:
采用步进电机。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、启停的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机一个脉冲信号,电机则转过一个步距角。
因此,步进电机具有快速启停能力,如果负荷不超过步进电机所能提供的动态转矩值,就能立即使步进电机启动或反转,而且步进电机的转换精度高,驱动电路简单,非常适合定位控制系统。
基于以上分析,选择方案二。
2.2硬件模块设计
2.2.1小车寻光电路
为了达到准确的寻找光源,电路采用红外接收电路(如图2)。
当小车在行进中,我们考虑到光源的固定位置,且有障碍物的影响,进而在小车的头部位置左、右、前三个侧放置五个接收管。
接收管接收到光源发出的红外光时,接收管不导通,正向输入的电压大于基准电压,通过电压比较器进行比较输出高电平,接收管未接收到光源发出的红外光后,接收管导通,正向输入的电压将会小于基准电压,通过电压比较器进行比较输出低电平。
单片机可直接对接收到的信号进行判断是否检测到光源,并通过对检测到的信号进行处理来决定小车的运动方向。
图2寻光电路图
2.2.2避障电路
超声波传感器有发送器和接收器,它是利用压电效应的原理将电能和超声波相互转化。
超声波测距的原理一般采用渡越时间法,首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物的距离。
超声波传感器具有测量一定的测量范围,一般从几厘米到几米不等。
本系统采用专门的超声波传感器集成模块(实物图见附录图1),通过设定一定的距离来进行避障,在设计过程中,采用两个该超声波传感器来进行较大范围的避障,从而保障小车正常行驶。
2.2.3太阳能板追光电路
本设计太阳能板由八块小规格太阳能板并联而成。
该电路由步进电机、太阳能板、红外接收管电路组成,电路框图如图3所示。
图3太阳能板追光电路框图
通过固定在太阳能板上的红外接收管电路(原理图详见图2)寻找光源,反馈信息给单片机,由控制器控制太阳能板下面的步进电机带动太阳能板来跟踪光源。
2.2.4太阳能板充电电路
该电路设计由太阳能板接收光源后通过充电控制器给单节锂电池(3.7V750mA)充电,电路框图如图4所示。
图4太阳能板充电电路框图
在充电过程中,锂电池自身具有过冲过放保护,因此电路在充电控制部分增加了反接、短路等保护模块,原理图见附录2。
2.2.5采样电路
采用ADC0809采集太阳能板给锂电池提供的电压值,反馈单片机控制实现小车停止前进、显示蓄电池充电状态以及小车沿自然光源方向前进等功能,其工作原理框图如图5所示,
图5采样电路原理图
2.2.6电机驱动模块
本设计使用的步进电机是两项六线式,用L297和L298N驱动芯片驱动,其中单片机AT89S52通过I/O口向L297的17和18脚发送驱动控制信号,从而控制步进电机的速度及正反转。
LM297、298是具有高电压大电流的全桥驱动芯片,它相应频率高,且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
电路图如附录3所示:
2.2.7电源模块
电动小车的电机驱动电源采用12V12A的开关电源(原理图见附录4)。
而单片机及各电路模块所需电源均由5V电源提供,该电路由开关电源作输入,由三端稳压芯片7805、LM317起稳压作用,2200uf电解电容、100uf和0.33uf瓷片电容起滤除纹波作用,输出+5V电源(原理图见附录5)。
2.3系统软件设计
本系统软件主要流程图如图6所示:
图6系统软件流程图
3.设计实现
1、小车自动寻光与太阳能板追光。
设计在实际的小车寻光过程中,对红外接收管的灵敏度要求是相当高的,在测试时红外接收管很容易接收不到红外光,此外障碍物与光源之间的高度差产生了一段盲区,影响对管的工作,因此在调试接收管的高度与灵敏度是关键的。
太阳能板追光原理与小车寻光几乎一致,问题均是接收管的灵敏度和检测方向引起,实时调节接收管的接收和摆放方向才能很好的保证寻光与追光。
2、小车自动避障。
设计避障的方法较多,在开始阶段设计尝试了红外对管避障,但很容易发现光源的红外管会影响对管的工作,此后方案便选择了超声波避障的方法,虽然超声波传感器对环境的要求也较高,但相比红外对管在白炽灯照射的情况下,超声波避障还是很好实现的。
通过避障电路的测距原理,通过限定一定的距离范围,当超声波检测到该段范围便认定为有障碍物,另通过安置左右两个传感器可以更有效地完成避障任务。
4.系统测试
4.1测试条件与测试仪器
系统容易受到光源(除测试光源)的干扰,测试时必须在无其他光源干扰的条件下进行,并要确保供电电源的稳定性,测试使用的仪器设备如下表1所示。
表1测试使用的仪器设备
序号
名称
数量
备注(规格、作用)
1
白炽灯
1
100W以下
2
障碍物
5个以上
不小于15cm*15cm*15cm
3
秒表
1
测试时间
4
米尺
1
测量场地大小
4.2测试方法与测试结果
(1)用小于100W的白炽灯做引导光源,高度不高于25cm,场地不小于2m*2m,且场地中放置5个障碍物。
(2)小车寻光。
在场地内,随意将光源放置在小车前方2米的不同的位置,测试记录如表2所示。
表2测试寻光
光源位置
次数
备注
正前方
3
3次均能寻光前行
左前方
3
3次均能寻光前行
右前方
3次均能寻光前行
测试结果:
小车能够寻到光源并追踪光源,比较稳定。
(3)小车避障。
在尺寸为2m*2m的场地内,随意将障碍物放置在场地不同的位置,测试记录如表3所示。
表3测试避障
障碍物个数
形状
时间
3
1字形
48S
3
品字形
53S
3
任意形
54S
5
一字形
59S
5
任意形
64S
测试结果:
小车基本能在规定时间内走完全程,但有时不稳定。
(4)太阳能板追光。
将光源固定在场地边,通过改变太阳能板的位置来追寻光源,测试记录如表4所示。
表4测试太阳能板追光
光源位置
次数
备注
直射太阳能板
3
太阳能板能直射光源并小车寻光前进
左偏太阳能板
3
太阳能板左偏且小车左转
右偏太阳能板
3
太阳能板右偏且小车右转
背对太阳能板
3
2次太阳能板能自动寻找到光源
测试结果:
太阳能板追光完全能够实现自动追光。
(5)太阳能板给锂电池充电供电状态显示。
通过AD采样电压值,若太阳能板与锂电池之间的电压发生变化,单片机便控制外部LED点亮。
测试结果:
LED灯在太阳能板迎光时点亮,不迎光时灭掉。
(6)小车逆光前进,并绕过障碍物。
将太阳能板背对白炽灯光源,小车正对光源。
测试结果:
在自然光状态下,让太阳能板自检周围环境,通过AD0809采集太阳能板之间的电压,根据电压的大小来判断自然光的强弱。
5.总结
“四天三夜”对于参加电子设计大赛的参赛者来说,它的含义就是将大家所学的知识发挥到极致,做出最优秀的电子作品!
逆水行舟,仍需坚持到最后一秒!
根据大赛的时间期限,设计小组在最终完成了小车的制作和程序的编写。
小车能以一定速度追着光源行进,太阳能板始终能面对光源给蓄电池充电。
小车行进过程中如果遇到路障,小车能避开路障绕道找到光源并继续追光前进。
制作过程中,成员们克服了许多困难,完成了小车主体的器件分布规划和焊接。
期间出现了很多错误,例如红外接收管不能稳定工作等,但都被及时发现并纠正了。
从中受益最深的是步进电机驱动电路、超声波避障使用、红外接收管寻光等。
在这次的故障排查中,大家体会到前期规划的重要性,在焊之前考虑一下器件的焊接顺序和可能出现的问题,这样在焊的时候才会比较流畅,布线也比较清楚,查错也很容易。
对于这次比赛,设计小组深刻的理解了“信念”这个词,坚持到最后一秒,也是大赛里所要学的最终的道理!
通过实际操作加深了大家对理论知识的理解和运用能力,相信本组的努力会取得好的成绩。
参考文献
[1]赵建领.51系列单片机开发宝典.北京:
电子工业出版社,2007年.
[2]余锡存,曹国华著.单片机原理与接口技术.西安:
西安电子科技大学出版社,2003年.
[3]田良,黄正谨.综合电子设计与实践.南京:
东南大学出版社,2003年.
[4]赵亮,侯国锐.单片机C语言编程与实例.北京:
人民邮电出版社,2004年.
[5]黄智伟,王彦.全国大学生电子设计竞赛训练教程.北京:
电子工业出版社,2005年.
附录1:
超声波避障实物图
附录2:
充电控制电路原理图
附录3:
步进电机驱动电路图
附录4:
开关电源原理图
附录5:
5V稳压电源原理图
附录6:
小车实物图1
附录7:
小车实物图2
附录8:
主要程序清单
voidAD0809();//AD0809启动函数声明
voidDelay(unsignedintDelay_Time)
{
while(Delay_Time--);
}
voidinit()
{
TMOD=0x01;
TH0=(65535-m)/256;
TL0=(65535-m)%256;
TR0=1;
ET0=1;
EA=1;
}
voidmain()
{
LED=1;
init();
if(xuanze==1)
{
while
(1)
{
if(L2led==1&&L1led==1&&Mled==0&&R1led==1&&R2led==1)
{
EA=1;
qianjin();
if(flag8==1)
{
flag8=0;
for(i=0;i<5;i++)
{
AD0809();
SHUJV1=shujv;
if(shujv<35)shujv=35;
SHUJV1=shujv;
DY1=(((SHUJV1-35)*255)/177)*5*2/255;
DY2=DY1;
if(DY1>0)
{
LED=0;
}
if(DY2>2)
{
while
(1);
}
}
}
if(ceshi==0||ceshi1==0)
{
if(ceshi==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<3500;i++)
{
right2();
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
if(ceshi1==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<2500;i++)
{
left2();
}
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
}
if(L2led==1&&L1led==0&&Mled==0&&R1led==0&&R2led==1)
{
EA=1;
qianjin();
if(flag8==1)
{
flag8=0;
for(i=0;i<5;i++)
{
AD0809();
SHUJV1=shujv;
if(shujv<35)shujv=35;
SHUJV1=shujv;
DY1=(((SHUJV1-35)*255)/177)*5*2/255;
DY2=DY1;
if(DY1>0)
{
LED=0;
}
if(DY2>2)
{
while
(1);
}
}
}
if(ceshi==0||ceshi1==0)
{
if(ceshi==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<3500;i++)
{
right2();
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
if(ceshi1==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<2500;i++)
{
left2();
}
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
}
if(L2led==1&&L1led==1&&Mled==1&&R1led==1&&R2led==0)
{
EA=1;
for(i=0;i<5000;i++)
{
right2();
}
if(flag8==1)
{
flag8=0;
for(i=0;i<5;i++)
{
AD0809();
SHUJV1=shujv;
if(shujv<35)shujv=35;
SHUJV1=shujv;
DY1=(((SHUJV1-35)*255)/177)*5*2/255;
DY2=DY1;
if(DY1>0)
{
LED=0;
}
if(DY2>2)
{
while
(1);
}
}
}
if(ceshi==0||ceshi1==0)
{
if(ceshi==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<3500;i++)
{
right2();
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
if(ceshi1==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<2500;i++)
{
left2();
}
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
}
if(L2led==0&&L1led==1&&Mled==1&&R1led==1&&R2led==1)
{
EA=1;
for(i=0;i<5000;i++)
{
left2();
}
if(flag8==1)
{
flag8=0;
for(i=0;i<5;i++)
{
AD0809();
SHUJV1=shujv;
if(shujv<35)shujv=35;
SHUJV1=shujv;
DY1=(((SHUJV1-35)*255)/177)*5*2/255;
DY2=DY1;
if(DY1>0)
{
LED=0;
}
if(DY2>2)
{
while
(1);
}
}
}
if(ceshi==0||ceshi1==0)
{
if(ceshi==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<3500;i++)
{
right2();
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
if(ceshi1==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<2500;i++)
{
left2();
}
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
}
if(L2led==1&&L1led==1&&Mled==1&&R1led==1&&R2led==1)
{
EA=1;
for(i=0;i<2500;i++)
{
left2();
}
if(flag8==1)
{
flag8=0;
for(i=0;i<5;i++)
{
AD0809();
SHUJV1=shujv;
if(shujv<35)shujv=35;
SHUJV1=shujv;
DY1=(((SHUJV1-35)*255)/177)*5*2/255;
DY2=DY1;
if(DY1>0)
{
LED=0;
}
if(DY2>2)
{
while
(1);
}
}
}
for(i=0;i<5;i++)
{
EA=0;
Delay(50000);
}
if(ceshi==0)
{
for(i=0;i<2000;i++)
{
houtui();
}
for(i=0;i<2500;i++)
{
left2();
}
for(i=0;i<6000;i++)
{
qianjin();
}
}
}
}
}
voidser()interrupt1
{
TH0=(65535-m)/256;
TL0=(65535-m)%256;
count++;
if(count==1)
{
count=0;
flag=1;
}
if(count1==921)
{
flag8=1;
count1=0;
}
if(flag==1&&flag1==1)
{
flag=0;
Clock=~Clock;
Clock1=~Clock1;
}
if(flag==1&&flag2==1)
{
flag=0;
Clock=~Clock;
}
if(flag==1&&flag3==1)
{
flag=0;
Clock1=~Clock1;
}
}
voidAD0809()//AD0809启动函数
{
OE=0;//以下三条指令为起启动AD0809
ST=0;
ST=1;
ST=0;
while(!
EOC);
OE=1;//取出所读到的数据
shujv=P0;
OE=0;
}