利用红外发射接收传感器进行距离检测Word文档格式.docx
- 文档编号:17040371
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:22
- 大小:144.03KB
利用红外发射接收传感器进行距离检测Word文档格式.docx
《利用红外发射接收传感器进行距离检测Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用红外发射接收传感器进行距离检测Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
尤其是对于让探测器的灵敏度很底的频率,为了让探测器探测到红外线的反射,物体必须离探测器
更近让反射的红外光更强。
另一个角度来考虑就是最高灵敏度的频率可以探测最远距离的物体,较低灵敏度的频率
可以探测距离较近的物体。
这使得距离探测就简单了。
选择5个不同频率,然后从最高灵敏
度到最低灵敏度进行测试。
首先尝试最高灵敏度频率,如果物体被探测到了,就让仅次于它的高灵敏度频率测试,观察是否可以探测到。
依赖于探测器不能再检测到物体的红外线频率,我们就可以推断物体的大概位置。
例程:
TestLeftFrequencySweep.c
例程要做两件事情:
首先,测试IRLED/探测器(分别与P1_3和P1_2连接)以确认它们的距离探测功能正常;
然后,完成图9-2所示的频率扫描。
#include<
BoeBot.h>
uart.h>
#defineLeftIRP1_2//左边红外接受连接到P1_2
#defineLeftLaunchP13//左边红外发射连接到P13
unsignedinttime;
intleftdistance;
intdistanceLeft,irDetectLeft;
//定时时间值
//左边的距离
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
voidtimer_init(void)
{
IE=0x82;
//开总中断EA允许定时器0中断ET0
TMOD|=0X01;
//定时器0工作在模式1:
16位定时器模式
}voidFreqOut(unsignedintFreq)
time=256-(500000/Freq);
//
TH0=0XFF;
TL0=time;
TR0=1;
delay_nus(800);
TR0=0;
}
根据频率计算初值
//高八位设FF
//低八位根据公式计算
//启动定时器
//延时
//停止定时器
voidTimer0_Interrupt(void)interrupt1
//定时器中断
LeftLaunch=~LeftLaunch;
TH0=0xFF;
voidGet_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();
ProgamRunning!
\n"
);
FREQENCYETECTED\n"
while
(1)
(
Get_lr_Distances();
distanceLeft=%d\n"
leftdistance);
\n"
delay_nms(1000);
Tips:
TestLeftFrequencySweep.c是如何工作的?
还记得“数组”吗?
这里你将用整数型数组存储五个频率值:
串口的初始化,这个函数已多次用到。
定时器的初始化。
此例程使定时器0工作在模式1,16位定时模式,不具备自动重载功能。
注意,timer_init()并没有开启定时器。
机器人要发射某一频率,该给定时器设定多大的值呢?
频率为f时,周期T=1/f,高低电平持续时间为t=1/(2T),根据公式TC=1-CC可算定时器
初值time:
。
16t500000
time2665536
1106f
但实际上,time值并未占满低八位,所以你可以这样简化计算:
高八位设0xFF,低八位
根据n=8时计算,即函数FreqOut(frequency[count])中用的time=256-(500000/Freq)来计算。
当低八位计满后,整个寄存器将溢出。
根据图6-2所示的描述原理,如果检测结果irDetectLeft为1,即没有发现物体,则距离leftdistance加1。
循环描述,当5个频率描完后,可根据leftdistance的值来判断物体离机
器人的大致距离。
运行程序时,在机器人前端放一白纸,前后移动白纸,调试终端将会显示白纸所在的区
域,如图9-3所示。
A.
■,串口调试depush.cob
串口螺
|conl刁
打开串口I
关闭串口I
渚除I
接收区
irDslftctL^ft=1irDettctLaft-0irDetectLeft=0irDetectLeft=0irDetectLeft二0ilist4iiceL*fl"
1
IE^H■■
irD«
tactLaft=1irDetectLeft=1irDetectLeft=0irDatsctLeft-0|irDelectL^fI=0diituic4L«
£
l=2
衰送区
友送I
图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/探测器探测距离并用右边的伺服电机调节机器人之间的位置以维持适当的距离。
Centerpulsewidth
图9-4右边的伺服电机及IRLED/探测器的比例控制方框图
让我们仔细观察一下图9-4的数字,学习一下比例控制是如何工作的。
这个特殊的例子
是右边的IRLED/探测器和右边的伺服电机的比例控制方框图。
设定位置为2,说明我们想
宝贝车维持它和任何它探测到的物体之间的距离是2。
测量的距离为4,距离太远。
误差是
设定值减去测量值的差,即2-4=-2,这在圆圈的左方以符号的形式指出,这个圆圈叫求和点。
接着,误差传入一个操作框。
这个操作框显示,误差将乘以一个比例常数Kp。
Kp
的值为70。
该操作框的输出显示为2X70=-140,这叫输出校正。
这个输出校正结果输入
到另一个求和点,这时它与电机的零点脉冲宽度1500相加。
相加的结果是1360,这个脉宽
可以让电机大约以3/4全速顺时针旋转。
这让宝贝车右轮向前、朝着物体的方向旋转。
第二次经过闭环,测量距离可能发生变化,但是没有问题,因为不管测量距离如何变,这个控制环路将会计算出一个数值,让电机旋转来纠正任何误差。
修正值与误差总是成比例
关系,该误差就是设定位置和测量位置的关系的偏差。
控制环都有一组方程来主导系统行为。
图9-4中的方框图是对该组方程的可视化描述方
法。
下面是从方框图中归纳出来的方程关系及结果:
Error=Rightdistancesetpoint-Measuredrightdistance
=2-4
Outputadjus=error-Kp
=2-70
=T40
Rightservooutput=Outputadjust+Centerpulsewidth
=-140+1500
=1360
通过一些置换,上面三个等式可被简化为一个,提供你相同的结果:
Rightservooutput=(Rightdistancesetpoint-Measuredrightdistance)Kp+Centerpulse
width
代入数值,我们可以看到结果一致:
=((2-4)-70)+1500
左边的IRLED/探测器以及左边的伺服电机的控制框图如图9-5所示,与右边的运算法
则类似。
不同的是比例系数Kp的值由+70变为为-70。
假设与右边的测量值一样,输出修正
的脉冲宽度应该为1640。
下面是该框图的计算等式:
Leftservooutput=(Leftdistancesetpoint-Measuredleftdistance)Kp+Centerpulsewidth
就像障碍物墙。
机器人应该维持它和纸
尝试轻轻旋转一下纸片,机器人应该跟随之旋转
尝试用纸片引导机器人四处运动,机器人应该跟随它
移动纸片距离机器人特别近时,机器人应该后退,远离纸片
#include<
#defineKpl-70
#defineKpr70
#defineSetPoint2
#defineCenterPulse1500
intleftdistance,rightdistance;
//左边和右边的距离
intdelayCount,distanceLeft,distanceRight,irDetectLeft,irDetectRight;
voidtimer_init(void){
voidFreqOut(unsignedintFreq){
time=256-(50000/Freq);
TH0=0XFF;
TL0=time;
RightLaunch=~RightLaunch;
unsignedcharcount;
//初始化左边的距离
rightdistance=0;
//初始化右边的距离
irDetectRight=RightIR;
if(irDetectLeft==1)
leftdistance++;
if(irDetectRight==1)rightdistance++;
voidSend_Pulse(unsignedintpulseLeft,unsignedintpulseRight)
P1_1=1;
delay_nus(pulseLeft);
P1_1=0;
P1_0=1;
delay_nus(pulseRight);
P1_0=0;
delay_nms(18);
unsignedintpulseLeft,pulseRight;
pulseLeft=(SetPoint-leftdistance)*Kpl+CenterPulse;
pulseRight=(SetPoint-rightdistance)*Kpr+CenterPulse;
Send_Pulse(pulseLeft,pulseRight);
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
如果你不属于班级成员的一部分(并且只有一个机器人),可以让尾随车跟随一张纸
或你的手来运动,就和跟随导引车一样
用阻值为1kQ或2kQ的电阻替换掉连接机器人红外线发光二极管的470Q电阻
使用程序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条纹带跟踪
2)测试条纹带
调节IRLED/探测器的位置向下和向外,如图6-8所示
确保绝缘带路径不受荧光灯干扰
用1k电阻代替与IRLED串联的470Q电阻,使机器人更加近视
运行程序DisplayBothDistances.c。
机器人与串口电缆相连,以便你能看到显示的距
离
如图9-9所示,把机器人放在白色招贴板上
验证你的区域读数是否表示被探测的物体
在很近的区域,两个传感器给你的读数都
是1或0
放置机器人使两个IRLED/检测器都直接指
向三条绝缘带的中心,如图9-10和9-11所
示,然后调整机器人的位置(靠近或远离
绝缘带)直到两个区域的值都达到4或者5,
这表明要么发现一个很远的物体,要么没
有发现物体
如果在你的绝缘带路径上很难获得比较高的读数值,参考绝缘带路径排错部分
3)绝缘带路径排错
如果当IRLED履测器指向绝缘带路径的中心的时候你不能获得比较高的读数值,代替原来三条绝缘带用四条绝缘带搭建路径。
如果区域读数仍然低,确认你是用1k?
电阻串联
在IRLED上。
你可以试用2k?
电阻使机器人更加近视。
如果都不行,试试不同的绝缘带。
调整IRLED/探测器,使它们指向更靠近或更远离机器人的前部可能有帮助。
如果当读白色表面时你的低区域测试有问题。
试试将IRLED/探测器朝机器人的方向再
向下调整,但是要注意不要让底盘带来干扰。
你也可以试试一个更低阻值的电阻。
如果你用老的缩小包装的IRLED代替带套筒的IRLED,当IRLED/探测器聚焦在白色背景上时你要得到一个低区域的值可能有问题。
这些IRLED可能需要串联220?
电阻。
也
要确保IRLED的脚没有相互接触。
现在,将机器人放在绝缘带路径上,它的轮子正好跨在黑色线上。
IR探测器应该稍稍
向外,如图9-12。
验证两个距离读数是否又是0或者1。
如果读数较高,意味着IR探测器需要再稍微朝远离绝缘带边缘的方向向外调整一下
□OEC
□□Sitrifi旨,日
(g^ar示T7~
Kwtf命!
A)
图9-12IR检测器朝向放大图
当你把机器人沿图中双箭头所示的任何一个方向移动,两个IR中的一个会指向绝缘带
上。
当你做了这些后,这个指向绝缘带上的IR的读数应该增加到4或5。
记住如果你将机器人向左移动,右边检测器的值会增加,如果你将机器人向右移动,左边检测器的值会升高。
调整IRLED/检测器直到机器人通过这个最后的测试,然后你可以试验下面的例程使机器人沿着条纹带行走
4)编程跟踪条纹带
你只需对程序FollowingRobot.c做一点小小的调整,就可以使机器人跟踪条纹带行走。
首先,机器人应当向目标靠近,以使到目标的距离比SetPoint要小;
或远离目标,以使
距离比SetPoint大,这同程序FollowingRobot.c的表现相反。
当机器人离物体的距离不在SetPoint的范围内时,让机器人向相反的方向运动。
只需简单地更改Kpl和Kpr的符号,换句
话说,将Kpl由-70改为70;
由Kpr由70改为-70。
你应该做试验,当SetPoint从2到4时,看哪个值使系统工作稳定。
下面的例程将SetPoint值改为3。
StripeFollowingRobot.c
打开程序FollowingRobot.c另存为StripeFollowingRobot.c
将SetPoint的值由2改为3
将Kpl由-70改为70
将Kpr由70改
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 红外 发射 接收 传感器 进行 距离 检测