利用红外发射接收传感器进行距离检测.docx
- 文档编号:17436233
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:28
- 大小:315.26KB
利用红外发射接收传感器进行距离检测.docx
《利用红外发射接收传感器进行距离检测.docx》由会员分享,可在线阅读,更多相关《利用红外发射接收传感器进行距离检测.docx(28页珍藏版)》请在冰点文库上搜索。
利用红外发射接收传感器进行距离检测
利用红外发射接收传感器进行距离检测
一、实验要求
对红外得发射接收作进一步得探讨。
红外可以用来测距离,理解红外测距得基本原理,能够掌握简单得比例控制方法,以及编程。
掌握定时/计数器得使用。
对循迹效果作分析。
二、实验概要
本实验将探讨红外测距得内容.利用红外检测器得内置电子滤波功能,调节发射红外得载波频率,而检测器对不同频率得信号有不同得“敏感度”,这样,就能大概得知道距离.
1。
测试红外得扫描频率.记录红外发射接收得距离.
2。
尾随小车。
让一个小车跟着另一个小车前行。
要将前后距离控制在一定得范围内,若前后距离较大,后面跟随得小车应该加速,跟上去;若距离小于预定值,则减速。
3.跟踪黑色条纹带.红外测距得另一种形式得应用。
也能让小车实现循迹功能。
三、实验内容
红外技术发展到现在,已经为大家所熟知,这种技术已经在现代科技、国防与工农业等领域获得了广泛得应用。
红外传感系统就是用红外线为介质得测量系统,按照功能能够分成五类:
(1)辐射计,用于辐射与光谱测量;
(2)搜索与跟踪系统,用于搜索与跟踪红外目标,确定其空间位置并对它得运动进行跟踪;(3)热成像系统,可产生整个目标红外辐射得分布图像;(4)红外测距与通信系统;(5)混合系统,就是指以上各类系统中得两个或者多个得组合。
红外传感器根据探测机理可分成为:
光子探测器(基于光电效应)与热探测器(基于热效应)。
本次试验将尝试用红外来测距.
1。
测试扫描频率
下图9—1显示得就是一个特殊品牌得红外线探测器数据表(Panasonic PNA4602M)得部分摘录.这个摘录显示了红外线探测器在接收到频率不同于38、5kHz时红外线信号时其敏感程度随频率变化得曲线图.
例如,当您发送频率为40kHz得信号给探测器时,它得灵敏度就是频率为38、5kHz得50%。
如果红外LED发送频率为42kHz,探测器得灵敏度就是频率为38、5 kHz得20%左右.尤其就是对于让探测器得灵敏度很底得频率,为了让探测器探测到红外线得反射,物体必须离探测器更近让反射得红外光更强。
另一个角度来考虑就就是最高灵敏度得频率可以探测最远距离得物体,较低灵敏度得频率可以探测距离较近得物体。
这使得距离探测就简单了。
选择5个不同频率,然后从最高灵敏度到最低灵敏度进行测试。
首先尝试最高灵敏度频率,如果物体被探测到了,就让仅次于它得高灵敏度频率测试,观察就是否可以探测到。
依赖于探测器不能再检测到物体得红外线频率,我们就可以推断物体得大概位置.
图 9-1 滤波器灵敏度由载波频率决定
图9—2探测区域
例程:
TestLeftFrequencySweep、c
例程要做两件事情:
首先,测试IR LED/探测器(分别与P1_3与P1_2连接)以确认它们得距离探测功能正常;然后,完成图9—2所示得频率扫描。
#include
#include<uart、h>
#defineLeftIR ﻩﻩP1_2ﻩﻩ//左边红外接受连接到P1_2
#defineLeftLaunch P1_3ﻩ//左边红外发射连接到P1_3
unsignedinttime;ﻩﻩ//定时时间值
intleftdistance;ﻩﻩ//左边得距离
intdistanceLeft, irDetectLeft;
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
voidtimer_init(void)
{
IE=0x82;//开总中断EA,允许定时器0中断ET0
TMOD|=0X01;ﻩ//定时器0工作在模式1:
16位定时器模式
}
void FreqOut(unsignedintFreq)
{
time =256- (500000/Freq);ﻩ//根据频率计算初值
TH0 =0XFF;ﻩﻩﻩ//高八位设FF
ﻩTL0 =time;ﻩﻩ//低八位根据公式计算
ﻩTR0=1;ﻩﻩ//启动定时器
ﻩdelay_nus(800);ﻩ//延时
TR0=0;ﻩ//停止定时器
}
voidTimer0_Interrupt(void)interrupt1ﻩ//定时器中断
{
LeftLaunch =~LeftLaunch;ﻩ//取反
TH0 = 0xFF;ﻩﻩ//重新设值
TL0=time;
}
void Get_lr_Distances()
{
unsignedintcount;
leftdistance = 0; //初始化左边得距离
ﻩfor(count = 0;count〈5;count++)
ﻩ{
FreqOut(frequency[count]);//发射频率
irDetectLeft=LeftIR;
printf("irDetectLeft=%d",irDetectLeft);
ﻩif(irDetectLeft== 1)
leftdistance++;
}
}
intmain(void)
{
uart_Init();
timer_init();
printf(”ProgamRunning!
\n”);
ﻩprintf("FREQENCYETECTED\n");
ﻩwhile(1)
ﻩ{
Get_lr_Distances();
ﻩprintf(”distanceLeft=%d\n",leftdistance);
printf("-------—-—-—----—\n");
delay_nms(1000);
ﻩ}
}
Tips:
TestLeftFrequencySweep、c就是如何工作得?
还记得“数组"吗?
这里您将用整数型数组存储五个频率值:
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
uart_Init();
串口得初始化,这个函数已多次用到。
timer_init();
定时器得初始化。
此例程使定时器0工作在模式1,16位定时模式,不具备自动重载功能。
注意,timer_init()并没有开启定时器。
Get_lr_Distances();
机器人要发射某一频率,该给定时器设定多大得值呢?
频率为f时,周期T=1/f,高低电平持续时间为t=1/(2T),根据公式TC=2n-CC可算定时器初值time:
但实际上,time值并未占满低八位,所以您可以这样简化计算:
高八位设0xFF,低八位根据n=8时计算,即函数FreqOut(frequency[count])中用得time= 256-(500000/Freq)来计算。
当低八位计满后,整个寄存器将溢出。
根据图6-2所示得描述原理,如果检测结果irDetectLeft为1,即没有发现物体,则距离leftdistance加1。
循环描述,当5个频率描完后,可根据leftdistance得值来判断物体离机器人得大致距离.
运行程序时,在机器人前端放一白纸,前后移动白纸,调试终端将会显示白纸所在得区域,如图9-3所示.
图9-3 距离探测输出实例
程序通过计算“1" 出现得数量,就可以确定目标在哪个区域。
紧记,这种距离测量方法就是相对得而非绝对地精确。
然而,它为机器人跟随,跟踪与其她行为提供了一个足够好得探测距离得能力。
●输入、保存并运行程序TestLeftFrequencySweep、c
●用一张纸或卡片面对IRLED/探测器做距离探测
●改变纸片与机器人距离,记录使distanceLeft变化得位置
该您了――测试右边得IRLED/探测器
●修改程序TestLeftFrequencySweep、c,对右边得IRLED/探测器做距离探测测试
●运行该程序,检验这对IRLED/探测器能否测量同样得距离。
您可参考教材配套光盘对应例程中得注释部分。
例程:
DisplayBothDistances、c
●修改程序TestLeftFrequencySweep、c,添加右边IRLED/探测器部分
●输入、保存并运行程序DisplayBothDistances、c
●用纸片重复对每个IRLED进行距离探测,然后对两个IRLED同时进行测试
该您了――更多得距离测试
●尝试测量不同物体得距离,弄清物体得颜色与(或)材质就是否会造成距离测量得差异
2.尾随小车
让一个宝贝车跟随另一个宝贝车行走,跟随得宝贝车,也叫尾随车,必须知道距离引导车有多远。
如果尾随车落在后面,它必须能察觉并加速.如果尾随车距离引导车太近,它也要能察觉并减速。
如果当前距离正好合适,它会等待直到测量距离变远或变近。
距离仅仅就是由机器人与其它自动化机器需要控制一种数值之一。
当一个机器被设计用来自动维持某一数值,比如距离、压力或液位等,它一般都包含一个控制系统。
这些系统有时由传感器与阀门组成,或者由传感器与电机组成。
在宝贝车里面,由传感器与连续旋转电机组成。
还必须有某些处理器可以接受传感器得测量结果并把它们转化为机械运动。
必须对处理器编程来基于传感器得输入做出决定,从而控制机械输出。
闭环控制就是一种常用得维持控制目标数据得方法,它很好地帮助宝贝车保持与一个物体之间得距离。
闭环控制算法类型多种多样,最常用得有滞后、比例、积分以及微分控制。
所有这些控制方法都将在《过程控制》教材中详细介绍。
事实上,图9-4所示得方框图描述了宝贝车用到得比例控制过程得步骤,即宝贝车用右边得IRLED/探测器探测距离并用右边得伺服电机调节机器人之间得位置以维持适当得距离。
图9-4右边得伺服电机及IRLED/探测器得比例控制方框图
让我们仔细观察一下图9—4得数字,学习一下比例控制就是如何工作得.这个特殊得例子就是右边得IRLED/探测器与右边得伺服电机得比例控制方框图。
设定位置为2,说明我们想宝贝车维持它与任何它探测到得物体之间得距离就是2。
测量得距离为4,距离太远。
误差就是设定值减去测量值得差,即2-4 = —2 ,这在圆圈得左方以符号得形式指出,这个圆圈叫求与点。
接着,误差传入一个操作框。
这个操作框显示,误差将乘以一个比例常数Kp。
Kp得值为70。
该操作框得输出显示为–2×70 = –140,这叫输出校正。
这个输出校正结果输入到另一个求与点,这时它与电机得零点脉冲宽度1500相加。
相加得结果就是1360,这个脉宽可以让电机大约以3/4全速顺时针旋转.这让宝贝车右轮向前、朝着物体得方向旋转。
第二次经过闭环,测量距离可能发生变化,但就是没有问题,因为不管测量距离如何变,这个控制环路将会计算出一个数值,让电机旋转来纠正任何误差。
修正值与误差总就是成比例关系,该误差就就是设定位置与测量位置得关系得偏差。
控制环都有一组方程来主导系统行为。
图9—4中得方框图就是对该组方程得可视化描述方法。
下面就是从方框图中归纳出来得方程关系及结果:
Error= Right distancesetpoint– Measuredrightdistance
=2–4
Outputadjus = error·Kp
=–2·70
=–140
Rightservooutput=Outputadjust+Centerpulsewidth
=–140+1500
=1360
通过一些置换,上面三个等式可被简化为一个,提供您相同得结果:
Rightservo output=(Rightdistancesetpoint –Measuredrightdistance)Kp+Centerpulsewidth
代入数值,我们可以瞧到结果一致:
=((2–4)·70) +1500
=1360
左边得IRLED/探测器以及左边得伺服电机得控制框图如图9—5所示,与右边得运算法则类似。
不同得就是比例系数Kp得值由+70变为为-70。
假设与右边得测量值一样,输出修正得脉冲宽度应该为1640。
下面就是该框图得计算等式:
Left servooutput= (Left distanceset point–Measured leftdistance)Kp+Centerpulse width
= ((2 –4)·(–70))+1500
图9—5机器人左伺服电机及IR Led/探测器得比例控制方框图
例程:
FollowingRobot、c
该例程实现刚才讨论过得各个伺服脉冲比例控制。
换句话说,在每个脉冲发送之前,需要测量距离,决定误差信号,然后将误差值乘以比例系数Kp,再将结果加上(或减去)发送到左(或右)伺服电机得脉冲宽度值。
●输入、保存并运行程序FollowingRobot、c
●把大小为20×28cm得纸片置于机器人得前面,就像障碍物墙.机器人应该维持它与纸片之间得距离为预定得距离
●尝试轻轻旋转一下纸片,机器人应该跟随之旋转
●尝试用纸片引导机器人四处运动,机器人应该跟随它
●移动纸片距离机器人特别近时,机器人应该后退,远离纸片
#include〈BoeBot、h〉
#include〈uart、h〉
#define LeftIRﻩP1_2//左边红外接受连接到P1_2
#define RightIRﻩP3_5 //右边红外接收连接到P3_5
#defineLeftLaunchﻩP1_3//左边红外发射连接到P1_3
#defineRightLaunch ﻩP3_6 //右边红外发射连接到P3_6
#defineKpl—70
#defineKpr70
#defineSetPoint2
#defineCenterPulse 1500
unsigned inttime;
intleftdistance,rightdistance;//左边与右边得距离
intdelayCount,distanceLeft,distanceRight,irDetectLeft,irDetectRight;
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
voidtimer_init(void)
{
IE=0x82; ﻩ//开总中断EA,允许定时器0中断ET0
TMOD|=0X01;ﻩ//定时器0工作在模式1:
16位定时器模式
}
voidFreqOut(unsignedint Freq)
{
time=256— (50000/Freq);
TH0=0XFF ;
TL0 =time;
ﻩTR0 = 1;
ﻩdelay_nus(800);
TR0=0;
}
voidTimer0_Interrupt(void)interrupt1
{
LeftLaunch=~LeftLaunch;
ﻩRightLaunch=~ RightLaunch;
ﻩTH0 = 0XFF;
ﻩTL0=time;
}
voidGet_lr_Distances()
{
unsigned charcount;
ﻩleftdistance =0; //初始化左边得距离
ﻩrightdistance=0; //初始化右边得距离
ﻩfor(count=0;count〈5;count++)
ﻩ{
FreqOut(frequency[count]);
ﻩirDetectRight=RightIR;
ﻩirDetectLeft =LeftIR;
ﻩif(irDetectLeft==1)
leftdistance++;
ﻩif(irDetectRight==1)
ﻩrightdistance++;
}
}
voidSend_Pulse(unsignedintpulseLeft,unsigned intpulseRight)
{
P1_1=1;
ﻩdelay_nus(pulseLeft);
ﻩP1_1=0;
ﻩP1_0=1;
ﻩdelay_nus(pulseRight);
ﻩP1_0=0;
ﻩdelay_nms(18);
}
int main(void)
{
unsigned int pulseLeft,pulseRight;
ﻩuart_Init();
ﻩtimer_init();
while(1)
ﻩ{
Get_lr_Distances();
pulseLeft=(SetPoint—leftdistance)*Kpl+CenterPulse;
pulseRight=(SetPoint—rightdistance)*Kpr+CenterPulse;
ﻩSend_Pulse(pulseLeft,pulseRight);
ﻩ}
}
Tips:
FollowingRobot、c就是如何工作得?
主程序做得第一件事就是调用Get_lr_Distances子函数。
Get_lr_Distances函数运行完成之后,变量leftdistance与rightdistance分别包含一个与区域相对应得数值,该区域里得目标被左、右红外线探测器探测到.
随后两行代码对每个电机执行比例控制计算:
pulseLeft =(SetPoint-leftdistance)*Kpl + CenterPulse
pulseRight =(SetPoint–rightdistance)*Kpr+CenterPulse
最后调用子函数Send_Pulse对电机得速度进行调节。
因为您要做得实验就是尾随,串口线得连接影响了机器人得运动,故可去掉。
该您了
图9—6所示就是引导车与尾随车。
引导车运行得程序就是FastIrRoaming、c修改后得版本,尾随车运行得程序就是FollowingRobot、c.比例控制让尾随车成为忠实得追随者.一个引导车可以引导一串大概6到7个尾随车.只需要把导引车得侧面板与后挡板加到其它得尾随车上。
图9—6导引机器人(左)与尾随机器人(右)
●如果您就是班级成员之一,把纸板安装在导引小车得两侧与尾部,参考图9—6
●如果您不属于班级成员得一部分(并且只有一个机器人),可以让尾随车跟随一张纸或您得手来运动,就与跟随导引车一样
●用阻值为1kΩ或2kΩ得电阻替换掉连接机器人红外线发光二极管得470Ω电阻
●使用程序FastIrRoaming、c修改后得版本对导引机器人编程来做避障试验,打开程序FastIrRoaming、c重命名为SlowerIrRoamingForLeadRobot、c
●对程序SlowerIrRoamingForLeadRobot、c做以下修改:
⏹把1300得增加为1420
⏹把1700得减少为1580
●尾随车运行程序FollowingRobot、c,不用做任何修改
●机器人都运行自己得程序,把尾随车放在引导车得后面.尾随车应该跟随一个固定得距离,只要它不被其它得诸如手或附近墙壁等引开
您可以通过调整SetPoint与比例常数来改变尾随车得行为。
用手或一张纸片来引导尾随车,做下面练习:
●尝试用30到100范围内得常量Kpr与Kpl来运行程序FollowingRobot、c,注意机器人在跟随目标运动得时候得响应有何差异
●尝试调节常量SetPoint得值,范围从0到4
3。
跟踪条纹带
图9—8就是您可以搭建得一个路径并编程使机器人跟它运动得例子。
路径中每个条纹带就是由三条1/4英寸宽得聚乙烯绝缘带边对边并行放置在白色招贴板上组成得,绝缘带条纹之间不能漏出白色板.
1)搭建与测试路线
为了成功跟踪该路径,测试与调节机器人就是必要得。
需要得材料:
(1)一张招贴板――大概尺寸:
22X28 英寸(56X71cm)
(2)1/4英寸(19mm)宽黑色聚乙烯绝缘带一卷
●参考图9-7用白色招贴板与绝缘带搭建运行路径
图9—7条纹带跟踪 图9-8红外探测器朝下扫描条纹带
2)测试条纹带
●调节IRLED/探测器得位置向下与向外,如图6-8所示
●确保绝缘带路径不受荧光灯干扰
●用1k电阻代替与IR LED串联得470Ω电阻,使机器人更加近视
●
运行程序DisplayBothDistances、c。
机器人与串口电缆相连,以便您能瞧到显示得距离
●如图9-9所示,把机器人放在白色招贴板上
●验证您得区域读数就是否表示被探测得物体在很近得区域,两个传感器给您得读数都就是1或0
●放置机器人使两个IRLED/检测器都直接指向三条绝缘带得中心,如图9-10与9-11所示,然后调整机器人得位置(靠近或远离绝缘带)直到两个区域得值都达到4或者5,这表明要么发现一个很远得物体,要么没有发现物体ﻩﻩﻩﻩﻩﻩﻩﻩﻩ 图9-9低区域测试俯视图
●如果在您得绝缘带路径上很难获得比较高得读数值,参考绝缘带路径排错部分
图9-10高区域测试顶视图 图9-11高区域测试(侧视图)
3)绝缘带路径排错
如果当IRLED/检测器指向绝缘带路径得中心得时候您不能获得比较高得读数值,代替原来三条绝缘带用四条绝缘带搭建路径。
如果区域读数仍然低,确认您就是用1kΩ电阻串联在IRLED上。
您可以试用2kΩ电阻使机器人更加近视.如果都不行,试试不同得绝缘带。
调整IRLED/探测器,使它们指向更靠近或更远离机器人得前部可能有帮助。
如果当读白色表面时您得低区域测试有问题。
试试将IRLED/探测器朝机器人得方向再向下调整,但就是要注意不要让底盘带来干扰。
您也可以试试一个更低阻值得电阻。
如果您用老得缩小包装得IRLED代替带套筒得IR LED,当IR LED/探测器聚焦在白色背景上时您要得到一个低区域得值可能有问题。
这些IR LED可能需要串联220Ω电阻。
也要确保IRLED得脚没有相互接触。
●现在,将机器人放在绝缘带路径上,它得轮子正好跨在黑色线上。
IR探测器应该稍稍向外,如图9—12。
验证两个距离读数就是否又就是0或者1.如果读数较高,意味着IR探测器需要再稍微朝远离绝缘带边缘得方向向外调整一下
图9—12IR检测器朝向放大图
当您把机器人沿图中双箭头所示得任何一个方向移动,两个IR中得一个会指向绝缘带上。
当您做了这些后,这个指向绝缘带上得IR得读数应该增加到4或5。
记住如果您将机器人向左移动,右边检测器得值会增加,如果您将机器人向右移动,左边检测器得值会升高.
●调整IRLED/检测器直到机器人通过这个最后得测试,然后您可以试验下面得例程使机器人沿着条纹带行走
4)编程跟踪条纹带
您只需对程序FollowingRobot、c做一点小小得调整,就可以使机器人跟踪条纹带行走。
首先,机器人应当向目标靠近,以使到目标得距离比SetPoint要小;或远离目标,以使距离比SetPoint大,这同程序Followin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 红外 发射 接收 传感器 进行 距离 检测