实验四触须避障导航光敏电阻导航Word下载.docx
《实验四触须避障导航光敏电阻导航Word下载.docx》由会员分享,可在线阅读,更多相关《实验四触须避障导航光敏电阻导航Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
在这种情况下,Boe-Bot通过用一个触须或两个触须碰到障碍物来判断是否碰到了障碍物。
一旦触须探测到了障碍物,通过导航程序和子程序将使Boe-Bot后退并转弯。
然后,Boe-Bot继续前进直至它遇到下一个障碍物为止。
五、实验步骤
1.安装触须传感器
2.添加触须电路
3.利用Debug窗口测试触须
BASICStamp可以通过编程以检测触须是否受压。
连接至每个触须电路的I/O引脚会监测插入的10kΩ电阻的电压。
当给定的触须未受压时,连接至触须的I/O引脚的电压是5V。
而当触须受受压时,I/O引线被短路接地(Vss),所以I/O引线的电压看起来是0V。
每次PBASIC程序启动时,所有的I/O引脚会默认等待输入。
这意味着连接至触须的I/O引脚将执行自动输入的功能。
作为输入,连接至触须电路的一个引脚会利用它的输入寄存器存储在电压为5V的时候存储一个值1(触须未受压),或在电压为0V的时候存储一个值0(触须受压)。
Debug窗口可用来显示这些值。
下面的示例程序设计用于测试触须电路的功能是否正常。
通过显示存储于P7和输入寄存器(IN7和IN5)中的二进制数,程序会为你显示BASICStamp是否已经接触到触须。
当存储于给定的输入寄存器的值为1时,说明触须没有受压。
如果值是0,说明触须已经受压。
操作步骤:
(1)连接电路板、伺服至电源。
(2)输入、运行并保存程序TestWhiskers.bs2。
(3)该程序将使用到DebugTerminal窗口,所以在程序运行时请保持串口线与BASICStamp的连接。
示例程序如下:
‘程序TestWhiskers.bs2
DEBUG"
WHISKERSTATES"
CR,
"
LeftRight"
------------"
DO
DEBUGCRSRXY,0,3,‘格式化命令,负责把指针放在Debug窗口的第0列第3行
P5="
BIN1IN5,
P7="
BIN1IN7
PAUSE50
LOOP
4.利用LED测试触须
‘程序TestWhiskersWithLeds.bs2
IF(IN7=0)THEN‘此语句用于做出选择,
HIGH1‘触须受压,设置P1为高,LED亮
ELSE
LOW1‘触须未受压,设置P1为低,LED不亮
ENDIF
IF(IN5=0)THEN
HIGH10
LOW10
通过轻轻地按下触须来测试程序。
每个触须接触到3引脚插头时,LED都会发光。
5.使用触须进行导航
可利用BASICStamp编程来检测给定的触须是否受压,并借助这些信息编程,为Boe-Bot导航。
当Boe-Bot左右摇摆或有一个触须受压时,这意味着Boe-Bot已经撞到了一些东西。
导航程序需要利用这个作为输入,判断这是什么意思,并调用一套动作,使Boe-Bot避开障碍物,转弯并沿另一个方向行进。
下面的示例程序使Boe-Bot一直前进,直到遇到障碍物,根据触须输入做出判断,然后调用子程序使Boe-Bot做出反应。
示例程序:
‘程序RoamingWithWhiskers.bs2
ProgramRunning!
‘定义变量
pulseCountVARByte'
FOR...NEXTloopcounter.
‘初始化
FREQOUT4,2000,3000'
Signalprogramstart/reset.
‘主程序
IF(IN5=0)AND(IN7=0)THEN'
Bothwhiskersdetectobstacle
GOSUBBack_Up'
Backup&
U-turn(lefttwice)
GOSUBTurn_Left
ELSEIF(IN5=0)THEN'
Leftwhiskercontacts
turnright
GOSUBTurn_Right
ELSEIF(IN7=0)THEN'
Rightwhiskercontacts
turnleft
ELSE'
Bothwhiskers=1,nocontacts
GOSUBForward_Pulse'
Applyaforwardpulse
‘子程序
Forward_Pulse:
'
forwardpulse.
PULSOUT13,850
PULSOUT12,650
PAUSE20
RETURN
Turn_Left:
Leftturn,about90-degrees.
FORpulseCount=0TO20
PULSOUT13,650
PULSOUT12,650
NEXT
Turn_Right:
FORpulseCount=0TO20'
Rightturn,about90-degrees.
PULSOUT13,850
PULSOUT12,850
Back_Up:
Backup
FORpulseCount=0TO40
6.被卡后的判断
Boe-Bot会卡在墙角里而动弹不了。
当Boe-Bot进入墙角里以后,它的触须会碰到左侧的墙壁,所以它会向右转弯,而当Boe-Bot再次前进的时候,它的右触须会碰到右侧的墙壁,所以它会向左转弯,结果再次碰到左侧的墙壁,再次转弯后又会碰到右侧的墙壁,这样不断反复而卡住。
通过修改程序来探测这个问题并作出反应。
窍门在于数出触须轮流接触的次数。
该窍门的要点是程序必须能够记住上次接触时每个触须的状态。
它会拿触须过去的状态和当前的状态相比较。
如果它们是相反的,那么次数就加上1。
如果累加后的次数超过了编程者定义的极限,那么,是时候执行U-turn动作并重新为触须接触次数计数了。
‘程序EscapingCorners.bs2
DEBUG"
FOR...NEXTloopcounter.
counterVARNib'
Countsalternatecontacts.
old7VARBit'
StorespreviousIN7.
old5VARBit'
StorespreviousIN5.
FREQOUT4,2000,3000'
Signalprogramstart/reset.
counter=1'
Startalternatecornercount.
old7=0'
Makeupoldvalues.
old5=1
IF(IN7<
>
IN5)THEN'
Oneorotherispressed.
IF(old7<
IN7)AND(old5<
Differentfromprevious.
counter=counter+1'
Alternatewhiskercount+1.
old7=IN7'
Recordthiswhiskerpress
old5=IN5'
fornextcomparison.
IF(counter>
4)THEN'
Ifalternatewhiskercount=4,
resetwhiskercounter
andexecuteaU-turn.
ENDIF'
ENDIFcounter>
4.
ELSE(old7=IN7)or(old5=IN5),
notalternate,resetcounter.
ENDIF(old7<
IN7)and'
(old5<
IN5).
ENDIF(IN7<
IF(IN5=0)AND(IN7=0)THEN'
Bothwhiskersdetectobstacle
Backup&
U-turn(lefttwice)
ELSEIF(IN5=0)THEN'
Leftwhiskercontacts
ELSEIF(IN7=0)THEN'
Rightwhiskercontacts
Bothwhiskers=1,nocontacts
Applyaforwardpulse
forwardpulse.
Leftturn,about90-degrees.
FORpulseCount=0TO20
PULSOUT13,650
FORpulseCount=0TO20'
Rightturn,about90-degrees.
PULSOUT12,850
Backup.
FORpulseCount=0TO40
六、思考题
1.触须受压后,I/O引脚上监测到的电压是多少?
输入寄存器将存储的二进制数值是多少?
如果I/O引脚P8用来作为输入引脚,当触须受压后,IN8的值会是多少,如果触须没有受压,它的值又会是多少?
触须受压后,I/O引脚上监测到的电压是0V,输入寄存器将存储的二进制数值是0。
如果I/O引脚P8用来作为输入引脚,当触须受压后,IN8的值是0,如果触须没有受压,它的值是1。
2.什么命令可以用于根据不同的变量的值跳至不同的子程序?
什么命令可以用于决定跳至某个子程序?
这些判断取决于什么?
条件语句可以用于根据不同的变量的值跳至不同的子程序,GOSUB命令用于决定跳至某个子程序。
这些判断取决于条件语句中变量的值。
3.修改程序RoamingWithWhiskers.bs2,使Boe-Bot在执行避障动作之前发出100ms的4KHz的频响。
使它发出两次频响,如果在同一个试验中两个触须同时探测到受压的话。
HIGH4
LOW4
4.修改程序RoamingWithWhiskers.bs2,使Boe-Bot在直径为1米的范围内漫游。
当你触碰其中一个触须时,它可以使Boe-Bot沿一个小圆圈(直径略小)内行走,而当你同时触碰两个触须时,它可以沿一个更大直径的圆圈行走。
GOSUBBig_Circle
GOSUBSmall_Circle
GOSUBSmall_Circle
Big_Cirlce:
PULSOUT13,730
PULSOUT12,790
Small_Cirlce:
PULSOUT12,810
II.光敏电阻导航
利用光敏电阻的特性,测量光强度的差异,并编程控制机器人小车根据光强度的差异做出行动。
Boe-Bot小车、光敏电阻、电阻(2kΩ、220Ω、1kΩ、4.7kΩ)、电容(0.01uF)、导线、手电筒等。
注意:
电阻–2kΩ(红-黑-红)
电阻–220Ω(红-红-棕)
电阻–1kΩ(棕-黑-红)
电阻–4.7kΩ(黄-紫-红)
电容–0.01μF(103)
1.连接并测试光敏电阻电路
2.编程使Boe-Bot小车漫游并避开阴影目标,或用阴影导航
3.用光敏电阻测试RC放电延时
4.用手电筒光束引导机器人小车运动
光敏电阻(硫化镉)的阻值与光照度成反比关系,即黑暗导致高阻值,明亮导致低阻值。
利用光敏电阻作为光传感器,通过检测不同的光强度,可以识别白与黑边沿、报告明亮和黑暗程度、搜寻光源等。
连接光敏电阻传感器测试电路,并与电阻相连构成电压分压器,编程监测光敏电阻与固定阻值电阻连接点的电压。
BasicStampI/O引脚的极限电压为1.4v,当电压下降或上升至1.4v时,极限电压连接电路的I/O引脚的输入寄存器就会存储一个0或1。
根据这些二进制数值进行判断,为Boe-Bot小车导航。
1.连接并测试光敏电阻电路
连接光敏电阻电路
使用不同的电压分压器进行试验
每次修改电路前要先断开电路板与电源的连接。
用其它电阻逐一代替2kΩ的电阻:
1kΩ、4.7kΩ。
利用程序测试各分压器组合,并判断在现有光照条件下,哪个电阻工作性能最好。
性能最好的组合是那个既没有过渡感应,也无须你用手遮住光敏电阻时使用的那个电阻组合。
探测阴影
被阴影遮住会增大光敏电阻的阻值,导致的Vo值变小。
连接电路板至电源。
输入、运行程序TestPhotoresistor.bs2。
验证在没有阴影时,IN6和IN3的值都为1,用手遮住某个光敏电阻,相应的存贮值由1变为0。
‘程序TestPhotoresistor.bs2
PHOTORESISTORSTATES"
---------------"
DEBUGCRSRXY,0,3,
P6="
BIN1IN6,
P3="
BIN1IN3
PAUSE100
2.漫游及避开阴影目标,或用阴影引导小车运动
漫游及避开阴影目标
观察Boe-Bot在没有阴影、右边的光敏电阻分压器(连接至P3的电路)被阴影遮住、左边的光敏电阻分压器(连接至P6的电路)、以及两个光敏电阻分压器一齐被阴影遮住时的反应。
‘程序RoamingwithPhotoresistor.bs2
'
变量
pulseCountVARByte
初始化
FREQOUT4,2000,3000
主程序
IF(IN6=0)AND(IN3=0)THEN'
Bothphotoresistorsdetects
shadow,backup&
U-turn
GOSUBTurn_Left'
(lefttwice).
ELSEIF(IN6=0)THEN'
Leftphotoresistordetects
turnright.
ELSEIF(IN3=0)THEN'
Rightphotoresistordetects
turnleft.
Neitherphotoresistordetects
GOSUBFor