机器人技术与实践第五章:Boe-Bot 机器人光敏电阻导航与红外线导航_第1页
机器人技术与实践第五章:Boe-Bot 机器人光敏电阻导航与红外线导航_第2页
机器人技术与实践第五章:Boe-Bot 机器人光敏电阻导航与红外线导航_第3页
机器人技术与实践第五章:Boe-Bot 机器人光敏电阻导航与红外线导航_第4页
机器人技术与实践第五章:Boe-Bot 机器人光敏电阻导航与红外线导航_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章Boe-Bot机器人光敏电阻导航与红外线导航第一节Boe-Bot机器人光敏电阻导航

Boe-Bot集成套件中的光传感器可以探测可见光,并且可以检测不同的光亮度水平。这样,可以编程使Boe-Bot识别周围环境明或暗的范围,报告探测到的亮暗水平,并且可以寻找手电筒光束和从门口射进黑暗的屋子的光这样的光源。

光敏电阻也是电阻,它是一种其电阻值可以依赖于光强的光传感器,其电阻值由光的强弱决定(LDRLightDependentResistor)。图6-1是光敏电阻的示意图和元件图,我们可以用光敏电阻让Boe-Bot检测不同的光亮度水平一、搭建和测试光敏电阻电路

1、用光敏电阻来搭建并测试光的亮度感应电路。光的亮度感应电路能够探测出阴影和非阴影的区别。判断阴影是否覆盖光敏电阻的PBASIC命令和用来判断胡须是否碰到物体的命令是非常相似的元件清单:光敏电阻、2kΩ电阻(红-黑-红)、220Ω电阻(红-红-棕)、跳线、470Ω电阻–(黄-紫-棕)、1kΩ电阻–(棕-黑-红)、4.7kΩ电阻–(黄-紫-红)、10kΩ电阻–(棕-黑-橙)我们按上图搭建光敏电阻探测电路的接线2、光敏探测电路的工作原理

BASICStamp的I/O口可以作为输入或输出口,当作为输出口时,I/O口会送出高电平(5V)或低电平(0V)信号,前面学过,这些信号已经被用来控制LED灯的开或关,控制伺服电机和送音调给扬声器。

BASICStamp的I/O口也可以作为输入口。当作为输入口时,I/O口不会供给电压给与其连接的电路,相反的,它只是静静的监视电路状态,不会对电路有任何影响。在前面的章节中,输入寄存器已经存储了指示胡须是否被按下的值。例如:当检测到5V电压(胡须没有被按下)时,IN7输入寄存器存储1;当检测到0V电压(胡须被按下)时,寄存器存储0。设定为输入的I/O口实际上不是需要5V来使其输入寄存器的值为1,任何大于1.4V的电压都会使其寄存器的值为1。同样的,I/O口也不是需要0V来使其输入寄存器的值为0,任何小于1.4V的电压都会使其寄存器的值为0。

当BASICStamp的I/O口是输入口时,电路表现即不是I/O口也不是220Ω电阻,图示是其等效电路。光敏电阻用字母R来表示。如果光特别亮,电阻值非常小,如果是在完全黑暗的环境中,电阻值接近50kΩ。在一个带荧光天花板的光线好的屋子里,电阻值可能小到1kΩ(光线没有任何遮挡)或大到25kΩ(阴影遮住了光敏电阻)。由于光敏电阻的阻值随着光照的强弱而改变,用Vo来表示电压,当R增大时,Vo会减小;当R减小时,Vo会增大。Vo是当BASICStamp的I/O口作为输入口时它检测到的电压。如果电路连接到IN6,当Vo的值大于1.4V时,IN6寄存器存储1,当Vo的值小于1.4V时,IN6存储值0。

分压电路:

Vo

=2000/(2000+R)X5V3、探测阴影阴影使光敏电阻的电阻值R增大,相应的使电压Vo减小。在一个灯光比较好的屋子里,2kΩ电阻使Vo的值刚好大于1.4V。如果用手投一个阴影,Vo会小于临界值1.4V。在一个灯光比较好的屋子里,IN6和IN3都会存储1,如果在连接到P6的分压器的光敏电阻上投一个阴影,IN6的值变为0。同样的,如果在连接到P3的分压器的光敏电阻上投一个阴影,IN3的值变为0。

示例程序:TestPhotoresistorsDividers.bs2

这个例子是适用于光敏电阻分压器的程序。就像胡须导航监测P5和P7一样,我们现在监测连接到光敏电阻分压器的P3和P6。在一个光线比较好的屋子里,程序在两边都显示1。当用手在一个或两个光敏电阻上投一个阴影时,它们所对应的值变为0。

'RoboticswiththeBoe-Bot-TestPhotoresistorDividers.bs2'DisplaywhattheI/Opinsconnectedtothephotoresistor'voltagedividerssense.'{$STAMPBS2}'{$PBASIC2.5}DEBUG"PHOTORESISTORSTATES",CR,"LeftRight",CR,"---------------"DODEBUGCRSRXY,0,3,"P6=",BIN1IN6,"P3=",BIN1IN3PAUSE100LOOP光敏电阻分压器排错检查:⑴一般性验证:①检查你的接线和程序。②确保每个元件牢固的插在插座里。③检查你的电阻颜色。连接VSS和光敏电阻的电阻阻值是2kΩ(红-黑-红)。连接P6和P3到光敏电阻的阻值是220Ω(红-红-棕)。⑵如果无论你是否投一个阴影,输入寄存器的值IN3或者IN6的值为0:⑶如果房间微暗,建议增加灯。也可以把2kΩ电阻换成4.7kΩ电阻(黄-紫-红)。这将给你的电阻在较低光亮环境下分得高的电压。在光线相当暗的情况下,你甚至可以用10kΩ电阻(棕-黑-红)。⑷如果无论你是否投一个阴影,输入寄存器的值IN3或者IN6的值为1:如果相当亮,你发现你必须把手捂住光敏电阻的采光面来让寄存器从1变为0,你可以用低阻值的电阻替代2kΩ电阻。试试1kΩ电阻(棕-黑-红),如果在室外试试470Ω电阻(黄-紫-棕)该你了――

实验不同的电压分压器依据你的机器人周围的环境,选用较大或较小的电阻代替2kΩ的电阻可能会提高阴影探测器的性能。记住每次修改电路时断开连接主板的电源。试着用你收集的电阻470Ω,1kΩ,4.7kΩ,10kΩ来代替2kΩ的电阻。用程序TestPhotoresistorDividers.bs2测试每个电压分压器的组合,决定哪个电阻最适合你周围的环境,最好的组合是既不会过度敏感,又不需要你用手捂住光敏电阻。在下面两节中使用你觉得工作最好的电阻组合。二、行走和躲避阴影由于光敏电阻分压器表现类似于前面的胡须,因而值得检查程序RoamingWithWhiskers.bs2中哪些功能适用于光敏电阻分压器。修改程序RoamingWithWhiskers.bs2使其适用于光敏电阻分压器,调整IF…THEN声明使其监测IN6和IN3,而不是IN7和IN5。图6-5示范怎样修改'FromRoamingWithWhiskers.bs2IF(IN5=0)AND(IN7=0)THENGOSUBBack_UpGOSUBTurn_LeftGOSUBTurn_LeftELSEIF(IN5=0)THENGOSUBBack_UpGOSUBTurn_RightELSEIF(IN7=0)THENGOSUBBack_UpGOSUBTurn_LeftELSEGOSUBForward_PulseENDIF'Modifiedfor'RoamingWithPhotoresistor'Dividers.bs2IF(IN6=0)AND(IN3=0)THENGOSUBBack_UpGOSUBTurn_LeftGOSUBTurn_LeftELSEIF(IN6=0)THENGOSUBBack_UpGOSUBTurn_RightELSEIF(IN3=0)THENGOSUBBack_UpGOSUBTurn_LeftELSEGOSUBForward_PulseENDIF示例程序:RoamingWithPhotoresistorDividers.bs2打开程序RoamingWithWhiskers.bs2,另存为RoamingWithPhotoresistorDividers.bs2.如上图所示,修改程序。验证当用手在光敏电阻上投一个阴影时,Boe-Bot机器人是否避开阴影。试验无阴影,遮住右边的光敏电阻(连接P3的电路),遮住左边的光敏电阻(连接P7的电路),同时遮住两个光敏电阻。修改注释部分比如名称、胡须触动等,使注释符合光敏电阻器分配器的行为。你修改完后,这些注释应该与下面的程序类似。'RoboticswiththeBoe-Bot-RoamingWithPhotoresistorDividers.bs2'Boe-Botdetectsshadowsphotoresistorsvoltagedividercircuuitandturnsawayfromthem.'{$STAMPBS2}'{$PBASIC2.5}DEBUG"ProgramRunning!"'------[variables]---------------------------------------------------pulseCountVARByte'FOR...NEXTloopcounter'------[Initialization]----------------------------------------------FREQOUT4,2000,3000'Signalprogramstart/reset'------[MainRoutine]------------------------------------------------DOIF(IN6=0)AND(IN3=0)THEN'BothphotoresistorsdetectsGOSUBBack_Up'shaow,Backup&U_turn(lefttwice)GOSUBTurn_LeftGOSUBTurn_LeftELSEIF(IN6=0)THEN'LeftphotoresistorsdetectsGOSUBBack_Up'shaow,Backup&turnrightGOSUBTurn_RightELSEIF(IN3=0)THEN'RightphotoresistorsdetectsGOSUBBack_Up'shaow,Backup&turnleftGOSUBTurn_LeftELSE'NeitherphotoresistordetectsGOSUBForWard_Pulse'shaow,ApplyaforwardpulseENDIF'AndcheckagainLOOP'------[Subroutines]------------------------------------------------ForWard_Pulse:'Sendasingleforwardpulse.PULSOUT13,850PULSOUT12,650PAUSE20RETURNTurn_Left:'Leftturn,about90-degrees.FORpulseCount=0TO20PULSOUT13,650PULSOUT12,650PAUSE20NEXTRETURNTurn_Right:'Rightturn,about90-degrees.FORpulseCount=0TO20PULSOUT13,850PULSOUT12,850PAUSE20NEXTRETURNBack_Up:'Backup.FORpulseCount=0TO40PULSOUT13,650PULSOUT12,850PAUSE20NEXTRETURN

我们可以通过把一些子程序改成调用注释来提高Boe-Bot机器人的性能。这些子程序帮助机器人在遇到障碍物时后退并躲避障碍物的子程序。图6-6是当两个光敏电阻都探测到阴影时,IF…THEN声明中两个Turn_Left子程序调用被注释的例子。当只有一个光敏电阻探测到阴影时,Back_Up子程序调用被注释,使Boe-Bot机器人仅仅旋转来响应探测到的阴影。'RoamingWithPhotoresistor'Dividers.bs2IF(IN6=0)AND(IN3=0)THENGOSUBBack_Up'ExcerptfromGOSUBTurn_LeftGOSUBTurn_LeftELSEIF(IN6=0)THENGOSUBBack_UpGOSUBTurn_RightELSEIF(IN3=0)THENGOSUBBack_UpGOSUBTurn_LeftELSEGOSUBForward_PulseENDIF'Modifiedexcerptfrom'RoamingWithPhotoresistor'Dividers.bs2IF(IN6=0)AND(IN3=0)THENGOSUBBack_Up'GOSUBTurn_Left'GOSUBTurn_LeftELSEIF(IN6=0)THEN'GOSUBBack_UpGOSUBTurn_RightELSEIF(IN3=0)THEN'GOSUBBack_UpGOSUBTurn_LeftELSEGOSUBForward_PulseENDIF该你了更改程序RoamingWithPhotoresistorDividers.bs2,比较性能

三、更易于响应阴影控制的BOE-BOT

通过去掉导航子程序中的FOR…NEXT循环,可以使机器人响应更迅速。这对触须来说是不可能的,因为Boe-Bot机器人已经物理接触到物体,在转向之前必须后退。当用阴影来引导Boe-Bot时,无论Boe-Bot在向前移动或者做机动动作,它都会在每个脉冲之间探测是否仍有阴影。我们可以让机器人处在光线正常的情况下静止,然后使它跟随你的遮住光敏电阻的阴影行走。这是引导Boe-Bot运动的一种易于掌握的方法。程序示例:如果没有阴影遮住光敏电阻,Boe-Bot机器人会静止不动,当同时遮住两个光敏电阻时,Boe-Bot机器人会向前移动,当只遮住一个光敏电阻时,机器人会向探测到阴影的光敏电阻一侧转动。

'RoboticswiththeBoe-Bot-ShadowGuidedBoeBot.bs2.bs2'Boe-Botdetectsshadowscastbyyourhandandtriestofollowthem.'{$STAMPBS2}'{$PBASIC2.5}DEBUG"ProgramRunning!"FREQOUT4,2000,3000'Signalprogramstart/resetDOIF(IN6=0)AND(IN3=0)THEN'Bothdetectsshaows,forwardPULSOUT13,850PULSOUT12,650ELSEIF(IN6=0)THEN'LeftdetectsshaowPULSOUT13,750'pivotleftPULSOUT12,650ELSEIF(IN3=0)THEN'RightdetectsshaowPULSOUT13,850'pivotrightPULSOUT12,750ELSEPULSOUT13,750'Noshaow,sitstillPULSOUT12,750ENDIFPAUSE20'PausebetweenpulsesLOOP

DO…LOOP循环中的IF…THEN声明判断四个可能的阴影条件中的一个:两个都探测阴影,左侧探测阴影,右侧探测阴影,都没探测阴影。依据探测的阴影条件,PULSOUT命令给下面的其中一个动作发出脉冲:向前,右转,左转,静止。无论阴影条件如何,在DO…LOOP循环中四组脉冲中的一个每次都会发送。在IF…THEN声明之后,记住要执行PAUSE20来保证每对伺服脉冲之间的低电平。四、更为简便的光敏电阻电路测试

BASICStamp能够从光敏电阻电路得到的仅有的信息是光的强度高于还是低于阀值。本任务将介绍一个不同的电路,BASICStamp能够通过电路监测并收集足够的信息以确定相对光强。BASICStamp从电路得到的值范围从小到大,小的表明光比较强,大的表明光比较弱。这就意味着基于不同光强可以调整程序来寻找不同范围的值,而不是用手工替换不同阻值的电阻。1、电容器介绍电容是存储电荷的器件,其单位为法拉,我们这里所使用的电容存储的电荷量是百万分之几法拉。1法拉的百万分之一叫做微法,用μF表示。这里用的电容是0.01μF。图6-7所示是0.01μF电容的示意图和Boe-Bot机器人元件中所用电容的零件图,电容上的103表示它的值。图:电容的示意图和零件图2、重新搭建感光眼元件清单:光敏电阻(CDS)、0.01μF(103)电容、220Ω电阻(红-红-棕)、跳线

BASICStamp能够用来决定光强度的电路叫做阻容电路(RC),图示是Boe-Bot机器人的RC光探测电路原理图,断开连接主板和伺服电机的电源,搭建如图所示的RC电路。

3、RC电路原理上述电路中的电容看作一个微小的可充电电池。当P6发送一个高电平信号时,实质上是用5V加在电容上给它充电。几毫秒后,电容的电压几乎达到5V。如果BASICStamp程序改变I/O端口使端口仅仅监测电压,电容就通过光敏电阻放电。由于电容通过光敏电阻放电,电压衰减,随着电荷流失,电压越来越低。IN6感测到电压降到1.4V所用的时间取决于光敏电阻阻止电容提供的电流流动的能力大小。如果由于外界光线比较弱,光敏电阻的阻抗值大,电容就需要更长的时间放电。如果外界光线非常强,光敏电阻的阻抗值小,它阻止电流的能力很弱,电容就会很快失去电荷。4、用BASICStamp测量RC衰减时间可以编程使BASICStamp给电容充电然后测量电容电压衰减到1.4V所用的时间。测量的衰减时间可以用来表征光敏电阻的电阻。阻抗表示光敏电阻探测到的光的强弱。这个测量需要联合HIGH和PAUSE命令以及新命令RCTIME。RCTIME命令用来测量如图6-10所示的电路的RC衰减时间,下面是此命令的语法:

RCTIMEPin,State,Duration

参数Pin是你要测量的I/O端口值。例如,如果你要测量P6,参数Pin应该是6。参数State可以是1也可以是0。如果通过电容两端的电压从高于1.4V向下衰减,参数State应是1,如果电容两端的电压从小于1.4V向上增加,参数State应是0。图6-10所示的电路中,电容两端的电压从接近5V衰减到1.4V,因而State应该是1。Duration是存储测量的时间的变量,其单位是2μs,在下一个示例程序中,我们将测量连接到P6的光敏电阻电路的RC衰减时间,这只光敏电阻在Boe-Bot机器人左侧。测量RC衰减时间之前,要做的第一件事是确保已经定义一个存储测量时间的变量。timeLeftVARWord

下面三行代码是给电容充电,测量RC衰减时间并存储在timeLeft变量中

HIGH6PAUSE3RCTIME6,1,timeLeft代码执行分下面三步:1.连接电路到5V来给电容充电。2.在RC电路中,用PAUSE命令给HIGH命令足够的时间给电容充电。3.执行RCTIME命令,它设置I/O口为输入,测量衰减时间并存储在timeLeft变量中。

程序示例:投一个阴影在连接到P6的光敏电阻上,验证随着外界光线逐渐变黑,时间是否增大。将光敏电阻的采光面指向一个光源或用手电筒照射它,测量的时间应该是非常小。当逐渐将光敏电阻的采光面偏离光源,测量值会增大。如果投一个阴影或关掉光源,测量值会更大。

'RoboticswiththeBoe-Bot-TestP6Photoresistor.bs2'TestBoe-Botphotoresistorcircuitconnectedtop6anddisplaythedecaytime.'{$STAMPBS2}'{$PBASIC2.5}DOHIGH6PAUSE2RDTIME6,1,timeLeftDEBUGHOME,"timeleft=',DEC5TIMELEFTPAUSE100LOOP五、手电筒光束引导BOE-BOT

测试和校正Boe-Bot机器人的光传感器,使它能够识别环境光和手电筒光束。编程使机器人跟随指向它前方表面的手电筒光束行走。如果光敏电阻的采光面指向Boe-Bot机器人前面5.1cm处,任务会完成的最好,光敏电阻的采光面指向Boe-Bot机器人前面。编程使机器人朝着手电筒光束运动之前,我们必须知道机器人前方有无手电筒光束时读出的时间的区别。,按照下表完成有无手电筒光束的时间测量值。

'RoboticswiththeBoe-Bot-TestBothPhotoresistor.bs2'TestBoe-BotRCphotoresistorcircuitS.'{$STAMPBS2}'{$PBASIC2.5}timeLeftVARWord'VariabledeclarationstimeRightVARWordDEBUG"PHOTORESISTORVALUES",CR,'Initialization"timeLefttimeRight",CR,"-------------------"DO'MainroutineHIGH6'LeftRCtimemeasurement.PAUSE3RCTIME6,1,timeLeftHIGH3'RCtimemeasurement.PAUSE3RCTIME3,1,timeRightDEBUGCRSRXY,0,3,'DisplaymeasurementDEC5timeLeft,"",DEC5timeRightPAUSE100LOOP跟随手电筒光束在此之前,我们已经使用了变量声明。例如:counterVARNib在BASICStamp的RAM中分配给counter一个特殊的内存位置。当定义了这个变量之后,每次在PBASIC程序中使用它,都是使用了BASICStamp的RAM中特殊位置所存储的值。我们也可以声明常量。换句话说,如果计划在程序中使用一个数,给它一个有用的名字。不是用VAR,而是用CON来声明常量,这是下面示例程序中的一些CON指令:

LeftAmbientCON108RightAmbientCON114LeftBrightCON20RightBrightCON22

现在,程序在任何地方使用LeftAmbient,BASICStamp将会使用108。每次使用RightAmbient,BASICStamp就会使用114,同样的,无论LeftBright出现在程序的任何地方,它的实际值是20,RightBright的实际值是22。在运行程序之前,将用表6-1的值代替。常量也被用来计算其它的常量。这里是有关两个常量的例子,它们是LeftThreshold和RightThreshold,是由刚才所说的四个常量计算而来的。LeftThreshold和RightThreshold在程序中用来计算出手电筒光束是否被探测到。

'AverageScalefactorLeftThresholdCONLeftBright+LeftAmbient/2*5/8RightThresholdCONRightBright+RightAmbient/2*5/8

这些常量所进行的数学计算是取平均值,然后是取比例。LeftThreshold的平均值是LeftBright+LeftAmbient/2,结果再乘以5并除以8。意思是,LeftThreshold是一个常量,它的值是LeftBright和LeftAmbient的平均值的5/8。示例程序:FlashlightControlledBoeBot.bs2①用表6-1没有手电筒光束的timeLeft测量值代替LeftAmbientCON指令中的108。②用没有手电筒光束的timeRight测量值代替RightAmbientCON操作符中的114。③用有手电筒光束的timeLeft测量值代替LeftBrightCON操作符中的20。④用有手电筒光束的timeRight测量值代替RightBrightCON操作符中的22。打开主板和伺服电机的电源。保存然后运行程序FlashlightControlledBoeBot.bs2。试验并计算将光束聚集在哪里可以使机器人向前走,左转,右转,用光束引导机器人穿过不同的障碍物。'-----[Title]-----------------------------------------------------'RoboticswiththeBoe-Bot-FlashlightControlledBoeBot.bs2'Boe-Botfollowsflashlightbeamfocusedinfrontofit.'{$STAMPBS2}'Stampdirective.'{$PBASIC2.5}'PBASICdirective.DEBUG"ProgramRunning!"'-----[Constants]------------------------------------------------'REPLACETHESEVALUESWITHTHEVALUESYOUDETERMINEDANDENTEREDINTO'TABLE6.1.LeftAmbientCON108RightAmbientCON114LeftBrightCON20RightBrightCON22'AverageScalefactorLeftThresholdCONLeftBright+LeftAmbient/2*5/8RightThresholdCONRightBright+RightAmbient/2*5/8'-----[Variables]------------------------------------------------'DeclarevariablesforstoringmeasuredRCtimesoftheleft&rightphotoresistors.timeLeftVARWordtimeRightVARWord'-----[Initialization]--------------------------------------------FREQOUT4,2000,3000'-----[MainRoutine]----------------------------------------------DOGOSUBTest_PhotoresistorsGOSUBNavigateLOOP'-----[Subroutine-Test_Photoresistors]--------------------------Test_Photoresistors:HIGH6'LeftRCtimemeasurement.PAUSE3RCTIME6,1,timeLeftHIGH3'RightRCtimemeasurement.PAUSE3RCTIME3,1,timeRightRETURN'-----[SubroutineNavigate]---------------------------------------Navigate:IF(timeLeft<LeftThreshold)AND(timeRight<RightThreshold)THENPULSOUT13,850'Bothdetectflashlightbeam,PULSOUT12,650'fullspeedforward.ELSEIF(timeLeft<LeftThreshold)THEN'Leftdetectsflashlightbeam,PULSOUT13,700'pivotleft.PULSOUT12,700ELSEIF(timeRight<RightThreshold)THEN'Rightdetectsflashlightbeam,PULSOUT13,800'pivotright.PULSOUT12,800ELSEPULSOUT13,750'Noflashlightbeam,sitstill.PULSOUT12,750ENDIFPAUSE20'Pausebetweenpulses.RETURN

程序FlashlightControlledBoeBot.bs2是如何工作的呢?这里使用了表6-1的值声明的四个常量。

LeftAmbientCON108RightAmbientCON114LeftBrightCON20RightBrightCON22

现在这四个变量已经被声明,下面两行取平均值并乘以一个比例系数得到了程序所需的阀值,可以比较阀值和timeLeft以及timeRight的测量值来判断光敏电阻感应的是环境光还是聚焦光束。

AverageScaleLeftThresholdCONLeftBright+LeftAmbient/2*5/8RightThresholdCONRightBright+RightAmbient/2*5/8

下面这些变量用来存储RCTIME测量结果。

timeLeftVARWordtimeRightVARWord

这是本文中许多程序都用到的复位指示器。

FREQOUT4,2000,3000

主程序中包含两个子程序调用。所有实际的工作集中在两个子程序上,子程序Test_Photoresistors对两个RC光敏电阻电路进行RCTIME测量,Navigate判断并发送伺服电机控制脉冲。

DOGOSUBTest_PhotoresistorsGOSUBNavigateLOOP

这是对两个光敏电阻电路进行RCTIME测量的子程序,左侧电路的测量结果存储在timeLeft变量中,右侧电路的测量结果存储在timeRight变量中。

Test_Photoresistors:HIGH6PAUSE3RCTIME6,1,timeLeftHIGH3PAUSE3RCTIME3,1,timeRightRETURN

Navigate子程序使用IF…THEN来比较变量timeLeft和常量LeftThreshold,timeRight和RightThreshold。记住,当RCTIME测量值小时,意味着探测到强光,当此值大时,意味着光不强。因此,当存储RCTIME测量结果的变量小于阀值时,意味着探测到手电筒光束,否则,没有探测到手电筒光束。根据子程序探测到的情况,正确的导航脉冲被发出,接着是PAUSE命令,然后RETURN命令退出子程序

Navigate:IF(timeLeft<LeftThreshold)AND(timeRight<RightThreshold)THENPULSOUT13,850PULSOUT12,650ELSEIF(timeLeft<LeftThreshold)THENPULSOUT13,700PULSOUT12,700ELSEIF(timeRight<RightThreshold)THENPULSOUT13,800PULSOUT12,800ELSEPULSOUT13,750PULSOUT12,750ENDIFPAUSE20RETURN该你了可以通过调整常量声明中的比例系数来调节程序的性能。

'AverageScalefactorLeftThresholdCONLeftBright+LeftAmbient/2*5/8RightThresholdCONRightBright+RightAmbient/2*5/8

如果你将比例系数由5/8改成1/2,机器人对光束的敏感程度会降低,这可能会改善手电筒光束的控制。

试用不同的比例系数,比如1/4,1/2,1/3,2/3,3/4等,注意机器人对手电筒光的任何不同反应。①修改示例程序中的IF…THEN声明,你可以改变机器人的行动使其试图避开进入视觉范围的光线。②修改IF…THEN声明,当机器人两侧光敏电阻都检测到手电筒光时,它向后退;当机器人一侧的光敏电阻检测到手电筒光时,它转向另一侧。

六、向亮光处移动下面我们可以引导机器人从相当黑的屋子退出并朝着有亮光进入的门口移动。也可以通过用手在光敏电阻上面投一个阴影对机器人行走进行更好的控制。1、重新调节光敏电阻如果光敏电阻的聚光表面向上并向外,试验会做得最好,将光敏电阻的聚光表面向上并向外,如图所示2、编写向亮光移动的程序向更亮光源移动的关键是当两侧光敏电阻的测量结果差别小时,向前直走;当两侧光敏电阻的测量结果差别大时,转向测量值小的一侧。简而言之,Boe-Bot机器人会朝着更亮的地方转动。最初看起来是一个足够简单的编程任务;象下面例子的IF…THEN判断语句应该正常工作。问题是,小车不会向前移动,因为它不断的左转然后右转,这是因为timeLeft和timeRight的变化很大。每次Boe-Bot机器人转动一点,变量timeRight和timeLeft会变化很多以至于机器人试图去更正并向回走。它永远不会得到向前走的脉冲信号。

IF(timeLeft>timeRight)THEN'Turnright.PULSOUT13,850PULSOUT12,850ELSEIF(timeRight>timeLeft)THEN'Turnleft.PULSOUT13,650PULSOUT12,650ELSE'Goforward.PULSOUT13,850PULSOUT12,650ENDIF

下面是另一个工作稍好的代码块。它将来回旋转的问题放在一个特定的条件下。在Boe-Bot机器人使用左转脉冲之前变量timeLeft必须比timeRight大15。同样的,当Boe-Bot机器人调整向右之前timeRight必须比timeLeft大15。这就使机器人在特定的光线条件下转动调整方向之前有机会使用足够多的向前脉冲。

IF(timeLeft>timeRight+15)THEN'Turnright.PULSOUT13,850PULSOUT12,850ELSEIF(timeRight>timeLeft+15)THEN'Turnleft.PULSOUT13,650PULSOUT12,650ELSE'Goforward.PULSOUT13,850PULSOUT12,650ENDIF

上面代码块的问题是它只能工作在中等黑暗的环境下。如果将它拿到相当暗的地方,Boe-Bot机器人不断的来回旋转,永远不会应用任何向前行走的脉冲。如果将它拿到更亮的地方,Boe-Bot机器人只会向前运动,而不会调整向左或向右的方向。当Boe-Bot机器人处在房子的黑暗部分时,每个光敏电阻的测量值会大一些。机器人决定转向亮光源时,两个测量结果之间的差别会较大;当机器人处在更亮一点的地方时,每个光敏电阻的测量值会小一点,机器人决定做一个转动时,两个测量结果之间的差别会比在黑暗的地方小。使小车对不同的光线条件产生不同的响应的方法是设定一个变量,即timeRight和timeLeft的平均值的分数。这样的话,无论外界光线强弱,值总是正确的。average=timeRight+timeLeft/2difference=average/6现在,变量difference可以被用在IF…THEN声明中,当光线弱时,它的值大,当光线强时,它的值小。IF(timeLeft>timeRight+difference)THEN'Turnright.PULSOUT13,850PULSOUT12,850ELSEIF(timeRight>timeLeft+difference)THEN'Turnleft.PULSOUT13,650PULSOUT12,650ELSE'Goforward.PULSOUT13,850PULSOUT12,650ENDIF

示例程序:RoamingTowardTheLight.bs2

不管外界光的强弱,此程序将对用手在光敏电阻上投的阴影非常敏感。这个程序不需要根据外界光线情况改变电阻,相反,它会计算光的强弱并在软件中使用变量average和difference调节灵敏度。此程序测量timeLeft和timeRight的平均值,并用平均值来设置difference的值在timeLeft和timeRight的测量结果之间。这个值用来判断是否发送一个旋转脉冲。①将机器人放在不同的地方,让它移动,验证无论光的强度如何,你可以通过用手在RC电路的一个光敏电阻上投一个阴影来改变其运动轨迹。②试着将机器人放在光线很暗的房子里,但是有光线通过门从邻近很亮的屋子或走廊射进来,看机器人是否可以成功走出屋子。'-----[Title]------------------------------------------------------'RoboticswiththeBoe-Bot-RoamingTowardTheLight.bs2'Boe-Botroams,andturnsawayfromdarkareasinfavorofbrighterareas.'{$STAMPBS2}'Stampdirective.'{$PBASIC2.5}'PBASICdirective.DEBUG"ProgramRunning!"'-----[Variables]--------------------------------------------------'DeclarevariablesforstoringmeasuredRCtimesofthe'left&rightphotoresistors.timeLeftVARWordtimeRightVARWordaverageVARWorddifferenceVARWord'-----[Initialization]---------------------------------------------FREQOUT4,2000,3000'-----[MainRoutine]-----------------------------------------------DOGOSUBTest_Photoresistors'Formismatchedphotoresistors,useAppendixF,uncommentandusenextline.'timeLeft=(timeLeft*/351)+7'Replace351and7withyourownvalues.GOSUBAverage_And_DifferenceGOSUBNavigateLOOP'-----[Subroutine-Test_Photoresistors]-----------------------------Test_Photoresistors:HIGH6'LeftRCtimemeasurement.PAUSE3RCTIME6,1,timeLeftHIGH3'RightRCtimemeasurement.PAUSE3RCTIME3,1,timeRightRETURN'-----[Subroutine-Average_And_Difference]------------------Average_And_Difference:average=timeRight+timeLeft/2difference=average/6RETURN'-----[Subroutine-Navigate]--------------------------------Navigate:'Shadowsignificantlystrongeronleftdetector,turnright.IF(timeLeft>timeRight+difference)THENPULSOUT13,850PULSOUT12,850'Shadowsignificantlystrongeronrightdetector,turnleft.ELSEIF(timeRight>timeLeft+difference)THENPULSOUT13,650PULSOUT12,650'Shadowsinsameneighborhoodofintensityonbothdetectors.ELSEPULSOUT13,850PULSOUT12,650ENDIFPAUSE10RETURN

现在,变量differences是用average除以6得到的。如果你想使机器人对光的差别不要太敏感,用average除以一个小些的数;如果你想使机器人对光的差别更敏感一些,用average除以一个大些的数。①不用6除,试着用3,4,5,7,9来除变量average。②运行程序并测试机器人用上面不同值退出黑暗屋子的能力。③确定最合适的分母值。

Average_And_Difference:average=timeRight+timeLeft/2difference=average/6RETURN

你也可以将分母变为一个常量,如下所示:

DenominatorCON6

然后,在子程序Average_And_Difference中,你可以用常量Denominator代替6(或你所确定的优化值),如下所示:

Average_And_Difference:average=timeRight+timeLeft/2difference=average/DenominatorRETURN

做刚才所讨论的修改,验证程序仍然工作正常。在这个程序中,你可以使用更少的变量。注意,变量average被用来临时存储平均值,然后它被Denominator除,结果存储在变量difference中。变量difference在后面可以用到,但变量average不会用到。解决这个问题的方法是用变量difference代替average。工作仍然正常,你也不再需要变量average。下面是修改后的子程序:

Average_And_Difference:difference=timeRight+timeLeft/2difference=difference/DenominatorRETURN

下面是一个更好的方法:

程序Average_And_Difference如下:

Average_And_Difference:average=timeRight+timeLeft/2difference=average/DenominatorRETURN

下一步,在变量声明中做这些修改:图示:更改程序RoamingTowardTheLight.bs2来存储一个字变量到RAM'UnchangedcodeaverageVARWorddifferenceVARWord

'ChangedtosaveWordofRAMAverageVARWorddifferenceVARaverage我们确实不需要变量average,但是如果在第一行使用average,在第二行使用difference,将会给人造成误解。这里是如何为变量average创建一个别名difference。differenceVARaverage现在,average和difference指向RAM中同样的字变量RAM。

测试修改后的程序,确保工作正常。

总结这章节的重点在于侦测光照强度的不同与在光照强度的差异中让Boe-Bot运作,使用两个光敏电阻测量可见光强度的差异。一开始是将光电阻与电阻连接形成分电压线路,BASICStamp检视光敏电阻与电阻连接处的电压值,当该点电压值低于1.4V时,与线路连结的输入端缓存器就储存数值0;若该点电压高于1.4V,缓存器就储存数值1。Boe-Bot会透过程序处理这些二进制数值,与whisker的运作方式类似。光电阻分压线路的运作必须在适当的电阻与持续照射的光源中才能维持。在RC线路中使用光敏电阻的光电阻RC线路,会有更多种方法来侦测光照的强弱,原理是测量充满电的电容要耗费多少时间进行放电,也就是测量衰退时间。RC指的是电阻与电容,章节中有对于电容的简介,也介绍了电容与线路如何让BASICStamp测量RC衰退时间。只要在BASICStamp中使用RCTIME指令,就可轻松完成测量,因为RCTIME指令是特别设计于测量RC线路的充电与放电时间。另外介绍了声明常数的方法,用有意义的名称取代PBASIC程序中使用的数字。也介绍了刻度因子与平均值的用法,刻度因子是用于设定阀值,侦测是否有手电筒的照射;平均值是用在求两个光电阻的RC衰退时间的平均值,这两个方法都用在最后的步骤中,让阀值能随着光照条件自行调整大小,如此便不再需要随着光照条件改变而更换电阻。第二节Boe-Bot机器人红外线导航BASICStamp微控制器也可以收发红外光信号。使用红外线前灯探测道路红外前灯我们在Boe-Bot机器人上建立的红外物体探测系统在许多方面就象汽车的前灯。当汽车前灯的光从物体反射时,你的眼睛发现障碍物体同时你的大脑处理这些信息从而让你的身体引导汽车。Boe-Bot机器人使用红外LED灯作为前灯,如图7-1所示。他们发射红外光,在一些情况下,红外线从物体反射并从机器人前进的方向折回。Boe-Bot机器人的眼睛是红外检测器。红外检测器发出信号来表明它们是否检测到从物体反射的红外线。Boe-Bot机器人的大脑,BASICStamp微控制器做出判断并基于这个传感器的输入控制伺服电机。

IR(红外线)检测器有内置的光滤波器,除了需要我们用它的内部的光敏二极管传感器检测的980nm红外线,它几乎不允许其它光通过。红外检测器也有一个电子滤波器,它只允许大约38.5kHz的信号通过。换句话说,检测器只寻找每秒闪烁38,500次的红外光。这就防止了普通光源象太阳光和室内光的IR的干涉,太阳光是DC干涉(0Hz),室内光依赖于所在区域的主电源,闪烁频率接近100或120Hz。由于120Hz在电子滤波器的38.5kHz通带频率之外,它完全被IR探测器忽略。

一、搭建并测试IR发射探测器元件清单:红外检测器、IRLEDs、IRLED套管、220Ω电阻(红-红-棕)、1kΩ电阻(棕-黑-红)IR检测器

IRLEDs

IRLED套管

1、搭建红外线前灯步骤:⑴将红外LED插入套管⑻确保LED摁入到大的套管中。⑵将小的套管套在LED上,并摁进大的圈里面。

电路板的每个角安装一个IR组(IRLED和检测器)。图7-4所示是IR发射器原理图,图7-5所示是接线图。⑴断开主板和伺服系统的电源。⑵建立图7-4所示的电路,参考图7-5插入元件。2、用FREQOUT命令测试红外发射探测器

FREQOUT命令主要是用来合成音频。它的实际范围是1到32768Hz。数字音调合成的一个有趣的现象是它包括被称为和声的信号,和声是混在你听到的音调里的更高频率的音调。这种音调人不能辨别,人只能辨别频率范围从20Hz到20kHz的音调。由FREQOUT命令产生的和声从32769Hz开始直到更高。你可以用高于32768Hz的参数Freq1直接控制和声。本任务中,你要用命令FREQOUT8,1,38500向P8发送持续1秒的38.5kHz和声,连接P8的红外LED电路将发送和声。如果红外光被小车路径上的物体反射回来,红外检测器将给BASICStamp发送一个信号,让它知道已经检测到反射回的红外光。

让每个IRLED探测器组工作的关键是发送1ms频率为38.5kHz的和声信号,然后,立刻将IR探测器的输出存储到一个变量中。下面是一个例子,它发送38.5kHz信号给连接到P8的IR探测器,然后用位变量irDetectLeft存储连接到P9的IR探测器的输出,。

FREQOUT8,1,38500irDetectLeft=IN9

当没有IR信号返回时,探测器的输出状态为高。当它探测到被物体反射的38500Hz和声时,它的输出为低。当FREQOUT命令发送和声后,IR探测器的输出处于低状态不到1毫秒,因此当发送完FREQOUT命令后立即将IR探测器的输出存储到变量中是很重要的。这些存储的值会显示在调试终端或被机器人用来导航。

示例程序:TestLeftIrPair.bs2

'RoboticswiththeBoe-Bot-TestLeftIrPair.bs2'TestIRobjectdetectioncircuits,IRLEDconnectedtoP8anddetectorconnectedtoP9.'{$STAMPBS2}'{$PBASIC2.5}irDetectLeftVARBitDOFREQOUT8,1,38500irDetectLeft=IN9DEBUGHOME,"irDetectLeft=",BIN1irDetectLeftPAUSE100LOOP

保持Boe-Bot机器人与串口电缆的连接,因为你将用调式终端来测试你的IR组。①放一个物体,比如手或一张纸,距离左侧IR组大约1英寸,参考图7-1。②验证当你放一个物体在IR组前时,调试终端是否会显示0,当你将物体移开时,它是否显示1。③如果调试终端显示的是预料的值,没发现物体显示1,发现物体显示0,转到示例程序后的给你了部分。

排错分析:如果调试终端显示的不是预料的值,按以下步骤排错:

⑴如果调试终端显示的不是预料的值,检查电路和输入的程序。⑵如果你总是得到0,甚至当没有物体在Boe-Bot前面时也是0,可能是附近的物体反射了红外线。Boe-Bot小车前面的桌面是常见的始作俑者。移动小车,使IRLED和探测器不可能受附近物体的影响。⑶如果Boe-Bot前面没有物体时绝大多数时间读数是1,但是偶尔是0,这可能是附近的荧光灯的干扰。关掉附近的荧光灯,重新测试该你了

①将程序TestLeftIrPair.bs2另存为TestRightIrPair.bs2。②更改DEBUG声明,名称和注释使适合于右侧IR组。③将变量名irDetectLeft改为irDetectRight,程序中有四处需要更改。④将命令FREQOUT的Pin由8改为2。⑤将变量irDetectRight监控的输入寄存器由IN9改为IN0。重复本任务中前面的测试步骤,将IRLED连接到P2,检测器连接到P0。二、物体检测和红外干涉的实地测试我们将制作并测试LED指示器,它将告诉你是否检测到物体,而不需要调试终端的帮助。许多荧光灯发射的信号象你的IRLED发射的信号。荧光灯内部控制电压的部件叫镇流器。许多镇流器和你的IR探测器的工作在相同的频率范围,38.5kHz左右,这就会导致荧光灯发射同样频率的信号。所以当我们用集成的红外线探测器导航时,这些干扰能导致许多奇异的Boe-Bot车行为!1、重新搭建LED指示电路

这里用到的是和前面“胡须”中用到的同样的LED指示器。元件清单:红色LEDs、220Ω电阻(红-红-棕)断开主板和伺服系统的电源,参考图7−7,建立图7−6所示电路2、测试系统本系统包括许多元件,这就增加了接线错误的可能性。因此有一个测试程序是很重要的。测试程序告诉你红外检测器检测到什么。从串口电缆上拔掉机器人测试其它障碍物体之前,你可以用这个程序来验证所有的电路是否正常工作。示例程序――TestIrPairsAndIndicators.bs2⑴接通主板的电源。⑵输入、保存并运行程序TestIrPairsAndIndicators.bs2。验证当调试终端显示“Testingpiezospeaker…”时,扬声器是否发出清晰的声音。用调试终端来验证当放一个物体在检测器前面时,BASICStamp是否仍然从每个IR检测器发出收到信号0。验证当检测器检测到物体时,每个检测器旁的LED是否会发光。如果一个或两个LED不能工作,检查接线和程序。'RoboticswiththeBoe-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论