機(jī)器人技術(shù)與實(shí)踐第五章:Boe-Bot 機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航_第1頁(yè)
機(jī)器人技術(shù)與實(shí)踐第五章:Boe-Bot 機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航_第2頁(yè)
機(jī)器人技術(shù)與實(shí)踐第五章:Boe-Bot 機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航_第3頁(yè)
機(jī)器人技術(shù)與實(shí)踐第五章:Boe-Bot 機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航_第4頁(yè)
機(jī)器人技術(shù)與實(shí)踐第五章:Boe-Bot 機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章Boe-Bot機(jī)器人光敏電阻導(dǎo)航與紅外線導(dǎo)航第一節(jié)Boe-Bot機(jī)器人光敏電阻導(dǎo)航

Boe-Bot集成套件中的光傳感器可以探測(cè)可見(jiàn)光,并且可以檢測(cè)不同的光亮度水平。這樣,可以編程使Boe-Bot識(shí)別周圍環(huán)境明或暗的范圍,報(bào)告探測(cè)到的亮暗水平,并且可以尋找手電筒光束和從門口射進(jìn)黑暗的屋子的光這樣的光源。

光敏電阻也是電阻,它是一種其電阻值可以依賴于光強(qiáng)的光傳感器,其電阻值由光的強(qiáng)弱決定(LDRLightDependentResistor)。圖6-1是光敏電阻的示意圖和元件圖,我們可以用光敏電阻讓Boe-Bot檢測(cè)不同的光亮度水平一、搭建和測(cè)試光敏電阻電路

1、用光敏電阻來(lái)搭建并測(cè)試光的亮度感應(yīng)電路。光的亮度感應(yīng)電路能夠探測(cè)出陰影和非陰影的區(qū)別。判斷陰影是否覆蓋光敏電阻的PBASIC命令和用來(lái)判斷胡須是否碰到物體的命令是非常相似的元件清單:光敏電阻、2kΩ電阻(紅-黑-紅)、220Ω電阻(紅-紅-棕)、跳線、470Ω電阻–(黃-紫-棕)、1kΩ電阻–(棕-黑-紅)、4.7kΩ電阻–(黃-紫-紅)、10kΩ電阻–(棕-黑-橙)我們按上圖搭建光敏電阻探測(cè)電路的接線2、光敏探測(cè)電路的工作原理

BASICStamp的I/O口可以作為輸入或輸出口,當(dāng)作為輸出口時(shí),I/O口會(huì)送出高電平(5V)或低電平(0V)信號(hào),前面學(xué)過(guò),這些信號(hào)已經(jīng)被用來(lái)控制LED燈的開(kāi)或關(guān),控制伺服電機(jī)和送音調(diào)給揚(yáng)聲器。

BASICStamp的I/O口也可以作為輸入口。當(dāng)作為輸入口時(shí),I/O口不會(huì)供給電壓給與其連接的電路,相反的,它只是靜靜的監(jiān)視電路狀態(tài),不會(huì)對(duì)電路有任何影響。在前面的章節(jié)中,輸入寄存器已經(jīng)存儲(chǔ)了指示胡須是否被按下的值。例如:當(dāng)檢測(cè)到5V電壓(胡須沒(méi)有被按下)時(shí),IN7輸入寄存器存儲(chǔ)1;當(dāng)檢測(cè)到0V電壓(胡須被按下)時(shí),寄存器存儲(chǔ)0。設(shè)定為輸入的I/O口實(shí)際上不是需要5V來(lái)使其輸入寄存器的值為1,任何大于1.4V的電壓都會(huì)使其寄存器的值為1。同樣的,I/O口也不是需要0V來(lái)使其輸入寄存器的值為0,任何小于1.4V的電壓都會(huì)使其寄存器的值為0。

當(dāng)BASICStamp的I/O口是輸入口時(shí),電路表現(xiàn)即不是I/O口也不是220Ω電阻,圖示是其等效電路。光敏電阻用字母R來(lái)表示。如果光特別亮,電阻值非常小,如果是在完全黑暗的環(huán)境中,電阻值接近50kΩ。在一個(gè)帶熒光天花板的光線好的屋子里,電阻值可能小到1kΩ(光線沒(méi)有任何遮擋)或大到25kΩ(陰影遮住了光敏電阻)。由于光敏電阻的阻值隨著光照的強(qiáng)弱而改變,用Vo來(lái)表示電壓,當(dāng)R增大時(shí),Vo會(huì)減??;當(dāng)R減小時(shí),Vo會(huì)增大。Vo是當(dāng)BASICStamp的I/O口作為輸入口時(shí)它檢測(cè)到的電壓。如果電路連接到IN6,當(dāng)Vo的值大于1.4V時(shí),IN6寄存器存儲(chǔ)1,當(dāng)Vo的值小于1.4V時(shí),IN6存儲(chǔ)值0。

分壓電路:

Vo

=2000/(2000+R)X5V3、探測(cè)陰影陰影使光敏電阻的電阻值R增大,相應(yīng)的使電壓Vo減小。在一個(gè)燈光比較好的屋子里,2kΩ電阻使Vo的值剛好大于1.4V。如果用手投一個(gè)陰影,Vo會(huì)小于臨界值1.4V。在一個(gè)燈光比較好的屋子里,IN6和IN3都會(huì)存儲(chǔ)1,如果在連接到P6的分壓器的光敏電阻上投一個(gè)陰影,IN6的值變?yōu)?。同樣的,如果在連接到P3的分壓器的光敏電阻上投一個(gè)陰影,IN3的值變?yōu)?。

示例程序:TestPhotoresistorsDividers.bs2

這個(gè)例子是適用于光敏電阻分壓器的程序。就像胡須導(dǎo)航監(jiān)測(cè)P5和P7一樣,我們現(xiàn)在監(jiān)測(cè)連接到光敏電阻分壓器的P3和P6。在一個(gè)光線比較好的屋子里,程序在兩邊都顯示1。當(dāng)用手在一個(gè)或兩個(gè)光敏電阻上投一個(gè)陰影時(shí),它們所對(duì)應(yīng)的值變?yōu)?。

'RoboticswiththeBoe-Bot-TestPhotoresistorDividers.bs2'DisplaywhattheI/Opinsconnectedtothephotoresistor'voltagedividerssense.'{$STAMPBS2}'{$PBASIC2.5}DEBUG"PHOTORESISTORSTATES",CR,"LeftRight",CR,"---------------"DODEBUGCRSRXY,0,3,"P6=",BIN1IN6,"P3=",BIN1IN3PAUSE100LOOP光敏電阻分壓器排錯(cuò)檢查:⑴一般性驗(yàn)證:①檢查你的接線和程序。②確保每個(gè)元件牢固的插在插座里。③檢查你的電阻顏色。連接VSS和光敏電阻的電阻阻值是2kΩ(紅-黑-紅)。連接P6和P3到光敏電阻的阻值是220Ω(紅-紅-棕)。⑵如果無(wú)論你是否投一個(gè)陰影,輸入寄存器的值IN3或者IN6的值為0:⑶如果房間微暗,建議增加燈。也可以把2kΩ電阻換成4.7kΩ電阻(黃-紫-紅)。這將給你的電阻在較低光亮環(huán)境下分得高的電壓。在光線相當(dāng)暗的情況下,你甚至可以用10kΩ電阻(棕-黑-紅)。⑷如果無(wú)論你是否投一個(gè)陰影,輸入寄存器的值IN3或者IN6的值為1:如果相當(dāng)亮,你發(fā)現(xiàn)你必須把手捂住光敏電阻的采光面來(lái)讓寄存器從1變?yōu)?,你可以用低阻值的電阻替代2kΩ電阻。試試1kΩ電阻(棕-黑-紅),如果在室外試試470Ω電阻(黃-紫-棕)該你了――

實(shí)驗(yàn)不同的電壓分壓器依據(jù)你的機(jī)器人周圍的環(huán)境,選用較大或較小的電阻代替2kΩ的電阻可能會(huì)提高陰影探測(cè)器的性能。記住每次修改電路時(shí)斷開(kāi)連接主板的電源。試著用你收集的電阻470Ω,1kΩ,4.7kΩ,10kΩ來(lái)代替2kΩ的電阻。用程序TestPhotoresistorDividers.bs2測(cè)試每個(gè)電壓分壓器的組合,決定哪個(gè)電阻最適合你周圍的環(huán)境,最好的組合是既不會(huì)過(guò)度敏感,又不需要你用手捂住光敏電阻。在下面兩節(jié)中使用你覺(jué)得工作最好的電阻組合。二、行走和躲避陰影由于光敏電阻分壓器表現(xiàn)類似于前面的胡須,因而值得檢查程序RoamingWithWhiskers.bs2中哪些功能適用于光敏電阻分壓器。修改程序RoamingWithWhiskers.bs2使其適用于光敏電阻分壓器,調(diào)整IF…THEN聲明使其監(jiān)測(cè)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打開(kāi)程序RoamingWithWhiskers.bs2,另存為RoamingWithPhotoresistorDividers.bs2.如上圖所示,修改程序。驗(yàn)證當(dāng)用手在光敏電阻上投一個(gè)陰影時(shí),Boe-Bot機(jī)器人是否避開(kāi)陰影。試驗(yàn)無(wú)陰影,遮住右邊的光敏電阻(連接P3的電路),遮住左邊的光敏電阻(連接P7的電路),同時(shí)遮住兩個(gè)光敏電阻。修改注釋部分比如名稱、胡須觸動(dòng)等,使注釋符合光敏電阻器分配器的行為。你修改完后,這些注釋應(yīng)該與下面的程序類似。'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

我們可以通過(guò)把一些子程序改成調(diào)用注釋來(lái)提高Boe-Bot機(jī)器人的性能。這些子程序幫助機(jī)器人在遇到障礙物時(shí)后退并躲避障礙物的子程序。圖6-6是當(dāng)兩個(gè)光敏電阻都探測(cè)到陰影時(shí),IF…THEN聲明中兩個(gè)Turn_Left子程序調(diào)用被注釋的例子。當(dāng)只有一個(gè)光敏電阻探測(cè)到陰影時(shí),Back_Up子程序調(diào)用被注釋,使Boe-Bot機(jī)器人僅僅旋轉(zhuǎn)來(lái)響應(yīng)探測(cè)到的陰影。'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,比較性能

三、更易于響應(yīng)陰影控制的BOE-BOT

通過(guò)去掉導(dǎo)航子程序中的FOR…NEXT循環(huán),可以使機(jī)器人響應(yīng)更迅速。這對(duì)觸須來(lái)說(shuō)是不可能的,因?yàn)锽oe-Bot機(jī)器人已經(jīng)物理接觸到物體,在轉(zhuǎn)向之前必須后退。當(dāng)用陰影來(lái)引導(dǎo)Boe-Bot時(shí),無(wú)論Boe-Bot在向前移動(dòng)或者做機(jī)動(dòng)動(dòng)作,它都會(huì)在每個(gè)脈沖之間探測(cè)是否仍有陰影。我們可以讓機(jī)器人處在光線正常的情況下靜止,然后使它跟隨你的遮住光敏電阻的陰影行走。這是引導(dǎo)Boe-Bot運(yùn)動(dòng)的一種易于掌握的方法。程序示例:如果沒(méi)有陰影遮住光敏電阻,Boe-Bot機(jī)器人會(huì)靜止不動(dòng),當(dāng)同時(shí)遮住兩個(gè)光敏電阻時(shí),Boe-Bot機(jī)器人會(huì)向前移動(dòng),當(dāng)只遮住一個(gè)光敏電阻時(shí),機(jī)器人會(huì)向探測(cè)到陰影的光敏電阻一側(cè)轉(zhuǎn)動(dòng)。

'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循環(huán)中的IF…THEN聲明判斷四個(gè)可能的陰影條件中的一個(gè):兩個(gè)都探測(cè)陰影,左側(cè)探測(cè)陰影,右側(cè)探測(cè)陰影,都沒(méi)探測(cè)陰影。依據(jù)探測(cè)的陰影條件,PULSOUT命令給下面的其中一個(gè)動(dòng)作發(fā)出脈沖:向前,右轉(zhuǎn),左轉(zhuǎn),靜止。無(wú)論陰影條件如何,在DO…LOOP循環(huán)中四組脈沖中的一個(gè)每次都會(huì)發(fā)送。在IF…THEN聲明之后,記住要執(zhí)行PAUSE20來(lái)保證每對(duì)伺服脈沖之間的低電平。四、更為簡(jiǎn)便的光敏電阻電路測(cè)試

BASICStamp能夠從光敏電阻電路得到的僅有的信息是光的強(qiáng)度高于還是低于閥值。本任務(wù)將介紹一個(gè)不同的電路,BASICStamp能夠通過(guò)電路監(jiān)測(cè)并收集足夠的信息以確定相對(duì)光強(qiáng)。BASICStamp從電路得到的值范圍從小到大,小的表明光比較強(qiáng),大的表明光比較弱。這就意味著基于不同光強(qiáng)可以調(diào)整程序來(lái)尋找不同范圍的值,而不是用手工替換不同阻值的電阻。1、電容器介紹電容是存儲(chǔ)電荷的器件,其單位為法拉,我們這里所使用的電容存儲(chǔ)的電荷量是百萬(wàn)分之幾法拉。1法拉的百萬(wàn)分之一叫做微法,用μF表示。這里用的電容是0.01μF。圖6-7所示是0.01μF電容的示意圖和Boe-Bot機(jī)器人元件中所用電容的零件圖,電容上的103表示它的值。圖:電容的示意圖和零件圖2、重新搭建感光眼元件清單:光敏電阻(CDS)、0.01μF(103)電容、220Ω電阻(紅-紅-棕)、跳線

BASICStamp能夠用來(lái)決定光強(qiáng)度的電路叫做阻容電路(RC),圖示是Boe-Bot機(jī)器人的RC光探測(cè)電路原理圖,斷開(kāi)連接主板和伺服電機(jī)的電源,搭建如圖所示的RC電路。

3、RC電路原理上述電路中的電容看作一個(gè)微小的可充電電池。當(dāng)P6發(fā)送一個(gè)高電平信號(hào)時(shí),實(shí)質(zhì)上是用5V加在電容上給它充電。幾毫秒后,電容的電壓幾乎達(dá)到5V。如果BASICStamp程序改變I/O端口使端口僅僅監(jiān)測(cè)電壓,電容就通過(guò)光敏電阻放電。由于電容通過(guò)光敏電阻放電,電壓衰減,隨著電荷流失,電壓越來(lái)越低。IN6感測(cè)到電壓降到1.4V所用的時(shí)間取決于光敏電阻阻止電容提供的電流流動(dòng)的能力大小。如果由于外界光線比較弱,光敏電阻的阻抗值大,電容就需要更長(zhǎng)的時(shí)間放電。如果外界光線非常強(qiáng),光敏電阻的阻抗值小,它阻止電流的能力很弱,電容就會(huì)很快失去電荷。4、用BASICStamp測(cè)量RC衰減時(shí)間可以編程使BASICStamp給電容充電然后測(cè)量電容電壓衰減到1.4V所用的時(shí)間。測(cè)量的衰減時(shí)間可以用來(lái)表征光敏電阻的電阻。阻抗表示光敏電阻探測(cè)到的光的強(qiáng)弱。這個(gè)測(cè)量需要聯(lián)合HIGH和PAUSE命令以及新命令RCTIME。RCTIME命令用來(lái)測(cè)量如圖6-10所示的電路的RC衰減時(shí)間,下面是此命令的語(yǔ)法:

RCTIMEPin,State,Duration

參數(shù)Pin是你要測(cè)量的I/O端口值。例如,如果你要測(cè)量P6,參數(shù)Pin應(yīng)該是6。參數(shù)State可以是1也可以是0。如果通過(guò)電容兩端的電壓從高于1.4V向下衰減,參數(shù)State應(yīng)是1,如果電容兩端的電壓從小于1.4V向上增加,參數(shù)State應(yīng)是0。圖6-10所示的電路中,電容兩端的電壓從接近5V衰減到1.4V,因而State應(yīng)該是1。Duration是存儲(chǔ)測(cè)量的時(shí)間的變量,其單位是2μs,在下一個(gè)示例程序中,我們將測(cè)量連接到P6的光敏電阻電路的RC衰減時(shí)間,這只光敏電阻在Boe-Bot機(jī)器人左側(cè)。測(cè)量RC衰減時(shí)間之前,要做的第一件事是確保已經(jīng)定義一個(gè)存儲(chǔ)測(cè)量時(shí)間的變量。timeLeftVARWord

下面三行代碼是給電容充電,測(cè)量RC衰減時(shí)間并存儲(chǔ)在timeLeft變量中

HIGH6PAUSE3RCTIME6,1,timeLeft代碼執(zhí)行分下面三步:1.連接電路到5V來(lái)給電容充電。2.在RC電路中,用PAUSE命令給HIGH命令足夠的時(shí)間給電容充電。3.執(zhí)行RCTIME命令,它設(shè)置I/O口為輸入,測(cè)量衰減時(shí)間并存儲(chǔ)在timeLeft變量中。

程序示例:投一個(gè)陰影在連接到P6的光敏電阻上,驗(yàn)證隨著外界光線逐漸變黑,時(shí)間是否增大。將光敏電阻的采光面指向一個(gè)光源或用手電筒照射它,測(cè)量的時(shí)間應(yīng)該是非常小。當(dāng)逐漸將光敏電阻的采光面偏離光源,測(cè)量值會(huì)增大。如果投一個(gè)陰影或關(guān)掉光源,測(cè)量值會(huì)更大。

'RoboticswiththeBoe-Bot-TestP6Photoresistor.bs2'TestBoe-Botphotoresistorcircuitconnectedtop6anddisplaythedecaytime.'{$STAMPBS2}'{$PBASIC2.5}DOHIGH6PAUSE2RDTIME6,1,timeLeftDEBUGHOME,"timeleft=',DEC5TIMELEFTPAUSE100LOOP五、手電筒光束引導(dǎo)BOE-BOT

測(cè)試和校正Boe-Bot機(jī)器人的光傳感器,使它能夠識(shí)別環(huán)境光和手電筒光束。編程使機(jī)器人跟隨指向它前方表面的手電筒光束行走。如果光敏電阻的采光面指向Boe-Bot機(jī)器人前面5.1cm處,任務(wù)會(huì)完成的最好,光敏電阻的采光面指向Boe-Bot機(jī)器人前面。編程使機(jī)器人朝著手電筒光束運(yùn)動(dòng)之前,我們必須知道機(jī)器人前方有無(wú)手電筒光束時(shí)讀出的時(shí)間的區(qū)別。,按照下表完成有無(wú)手電筒光束的時(shí)間測(cè)量值。

'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跟隨手電筒光束在此之前,我們已經(jīng)使用了變量聲明。例如:counterVARNib在BASICStamp的RAM中分配給counter一個(gè)特殊的內(nèi)存位置。當(dāng)定義了這個(gè)變量之后,每次在PBASIC程序中使用它,都是使用了BASICStamp的RAM中特殊位置所存儲(chǔ)的值。我們也可以聲明常量。換句話說(shuō),如果計(jì)劃在程序中使用一個(gè)數(shù),給它一個(gè)有用的名字。不是用VAR,而是用CON來(lái)聲明常量,這是下面示例程序中的一些CON指令:

LeftAmbientCON108RightAmbientCON114LeftBrightCON20RightBrightCON22

現(xiàn)在,程序在任何地方使用LeftAmbient,BASICStamp將會(huì)使用108。每次使用RightAmbient,BASICStamp就會(huì)使用114,同樣的,無(wú)論LeftBright出現(xiàn)在程序的任何地方,它的實(shí)際值是20,RightBright的實(shí)際值是22。在運(yùn)行程序之前,將用表6-1的值代替。常量也被用來(lái)計(jì)算其它的常量。這里是有關(guān)兩個(gè)常量的例子,它們是LeftThreshold和RightThreshold,是由剛才所說(shuō)的四個(gè)常量計(jì)算而來(lái)的。LeftThreshold和RightThreshold在程序中用來(lái)計(jì)算出手電筒光束是否被探測(cè)到。

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

這些常量所進(jìn)行的數(shù)學(xué)計(jì)算是取平均值,然后是取比例。LeftThreshold的平均值是LeftBright+LeftAmbient/2,結(jié)果再乘以5并除以8。意思是,LeftThreshold是一個(gè)常量,它的值是LeftBright和LeftAmbient的平均值的5/8。示例程序:FlashlightControlledBoeBot.bs2①用表6-1沒(méi)有手電筒光束的timeLeft測(cè)量值代替LeftAmbientCON指令中的108。②用沒(méi)有手電筒光束的timeRight測(cè)量值代替RightAmbientCON操作符中的114。③用有手電筒光束的timeLeft測(cè)量值代替LeftBrightCON操作符中的20。④用有手電筒光束的timeRight測(cè)量值代替RightBrightCON操作符中的22。打開(kāi)主板和伺服電機(jī)的電源。保存然后運(yùn)行程序FlashlightControlledBoeBot.bs2。試驗(yàn)并計(jì)算將光束聚集在哪里可以使機(jī)器人向前走,左轉(zhuǎn),右轉(zhuǎn),用光束引導(dǎo)機(jī)器人穿過(guò)不同的障礙物。'-----[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的值聲明的四個(gè)常量。

LeftAmbientCON108RightAmbientCON114LeftBrightCON20RightBrightCON22

現(xiàn)在這四個(gè)變量已經(jīng)被聲明,下面兩行取平均值并乘以一個(gè)比例系數(shù)得到了程序所需的閥值,可以比較閥值和timeLeft以及timeRight的測(cè)量值來(lái)判斷光敏電阻感應(yīng)的是環(huán)境光還是聚焦光束。

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

下面這些變量用來(lái)存儲(chǔ)RCTIME測(cè)量結(jié)果。

timeLeftVARWordtimeRightVARWord

這是本文中許多程序都用到的復(fù)位指示器。

FREQOUT4,2000,3000

主程序中包含兩個(gè)子程序調(diào)用。所有實(shí)際的工作集中在兩個(gè)子程序上,子程序Test_Photoresistors對(duì)兩個(gè)RC光敏電阻電路進(jìn)行RCTIME測(cè)量,Navigate判斷并發(fā)送伺服電機(jī)控制脈沖。

DOGOSUBTest_PhotoresistorsGOSUBNavigateLOOP

這是對(duì)兩個(gè)光敏電阻電路進(jìn)行RCTIME測(cè)量的子程序,左側(cè)電路的測(cè)量結(jié)果存儲(chǔ)在timeLeft變量中,右側(cè)電路的測(cè)量結(jié)果存儲(chǔ)在timeRight變量中。

Test_Photoresistors:HIGH6PAUSE3RCTIME6,1,timeLeftHIGH3PAUSE3RCTIME3,1,timeRightRETURN

Navigate子程序使用IF…THEN來(lái)比較變量timeLeft和常量LeftThreshold,timeRight和RightThreshold。記住,當(dāng)RCTIME測(cè)量值小時(shí),意味著探測(cè)到強(qiáng)光,當(dāng)此值大時(shí),意味著光不強(qiáng)。因此,當(dāng)存儲(chǔ)RCTIME測(cè)量結(jié)果的變量小于閥值時(shí),意味著探測(cè)到手電筒光束,否則,沒(méi)有探測(cè)到手電筒光束。根據(jù)子程序探測(cè)到的情況,正確的導(dǎo)航脈沖被發(fā)出,接著是PAUSE命令,然后RETURN命令退出子程序

Navigate:IF(timeLeft<LeftThreshold)AND(timeRight<RightThreshold)THENPULSOUT13,850PULSOUT12,650ELSEIF(timeLeft<LeftThreshold)THENPULSOUT13,700PULSOUT12,700ELSEIF(timeRight<RightThreshold)THENPULSOUT13,800PULSOUT12,800ELSEPULSOUT13,750PULSOUT12,750ENDIFPAUSE20RETURN該你了可以通過(guò)調(diào)整常量聲明中的比例系數(shù)來(lái)調(diào)節(jié)程序的性能。

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

如果你將比例系數(shù)由5/8改成1/2,機(jī)器人對(duì)光束的敏感程度會(huì)降低,這可能會(huì)改善手電筒光束的控制。

試用不同的比例系數(shù),比如1/4,1/2,1/3,2/3,3/4等,注意機(jī)器人對(duì)手電筒光的任何不同反應(yīng)。①修改示例程序中的IF…THEN聲明,你可以改變機(jī)器人的行動(dòng)使其試圖避開(kāi)進(jìn)入視覺(jué)范圍的光線。②修改IF…THEN聲明,當(dāng)機(jī)器人兩側(cè)光敏電阻都檢測(cè)到手電筒光時(shí),它向后退;當(dāng)機(jī)器人一側(cè)的光敏電阻檢測(cè)到手電筒光時(shí),它轉(zhuǎn)向另一側(cè)。

六、向亮光處移動(dòng)下面我們可以引導(dǎo)機(jī)器人從相當(dāng)黑的屋子退出并朝著有亮光進(jìn)入的門口移動(dòng)。也可以通過(guò)用手在光敏電阻上面投一個(gè)陰影對(duì)機(jī)器人行走進(jìn)行更好的控制。1、重新調(diào)節(jié)光敏電阻如果光敏電阻的聚光表面向上并向外,試驗(yàn)會(huì)做得最好,將光敏電阻的聚光表面向上并向外,如圖所示2、編寫向亮光移動(dòng)的程序向更亮光源移動(dòng)的關(guān)鍵是當(dāng)兩側(cè)光敏電阻的測(cè)量結(jié)果差別小時(shí),向前直走;當(dāng)兩側(cè)光敏電阻的測(cè)量結(jié)果差別大時(shí),轉(zhuǎn)向測(cè)量值小的一側(cè)。簡(jiǎn)而言之,Boe-Bot機(jī)器人會(huì)朝著更亮的地方轉(zhuǎn)動(dòng)。最初看起來(lái)是一個(gè)足夠簡(jiǎn)單的編程任務(wù);象下面例子的IF…THEN判斷語(yǔ)句應(yīng)該正常工作。問(wèn)題是,小車不會(huì)向前移動(dòng),因?yàn)樗粩嗟淖筠D(zhuǎn)然后右轉(zhuǎn),這是因?yàn)閠imeLeft和timeRight的變化很大。每次Boe-Bot機(jī)器人轉(zhuǎn)動(dòng)一點(diǎn),變量timeRight和timeLeft會(huì)變化很多以至于機(jī)器人試圖去更正并向回走。它永遠(yuǎn)不會(huì)得到向前走的脈沖信號(hào)。

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

下面是另一個(gè)工作稍好的代碼塊。它將來(lái)回旋轉(zhuǎn)的問(wèn)題放在一個(gè)特定的條件下。在Boe-Bot機(jī)器人使用左轉(zhuǎn)脈沖之前變量timeLeft必須比timeRight大15。同樣的,當(dāng)Boe-Bot機(jī)器人調(diào)整向右之前timeRight必須比timeLeft大15。這就使機(jī)器人在特定的光線條件下轉(zhuǎn)動(dòng)調(diào)整方向之前有機(jī)會(huì)使用足夠多的向前脈沖。

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

上面代碼塊的問(wèn)題是它只能工作在中等黑暗的環(huán)境下。如果將它拿到相當(dāng)暗的地方,Boe-Bot機(jī)器人不斷的來(lái)回旋轉(zhuǎn),永遠(yuǎn)不會(huì)應(yīng)用任何向前行走的脈沖。如果將它拿到更亮的地方,Boe-Bot機(jī)器人只會(huì)向前運(yùn)動(dòng),而不會(huì)調(diào)整向左或向右的方向。當(dāng)Boe-Bot機(jī)器人處在房子的黑暗部分時(shí),每個(gè)光敏電阻的測(cè)量值會(huì)大一些。機(jī)器人決定轉(zhuǎn)向亮光源時(shí),兩個(gè)測(cè)量結(jié)果之間的差別會(huì)較大;當(dāng)機(jī)器人處在更亮一點(diǎn)的地方時(shí),每個(gè)光敏電阻的測(cè)量值會(huì)小一點(diǎn),機(jī)器人決定做一個(gè)轉(zhuǎn)動(dòng)時(shí),兩個(gè)測(cè)量結(jié)果之間的差別會(huì)比在黑暗的地方小。使小車對(duì)不同的光線條件產(chǎn)生不同的響應(yīng)的方法是設(shè)定一個(gè)變量,即timeRight和timeLeft的平均值的分?jǐn)?shù)。這樣的話,無(wú)論外界光線強(qiáng)弱,值總是正確的。average=timeRight+timeLeft/2difference=average/6現(xiàn)在,變量difference可以被用在IF…THEN聲明中,當(dāng)光線弱時(shí),它的值大,當(dāng)光線強(qiáng)時(shí),它的值小。IF(timeLeft>timeRight+difference)THEN'Turnright.PULSOUT13,850PULSOUT12,850ELSEIF(timeRight>timeLeft+difference)THEN'Turnleft.PULSOUT13,650PULSOUT12,650ELSE'Goforward.PULSOUT13,850PULSOUT12,650ENDIF

示例程序:RoamingTowardTheLight.bs2

不管外界光的強(qiáng)弱,此程序?qū)?duì)用手在光敏電阻上投的陰影非常敏感。這個(gè)程序不需要根據(jù)外界光線情況改變電阻,相反,它會(huì)計(jì)算光的強(qiáng)弱并在軟件中使用變量average和difference調(diào)節(jié)靈敏度。此程序測(cè)量timeLeft和timeRight的平均值,并用平均值來(lái)設(shè)置difference的值在timeLeft和timeRight的測(cè)量結(jié)果之間。這個(gè)值用來(lái)判斷是否發(fā)送一個(gè)旋轉(zhuǎn)脈沖。①將機(jī)器人放在不同的地方,讓它移動(dòng),驗(yàn)證無(wú)論光的強(qiáng)度如何,你可以通過(guò)用手在RC電路的一個(gè)光敏電阻上投一個(gè)陰影來(lái)改變其運(yùn)動(dòng)軌跡。②試著將機(jī)器人放在光線很暗的房子里,但是有光線通過(guò)門從鄰近很亮的屋子或走廊射進(jìn)來(lái),看機(jī)器人是否可以成功走出屋子。'-----[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

現(xiàn)在,變量differences是用average除以6得到的。如果你想使機(jī)器人對(duì)光的差別不要太敏感,用average除以一個(gè)小些的數(shù);如果你想使機(jī)器人對(duì)光的差別更敏感一些,用average除以一個(gè)大些的數(shù)。①不用6除,試著用3,4,5,7,9來(lái)除變量average。②運(yùn)行程序并測(cè)試機(jī)器人用上面不同值退出黑暗屋子的能力。③確定最合適的分母值。

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

你也可以將分母變?yōu)橐粋€(gè)常量,如下所示:

DenominatorCON6

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

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

做剛才所討論的修改,驗(yàn)證程序仍然工作正常。在這個(gè)程序中,你可以使用更少的變量。注意,變量average被用來(lái)臨時(shí)存儲(chǔ)平均值,然后它被Denominator除,結(jié)果存儲(chǔ)在變量difference中。變量difference在后面可以用到,但變量average不會(huì)用到。解決這個(gè)問(wèn)題的方法是用變量difference代替average。工作仍然正常,你也不再需要變量average。下面是修改后的子程序:

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

下面是一個(gè)更好的方法:

程序Average_And_Difference如下:

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

下一步,在變量聲明中做這些修改:圖示:更改程序RoamingTowardTheLight.bs2來(lái)存儲(chǔ)一個(gè)字變量到RAM'UnchangedcodeaverageVARWorddifferenceVARWord

'ChangedtosaveWordofRAMAverageVARWorddifferenceVARaverage我們確實(shí)不需要變量average,但是如果在第一行使用average,在第二行使用difference,將會(huì)給人造成誤解。這里是如何為變量average創(chuàng)建一個(gè)別名difference。differenceVARaverage現(xiàn)在,average和difference指向RAM中同樣的字變量RAM。

測(cè)試修改后的程序,確保工作正常。

總結(jié)這章節(jié)的重點(diǎn)在于偵測(cè)光照強(qiáng)度的不同與在光照強(qiáng)度的差異中讓Boe-Bot運(yùn)作,使用兩個(gè)光敏電阻測(cè)量可見(jiàn)光強(qiáng)度的差異。一開(kāi)始是將光電阻與電阻連接形成分電壓線路,BASICStamp檢視光敏電阻與電阻連接處的電壓值,當(dāng)該點(diǎn)電壓值低于1.4V時(shí),與線路連結(jié)的輸入端緩存器就儲(chǔ)存數(shù)值0;若該點(diǎn)電壓高于1.4V,緩存器就儲(chǔ)存數(shù)值1。Boe-Bot會(huì)透過(guò)程序處理這些二進(jìn)制數(shù)值,與whisker的運(yùn)作方式類似。光電阻分壓線路的運(yùn)作必須在適當(dāng)?shù)碾娮枧c持續(xù)照射的光源中才能維持。在RC線路中使用光敏電阻的光電阻RC線路,會(huì)有更多種方法來(lái)偵測(cè)光照的強(qiáng)弱,原理是測(cè)量充滿電的電容要耗費(fèi)多少時(shí)間進(jìn)行放電,也就是測(cè)量衰退時(shí)間。RC指的是電阻與電容,章節(jié)中有對(duì)于電容的簡(jiǎn)介,也介紹了電容與線路如何讓BASICStamp測(cè)量RC衰退時(shí)間。只要在BASICStamp中使用RCTIME指令,就可輕松完成測(cè)量,因?yàn)镽CTIME指令是特別設(shè)計(jì)于測(cè)量RC線路的充電與放電時(shí)間。另外介紹了聲明常數(shù)的方法,用有意義的名稱取代PBASIC程序中使用的數(shù)字。也介紹了刻度因子與平均值的用法,刻度因子是用于設(shè)定閥值,偵測(cè)是否有手電筒的照射;平均值是用在求兩個(gè)光電阻的RC衰退時(shí)間的平均值,這兩個(gè)方法都用在最后的步驟中,讓閥值能隨著光照條件自行調(diào)整大小,如此便不再需要隨著光照條件改變而更換電阻。第二節(jié)Boe-Bot機(jī)器人紅外線導(dǎo)航BASICStamp微控制器也可以收發(fā)紅外光信號(hào)。使用紅外線前燈探測(cè)道路紅外前燈我們?cè)贐oe-Bot機(jī)器人上建立的紅外物體探測(cè)系統(tǒng)在許多方面就象汽車的前燈。當(dāng)汽車前燈的光從物體反射時(shí),你的眼睛發(fā)現(xiàn)障礙物體同時(shí)你的大腦處理這些信息從而讓你的身體引導(dǎo)汽車。Boe-Bot機(jī)器人使用紅外LED燈作為前燈,如圖7-1所示。他們發(fā)射紅外光,在一些情況下,紅外線從物體反射并從機(jī)器人前進(jìn)的方向折回。Boe-Bot機(jī)器人的眼睛是紅外檢測(cè)器。紅外檢測(cè)器發(fā)出信號(hào)來(lái)表明它們是否檢測(cè)到從物體反射的紅外線。Boe-Bot機(jī)器人的大腦,BASICStamp微控制器做出判斷并基于這個(gè)傳感器的輸入控制伺服電機(jī)。

IR(紅外線)檢測(cè)器有內(nèi)置的光濾波器,除了需要我們用它的內(nèi)部的光敏二極管傳感器檢測(cè)的980nm紅外線,它幾乎不允許其它光通過(guò)。紅外檢測(cè)器也有一個(gè)電子濾波器,它只允許大約38.5kHz的信號(hào)通過(guò)。換句話說(shuō),檢測(cè)器只尋找每秒閃爍38,500次的紅外光。這就防止了普通光源象太陽(yáng)光和室內(nèi)光的IR的干涉,太陽(yáng)光是DC干涉(0Hz),室內(nèi)光依賴于所在區(qū)域的主電源,閃爍頻率接近100或120Hz。由于120Hz在電子濾波器的38.5kHz通帶頻率之外,它完全被IR探測(cè)器忽略。

一、搭建并測(cè)試IR發(fā)射探測(cè)器元件清單:紅外檢測(cè)器、IRLEDs、IRLED套管、220Ω電阻(紅-紅-棕)、1kΩ電阻(棕-黑-紅)IR檢測(cè)器

IRLEDs

IRLED套管

1、搭建紅外線前燈步驟:⑴將紅外LED插入套管⑻確保LED摁入到大的套管中。⑵將小的套管套在LED上,并摁進(jìn)大的圈里面。

電路板的每個(gè)角安裝一個(gè)IR組(IRLED和檢測(cè)器)。圖7-4所示是IR發(fā)射器原理圖,圖7-5所示是接線圖。⑴斷開(kāi)主板和伺服系統(tǒng)的電源。⑵建立圖7-4所示的電路,參考圖7-5插入元件。2、用FREQOUT命令測(cè)試紅外發(fā)射探測(cè)器

FREQOUT命令主要是用來(lái)合成音頻。它的實(shí)際范圍是1到32768Hz。數(shù)字音調(diào)合成的一個(gè)有趣的現(xiàn)象是它包括被稱為和聲的信號(hào),和聲是混在你聽(tīng)到的音調(diào)里的更高頻率的音調(diào)。這種音調(diào)人不能辨別,人只能辨別頻率范圍從20Hz到20kHz的音調(diào)。由FREQOUT命令產(chǎn)生的和聲從32769Hz開(kāi)始直到更高。你可以用高于32768Hz的參數(shù)Freq1直接控制和聲。本任務(wù)中,你要用命令FREQOUT8,1,38500向P8發(fā)送持續(xù)1秒的38.5kHz和聲,連接P8的紅外LED電路將發(fā)送和聲。如果紅外光被小車路徑上的物體反射回來(lái),紅外檢測(cè)器將給BASICStamp發(fā)送一個(gè)信號(hào),讓它知道已經(jīng)檢測(cè)到反射回的紅外光。

讓每個(gè)IRLED探測(cè)器組工作的關(guān)鍵是發(fā)送1ms頻率為38.5kHz的和聲信號(hào),然后,立刻將IR探測(cè)器的輸出存儲(chǔ)到一個(gè)變量中。下面是一個(gè)例子,它發(fā)送38.5kHz信號(hào)給連接到P8的IR探測(cè)器,然后用位變量irDetectLeft存儲(chǔ)連接到P9的IR探測(cè)器的輸出,。

FREQOUT8,1,38500irDetectLeft=IN9

當(dāng)沒(méi)有IR信號(hào)返回時(shí),探測(cè)器的輸出狀態(tài)為高。當(dāng)它探測(cè)到被物體反射的38500Hz和聲時(shí),它的輸出為低。當(dāng)FREQOUT命令發(fā)送和聲后,IR探測(cè)器的輸出處于低狀態(tài)不到1毫秒,因此當(dāng)發(fā)送完FREQOUT命令后立即將IR探測(cè)器的輸出存儲(chǔ)到變量中是很重要的。這些存儲(chǔ)的值會(huì)顯示在調(diào)試終端或被機(jī)器人用來(lái)導(dǎo)航。

示例程序:TestLeftIrPair.bs2

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

保持Boe-Bot機(jī)器人與串口電纜的連接,因?yàn)槟銓⒂谜{(diào)式終端來(lái)測(cè)試你的IR組。①放一個(gè)物體,比如手或一張紙,距離左側(cè)IR組大約1英寸,參考圖7-1。②驗(yàn)證當(dāng)你放一個(gè)物體在IR組前時(shí),調(diào)試終端是否會(huì)顯示0,當(dāng)你將物體移開(kāi)時(shí),它是否顯示1。③如果調(diào)試終端顯示的是預(yù)料的值,沒(méi)發(fā)現(xiàn)物體顯示1,發(fā)現(xiàn)物體顯示0,轉(zhuǎn)到示例程序后的給你了部分。

排錯(cuò)分析:如果調(diào)試終端顯示的不是預(yù)料的值,按以下步驟排錯(cuò):

⑴如果調(diào)試終端顯示的不是預(yù)料的值,檢查電路和輸入的程序。⑵如果你總是得到0,甚至當(dāng)沒(méi)有物體在Boe-Bot前面時(shí)也是0,可能是附近的物體反射了紅外線。Boe-Bot小車前面的桌面是常見(jiàn)的始作俑者。移動(dòng)小車,使IRLED和探測(cè)器不可能受附近物體的影響。⑶如果Boe-Bot前面沒(méi)有物體時(shí)絕大多數(shù)時(shí)間讀數(shù)是1,但是偶爾是0,這可能是附近的熒光燈的干擾。關(guān)掉附近的熒光燈,重新測(cè)試該你了

①將程序TestLeftIrPair.bs2另存為TestRightIrPair.bs2。②更改DEBUG聲明,名稱和注釋使適合于右側(cè)IR組。③將變量名irDetectLeft改為irDetectRight,程序中有四處需要更改。④將命令FREQOUT的Pin由8改為2。⑤將變量irDetectRight監(jiān)控的輸入寄存器由IN9改為IN0。重復(fù)本任務(wù)中前面的測(cè)試步驟,將IRLED連接到P2,檢測(cè)器連接到P0。二、物體檢測(cè)和紅外干涉的實(shí)地測(cè)試我們將制作并測(cè)試LED指示器,它將告訴你是否檢測(cè)到物體,而不需要調(diào)試終端的幫助。許多熒光燈發(fā)射的信號(hào)象你的IRLED發(fā)射的信號(hào)。熒光燈內(nèi)部控制電壓的部件叫鎮(zhèn)流器。許多鎮(zhèn)流器和你的IR探測(cè)器的工作在相同的頻率范圍,38.5kHz左右,這就會(huì)導(dǎo)致熒光燈發(fā)射同樣頻率的信號(hào)。所以當(dāng)我們用集成的紅外線探測(cè)器導(dǎo)航時(shí),這些干擾能導(dǎo)致許多奇異的Boe-Bot車行為!1、重新搭建LED指示電路

這里用到的是和前面“胡須”中用到的同樣的LED指示器。元件清單:紅色LEDs、220Ω電阻(紅-紅-棕)斷開(kāi)主板和伺服系統(tǒng)的電源,參考圖7?7,建立圖7?6所示電路2、測(cè)試系統(tǒng)本系統(tǒng)包括許多元件,這就增加了接線錯(cuò)誤的可能性。因此有一個(gè)測(cè)試程序是很重要的。測(cè)試程序告訴你紅外檢測(cè)器檢測(cè)到什么。從串口電纜上拔掉機(jī)器人測(cè)試其它障礙物體之前,你可以用這個(gè)程序來(lái)驗(yàn)證所有的電路是否正常工作。示例程序――TestIrPairsAndIndicators.bs2⑴接通主板的電源。⑵輸入、保存并運(yùn)行程序TestIrPairsAndIndicators.bs2。驗(yàn)證當(dāng)調(diào)試終端顯示“Testingpiezospeaker…”時(shí),揚(yáng)聲器是否發(fā)出清晰的聲音。用調(diào)試終端來(lái)驗(yàn)證當(dāng)放一個(gè)物體在檢測(cè)器前面時(shí),BASICStamp是否仍然從每個(gè)IR檢測(cè)器發(fā)出收到信號(hào)0。驗(yàn)證當(dāng)檢測(cè)器檢測(cè)到物體時(shí),每個(gè)檢測(cè)器旁的LED是否會(huì)發(fā)光。如果一個(gè)或兩個(gè)LED不能工作,檢查接線和程序。'RoboticswiththeBoe-

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論