智能寻迹小车的研究与开发.docx
《智能寻迹小车的研究与开发.docx》由会员分享,可在线阅读,更多相关《智能寻迹小车的研究与开发.docx(51页珍藏版)》请在冰点文库上搜索。
智能寻迹小车的研究与开发
材料清单
一、研究报告
1.项目成果简介
2.项目研究背景和意义
3.研究计划
4.研究内容
5.成果创新点
6.项目研究展望
二、附件材料
附件一:
实物电路图
附件二:
实物照片
附件三:
源程序清单
三、实物作品
衡阳市第三届大学生创新大赛相关项目的研究报告
项目名称:
智能寻迹小车的研究与开发
项目类型:
实用型
成果形式:
1、研究报告;2、实用作品
参赛学生:
陈绪雄、周锋、蒋晶
指导教师:
李祖林、雷军、李旭华
一、项目成果简介
本项目使用光电传感器检测小车的运动轨迹,金属传感器和超声波传感器检测小车周围的障碍,对小车的相关信息进行采集,采用AVR单片机Atmega128L作为电动小车的寻迹控制,AVR单片机Atmega128L完成算法分析、信息处理和小车的控制。
构建了以微处理器为核心、多传感器的小车信息检测与融合、声光报警与LCD数码显示、双向PWM控制驱动电机的智能小车寻迹系统。
电动小车能沿着任意设定的轨迹行走,遇到障碍自动停止5秒并发出声光报警,之后能自动倒回按设定的轨迹行走,小车能自动纠偏。
经过测试,小车能够按任意设定的轨迹行走流畅。
二、项目研究背景和意义
随着计算机技术、控制技术、信息技术的快速发展,工业的生产和管理进入了自动化、信息化和智能化时代,智能化已经成为时代发展的需要。
在柔性自动化生产线、智能仓储管理及物流配送等领域,当生产现场环境恶劣时,人工不能完成的任务如物料运输和装卸等,可采用智能寻迹小车完成相应的任务。
基于生产现场和日常生活的实际需要,研究和开发智能小车寻迹系统具有十分重要的意义。
该项目的研究可以应用于机车头灯自动寻迹、工厂自动化、仓库管理、智能玩具和民用服务等领域,可提高劳动生产效率,改善劳动环境。
三、研究计划
2007年6月1日---2007年6月20日,收集资料,确定研究内容、技术方案、研究路线。
(由组内3人共同研究)。
2007年6月21日---2007年7月30日,完成小车硬件的电路制作(陈绪雄负责小车整体方案确定、制作电路板,周锋负责购买元器件和电路焊接,蒋晶负责电路图绘制)。
2007年8月1日---2007年9月8日,完成小车软件的编写和小车整机调试。
(三人共同协作完成)。
2007年9月10日---2008年3月6日,完成成果总结。
四、研究内容
1方案与论证
1.1控制芯片的选择
方案一:
选用AVR单片机Atmega128L,Atmega128L是高性能、低功耗的AVR®8位微处理器,64引脚。
采用先进的RISC结构,具有133条指令,大多数可以在一个时钟周期内完成。
它具有两个独立的预分频器和比较器功能的8位定时器/计数器和两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器及具有独立预分频器的实时时钟计数器。
片内带有模拟比较器。
具有上电复位以及可编程的掉电检测功能。
其片内资源丰富,具有:
8个外部中断,4个定时计数器,53个I/O口,可解除I/O口资源不足的困难。
其引脚大多数都有具有第二功能,功能强大。
.
方案二:
采用AT89S52单片机,AT89S52单片机是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
AT89S52有5个中断源,和3个定时计数器。
方案三:
采用FPGA(现场可编辑门列阵)作为系统控制器。
FPGA可以实现各种复杂的逻辑功能,规模大,集成度高,体积小,稳定性好,并且可利用EDA软件进行仿真和调试。
FPGA采用并行工作方式,提高了系统的处理速度,常用于大规模实时性要求较高的系统。
方案比较:
由三种方案可以看出,以Atmega128L核心可以方便地实现对各个部分的控制和外接,而AT89S52而需要外扩大量的I/O口才能满足需要,而FPGA的高速处理能力得不到充分发挥且价格较贵,所以我们选择方案一。
(2)轨道行程控制方案的选择
为了使电动车能够识别黑线不跑离轨道,我们在系统中加装了光电传感器和金属传感器。
1.2路面检测
我们采用检测黑线的方法来控制智能小车的行走轨迹,使用了两个红外对管来检测黑线,同时用超声波传感器检测小车周围的障碍物。
方案一:
采用热探测器。
热探测器是利用所接收到的红外辐射后,会引起温度的变化,温度的变化引起电信号输出,且输出的电信号与温度的变化成比例,温度变化是因为吸收热辐射能量引起的,与吸收红外辐射的波长没有关系,即对红外辐射吸收没有波长的选择。
但热探测器对其吸收的红外辐射波长没有选择性,受外界环境的影响比较大。
方案二;采用光电探测器。
光电探测器接收红外辐射后,由于红外光子直接把材料的束缚态电子激发成传导电子,由此引起电信号输出,信号大小与所吸收的光子数成比例。
且这些红外光子的能量的大小(即红外光还必须满足一定的波长范围),必须满足一定的要求,才能激发束缚电子,起激发作用。
光电探测器吸收的光子必须满足一定的波长,否则不能被吸收,所以受外界影响比较小,抗干扰比较强。
基于上面分析,我们采用方案二
1.3小车运行终点检测
方案一:
采用计算路程的方法来控制。
只要将计算出来的路程不断的与预置的初值进行比较,只要相等说明已经到了终点,倒回起点也如此。
这种方法不仅计算路程麻烦而且占用了CPU的开销。
方案二:
采用检测金属片的方法。
只要在运行轨迹的终点放置一块铁片,再用金属传感器检测金属片就可以了,电路简单、程序采用中断的方式不会占用很多CPU资源。
综合上述我们采用方案二
1.4显示装置的选择
方案一:
采用美信公司的MAX7219是一款串行共阴极数码管动态扫描显示的驱动芯片,其峰值段电流可达到40mA最高串行扫描频率10MHz,典型扫描频率为1.3MHz,仅用3线串行接口传送数据,可直接与单片机接口,用户可以方便地修改其内部参数以实现多位LED显示。
它内含硬件动态扫描显示控制电路,每片芯片可同时驱动8位共阴LED。
点是控制比较简单,而且串行显示只占用很少的I/O口。
方案二:
采用点阵型LCD显示,点阵型LCD虽然占用的I/O口资源多,控制比较复杂,但其功能强大的,显示信息量大,可以保证良好的用户模式。
它具有显示质量高、体积小、重量轻、功耗低、轻薄短小、无辐射危险、平面直角显示以及影像稳定不闪烁等优势,可视面积大,图面积效果好,分辨率高,抗干扰能力强等特点等优点。
考虑到Atmega128I/O口资源丰富和LCD的众多优点,我们选择使用LCD显示。
2主要电路设计与分析
2.1系统结构框图
单片机将传感器送来的数据进行处理、算法分析,其输出信号控制电机并送LCD显示。
光电传感器负责黑线的检测,引导智能小车的行使轨迹。
金属传感器负责前起点和终点的检测,当金属传感器检测到金属条时,说明电动小车已经到起点或终点,采用超声波传感器检测智能小车的周围障碍物及其距离,若检测的距离达到超过给定值,发出声光报警,声音报警信号为“请注意倒车”。
系统框图如图2.1。
图2.1系统框图
2.2系统模块理论分析与设计
(1)探测路面黑线的基本原理
当光线照射到路面会反射,由于黑线和地面对光的反射系数不同,可根据接收到的反射光强弱,用光电传感器判断黑线。
光电管基本原理图如图2.2。
图2.2光电管基本原理图
当光电管检测不到黑线时,红外光管接收到反射回来的红外光,使其输出由高电平立即跳至低电平。
我们在小车上并排加上两个红外光电管,黑线置于两红外光电管之间,并且将两个光电管产生的电信号脉冲分别送单片机的PE2和PE3。
这样通过PWM来调节两个电机的速度来校正行使路线,电动车行驶状态和红外对管产生的电信号关系如表2-1。
表2-1电动车行驶状态和红外对管产生的电信号关系
(2)金属探测模块
金属探测模块主要用于行驶轨迹中金属片的探测。
考虑到金属一般都是导体,根据电磁场理论可知,在受到变化的电磁场作用的任何导体,都会产生电涡流。
因此,在本系统中采用电感式接近开关实现对金属片的检测。
电感式接近开关由LC高频振荡器和放大处理电路组成,金属物体接近传感器的振荡感应头时,物体内部产生电涡流,当电涡流作用于接近开关时,接近开关振荡能力衰减,内部电路的参数发生变化,由此识别出有无金属物体接近,进而控制开关的通和断,并以电信号脉冲的形式送入单片机的PD7。
电感式接开关内部工作原理图如图2.3。
图2.3电感式接开关内部工作原理图
(3)电机驱动模块
L298是一个4通道逻辑驱动电路,既将逻辑控制电平进行功率放大,可以用于功率驱动的电压。
电机驱动模块电路如图2.4所示。
图2.4电机驱动模块电路
PWM(脉冲宽度调制)控制,配用L298驱动电路实现直流电机的调速,非常简单且调速范围大,它利用的是直流斩波原理,假设高电平导通,在一个周期T内导通时间为t,那么一个周期T内的平均电压
,其中
=
称为占空比。
各周期内不同的占空比示例如图2.5。
图2.5各周期内不同的占空比示例
电机的转速与电机两端的电压成正比,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成正比,占空比越大,电机转得越快,当占空比
时,电机转速达到最大。
3程序设计
主程序流程图主要包括传感器输出中断的查询、电平的检测和电机的响应等。
主程序流程图如图3.1所示。
图3.1主程序流程图
4功能测试
通过测试,智能小车能按任意设定路线行驶,能实现以下功能:
(1)沿着直线轨迹行使。
(2)沿着S型设定轨迹行使。
(3)沿着任何设置的轨迹行使。
(4)小车行使到达轨迹终点时,自动停留5秒并发出声光报警之后自动寻迹倒回行使到起点。
(5)沿轨迹行使过程中,检测到障碍物时,自动停止5s,并发出声光报警“请注意倒车”。
4小结
项目设计中采用具有丰富资源的Atmega128单片机和光电传感器、金属传感器、超声波传感器等,实现相应信号的检测与小车的控制,系统结构简单、稳定、具有较高的控制精度、抗干扰能力强,实现了智能小车能按任意轨迹行驶。
五、成果创新点
智能小车能检测障碍物及其距离,并发出声光报警“请注意倒车”信号,智能小车能沿任意设定轨迹行驶,具有实际应用价值和推广价值。
六、项目研究展望
对智能寻迹小车的研究,加装GPS(全球卫星定位系统)或加装基于Internet的接口电路,智能寻迹小车将具有更广泛的应用前景和使用价值,这也是我们以后的研究方向。
附录一:
实物电路图
附件二:
实物照片
附录三:
程序清单
/*********************************************************
Thisprogramwasproducedbythe
CodeWizardAVRV1.24.1dStandard
AutomaticProgramGenerator
Copyright1998-2004PavelHaiduc,HPInfoTechs.r.l.
http:
//www.hpinfotech.ro
e-mail:
office@hpinfotech.ro
Project:
LTPC-3500
Version:
1.0
Date:
2007-6-1
Author:
HNHYLEI
Company:
HNGXY
Comments:
Chiptype:
ATmega128L
Programtype:
Application
Clockfrequency:
8.000000MHz
Memorymodel:
Small
ExternalSRAMsize:
0
DataStacksize:
128
*********************************************************/
#include
#include
#include
#include
#include
//-----------------------------------------------
#definebuzzer_ledPORTB.0
#defineLED1PORTD.0
#defineLED2PORTD.1
#defineLED3PORTD.2
#defineLED4PORTD.3
#definelpwm_ffPORTB.4
#definelpwm_rePORTA.4
#definerpwm_ffPORTB.7
#definerpwm_rePORTA.5
#defineblack_lPINE.2
#defineblack_rPINE.3
#definemetal_detectPINF.0
#definemodelPINF.2
//----------------------------------------液晶
#defineucharunsignedchar
#definersPORTA.7
#definerwPORTB.5
#defineenPORTB.6
#defineretPORTA.6
//LCD数据数据口初始化
#definedataPORTC
ucharcommand,data1,data2,com0;
ucharlcd_bufl,lcd_bufg;//定义显示缓冲区
//-----------------------------------------------
//Declareyourglobalvariableshere
//ThisflagissetonUSART0Receiverbufferoverflow
bitleft_run=0;//左走
bitright_run=0;//右走
bitleft_ff=1;//左前进
bitright_ff=1;//右前进
bitleft_pwm;//用于左PWM
bitright_pwm;//用于右PWM
//-----------
//---------------
bitfilter_start=0;//数字滤波
bitfilter_over=0;//数字滤波
bitblack_l1=0;//左黑线1
bitblack_l2=0;//左黑线2
bitblack_r1=0;//右黑线1
bitblack_r2=0;//右黑线2
bitleft_turn=0;//左转
bitright_turn=0;//右转
bitmetal1=0;//金属1
bitmetal2=0;//金属2
bitmode=0;//测试模式
bitstop_point;//停车点
bitbuzzer=0;//蜂鸣
bitlcd_dsp=0;//LCD刷新
bitread_over;//
bitgradient_set=0;//
bitstop_status=0;//
unsignedcharspeed_l;//left速度控制量
unsignedcharspeed_r;//right速度控制量
unsignedcharfilter_count;//数字滤波
unsignedcharexcute_step1;//
unsignedcharexcute_step2;//
unsignedintbcd_temp0=0;//BCD入口
//-------------------------------
unsignedcharcount1=0;//秒计时
unsignedcharcount2=0;//转弯计时
unsignedintcount3=0;//停止时间计时
unsignedintcount4=0;//
unsignedintcount5=0;//
unsignedintstop_time=0;//停止时间
unsignedintgradient=0;//
unsignedintgradient2=0;//
unsignedintgradient_old;//
unsignedintgradient2_temp1[8];//
unsignedintfilter_temp1[50];//数字滤波
unsignedlongintfilter_sum;
unsignedintfilter_temp3;
//------------------------------
unsignedcharj1,k1;//公共循环变量
unsignedcharbcd_temp[5]={0};//BCD分解值
//-----------------------------------
unsignedintahead_time=0;//前进时间
unsignedintback_time=0;//倒退时间
//EEPROM-----------------------------------------
//-----------------------------------------
voidbcd_con(unsignedcharnumb);
voidclear_lcd();
voidlcd_int();
voidlcd_set();
voiddisplay();
voiddis_code1();
voiddis_code2();
voidwrite_command(ucharcommand);
voidwrite_data(uchardata0);
//-----------------------------------------
//----------------------------------------------
//ExternalInterrupt0serviceroutine
interrupt[EXT_INT0]voidext_int0_isr(void)
{
//Placeyourcodehere
}
//ExternalInterrupt4serviceroutine
interrupt[EXT_INT4]voidext_int4_isr(void)
{
TCNT3H=0x00;
TCNT3L=0x00;
}
//ExternalInterrupt5serviceroutine
interrupt[EXT_INT5]voidext_int5_isr(void)
{
if(filter_start==0)
{
filter_temp1[filter_count]=(unsignedint)TCNT3H*0xff+(unsignedint)TCNT3L;
filter_count++;
if(filter_count==50)//60
{
filter_count=0;
filter_start=1;
}
}
if(filter_over==1)
{
filter_over=0;
gradient=filter_temp3;
read_over=1;
}
}
//-----------------------------------------------
//Timer0overflowinterruptserviceroutine
interrupt[TIM0_OVF]voidtimer0_ovf_isr(void)
{
//TCNT0=0x06;
left_pwm=~left_pwm;
if(left_pwm==1)
{
if(left_turn==1)
{
TCNT0=255-(speed_l/2);
}
else
{
TCNT0=255-speed_l;
}
}
else
{
if(left_turn==1)
{
TCNT0=speed_l/2;
}
else
{
TCNT0=speed_l;
}
}
if(left_run==1)
{
if(left_pwm==1)
{
if(left_ff==1)
{
lpwm_ff=1;
lpwm_re=0;
}
else
{
lpwm_ff=0;
lpwm_re=1;
}
}
else
{
lpwm_ff=0;
lpwm_re=0;
}
}
else
{
lpwm_ff=0;
lpwm_re=0;
}
}
//-------------------------------------------------------------
//Timer1overflowinterruptserviceroutine
interrupt[TIM1_OVF]voidtimer1_ovf_isr(void)
{
//Placeyourcodehere
TCNT1H=0xff;
TCNT1L=0x06;
//------------------------前进时间
if(++count1>=128)
{
count1=0;
if(excute_step1==0&&excute_step2!
=2)
{
ahead_time++;
}
if(excute_step1==2)
{
back_time++;
}
lcd_dsp=1;
//-------------
if(mode==1&&ahead_time<8)
{
gradient2_temp1[ahead_time]=gradient;
}
}
//------------------------
if(stop_point==1)//停车计时
{
if(++count3>=128)
{
count3=0;
stop_time++;
lcd_dsp=1;
if(buzzer==1)
{
buzzer_led=~buzzer_led;
LED1=~LED1;
LED2=~LED2;
LED3=~LED3;
LED4=~LED4;
}
else
{
buzzer_led=1;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
}
if(stop_time==5)
{
stop_point=0;
buzze