謝作如 鄭一粟
筆者做激光測(cè)距測(cè)高儀的想法源自一款用攝像頭作為測(cè)量工具的APP。這類APP的測(cè)量原理是根據(jù)手機(jī)、平板的攝像頭成像的比例關(guān)系,計(jì)算出測(cè)量距離和物體高度。例如,iPhone有款軟件叫“光學(xué)測(cè)距儀”,運(yùn)行界面如圖1所示。
在使用過(guò)程中,筆者發(fā)現(xiàn)這類APP的操作其實(shí)還是比較麻煩的,因?yàn)樾枰獏⒄瘴铩H绻獪y(cè)量某頭頂某條梁的長(zhǎng)度,或者屋頂離地面的高度,基于攝像頭的測(cè)量軟件幾乎是無(wú)能為力了。那么,有沒(méi)有其他的解決方案呢?于是,筆者與學(xué)生一起進(jìn)行研究,最終基于激光的測(cè)距測(cè)高儀就這樣產(chǎn)生了。
● 原理
筆者準(zhǔn)備使用激光作為測(cè)量工具,并非使用反射時(shí)間來(lái)計(jì)算。接下來(lái)要用到數(shù)學(xué)知識(shí)了。如果要測(cè)量物體P到物體T的距離,可以用這樣的辦法:如圖2所示,在物體P處找兩個(gè)點(diǎn),如A、B,分別連接物體T的C點(diǎn)。這時(shí),只要知道∠BAC(θ1)和∠ABC(θ2)的角度,以及AB線段的長(zhǎng)度,就可以算出C點(diǎn)到AB的垂直距離L。
計(jì)算公式為:
只要能得到這兩個(gè)夾角的準(zhǔn)確角度,就可以計(jì)算出物體離測(cè)量?jī)x器的距離了。然后,是否還可以利用這樣的原理繼續(xù)得到物體的高度或者長(zhǎng)度呢?(參見(jiàn)圖3)
如果在測(cè)量?jī)x器上設(shè)置3個(gè)點(diǎn)。其中點(diǎn)1連接被測(cè)物體的一端A,點(diǎn)2和點(diǎn)3分別連接被測(cè)物體的另一段B。只要得到線段ab的長(zhǎng)度及角度θ1、θ2和θ3的大小,便可以求出被測(cè)物的高度h以及測(cè)距儀器與被測(cè)物的水平距離x。
那么,連接測(cè)量?jī)x器和被測(cè)物體的直線用什么來(lái)實(shí)現(xiàn)?毫無(wú)疑問(wèn),激光是最好的方案。因?yàn)榧す饩哂卸ㄏ虬l(fā)光、亮度極高的特點(diǎn)。只要把3個(gè)激光發(fā)射頭安裝在測(cè)量?jī)x器上,手動(dòng)調(diào)整其中兩束激光在被測(cè)物體的一個(gè)端點(diǎn)上重疊,另一束激光則發(fā)射在物體的另一端點(diǎn)。只要能確保測(cè)量?jī)x器和被測(cè)物體之間是平行的,就能計(jì)算出距離和高度。
● 材料
根據(jù)上面的原理,要制作一個(gè)這樣的激光測(cè)距測(cè)高儀,大致需要如下材料。
1.微控制器
因?yàn)樯婕坝?jì)算,就需要用到一個(gè)小型的中央處理器。由于筆者僅是為了做出一個(gè)模型,所以就選擇了常見(jiàn)的Arduino。如果在意計(jì)算的精度,可以選擇樹(shù)莓派或者pcDuino之類的迷你電腦。
2.角度傳感器
角度傳感器的選擇是最重要的,因?yàn)橐@取精確的角度進(jìn)行計(jì)算。牽一發(fā)而動(dòng)全身,一點(diǎn)點(diǎn)的誤差,經(jīng)過(guò)計(jì)算放大后,誤差就很可怕了。在淘寶上常見(jiàn)的角度傳感器如圖4所示。
這種傳感器的旋轉(zhuǎn)角度最多只有300度,將5V電壓均分到每1度后,精度是相當(dāng)?shù)偷?。后?lái)筆者又在淘寶上找到了多圈的精密角度傳感器(如圖5),才算初步解決了誤差的問(wèn)題。
3.液晶顯示器
計(jì)算結(jié)果如果需要實(shí)時(shí)顯示,那么儀器上就需要液晶顯示屏,或稱LCD。因?yàn)閮x器上僅僅需要顯示幾行字符,所以筆者選擇了標(biāo)準(zhǔn)1602液晶顯示屏(如圖6),兩行,每行顯示16個(gè)字符。
4.激光頭
激光頭利用的是低功率的可視激光,常見(jiàn)的激光指示器有紅光(655/635nm)、黃光(589/593nm)、綠光(532nm)、藍(lán)光(473/445nm)和藍(lán)紫光(405nm)等。起初,筆者把手頭的電子教鞭拆了,后來(lái)發(fā)現(xiàn)淘寶上有現(xiàn)成的激光頭賣(如圖7),筆者選擇了一款5V的,直接使用Arduino輸出的5V電流。需要注意的是,激光頭很危險(xiǎn),絕對(duì)不能用肉眼去看,建議調(diào)試的時(shí)候先不要給激光頭供電。
● 接線
1.角度傳感器的接線
角度傳感器接在Arduino的模擬口(如圖8),如果3個(gè)角度傳感器分別用跳線接入Arduino控制板會(huì)顯得很亂,于是筆者使用了一塊擴(kuò)展板。
2.激光頭的接線
激光頭的電源直接從Arduino的5V和Gnd上接出。
3.顯示屏的接線
筆者使用的LCD是IIC/TWI接口的,用4根線連接到Arduino擴(kuò)展板的專用接口即可(如圖9)。
● 編程
Arduino的代碼比筆者想象中簡(jiǎn)單,其核心代碼如下頁(yè)表所示。
最終的測(cè)試效果如下頁(yè)圖10所示,顯示屏上第一行數(shù)據(jù)是傳感器的參考值,第二行數(shù)據(jù)分別是距離和高度,用“|”分開(kāi)。例如,想要測(cè)量一堵墻的高度,筆者先要將測(cè)量?jī)x器保持垂直,一束激光束(激光點(diǎn)一)射向墻的一端,另外兩束射向墻的另一端,按下按鈕,Arduino就可以實(shí)時(shí)計(jì)算,便可得到樹(shù)的高度和人與樹(shù)之間的距離了。
● 包裝
為了看起來(lái)像個(gè)作品,筆者使用雕刻機(jī)制作了激光頭和角度傳感器的連接件(如圖11)。當(dāng)然,用3D打印機(jī)打印也是可以的,只是當(dāng)時(shí)筆者的創(chuàng)客空間還沒(méi)有買(mǎi)3D打印機(jī)。
再用雕刻機(jī)做一個(gè)底板,固定這些儀器。3個(gè)激光頭排列在一起,看起來(lái)是不是很酷?旁邊一條四線的接口是預(yù)留給接LCD用的,圖12為整體效果。
再看看另一面的效果,雖然線有點(diǎn)多,但是并不是很亂(如圖13)。
這款儀器的使用步驟如下:①連接電池,保持儀器呈垂直狀態(tài);②打開(kāi)電源,顯示屏若未正常顯示數(shù)字,請(qǐng)按下Arduino主板上的reset按鈕;③調(diào)節(jié)“下、中”激光,同時(shí)對(duì)準(zhǔn)被測(cè)物體下端;④調(diào)節(jié)“上”激光,對(duì)準(zhǔn)被測(cè)物體上端;⑤在顯示屏上將顯示X(測(cè)距儀與被測(cè)物之間的水平距離)與Y(被測(cè)物兩個(gè)端點(diǎn)之間的距離)。
● 優(yōu)化
正如一開(kāi)始擔(dān)心的那樣,因?yàn)榻嵌葌鞲衅鞯木葐?wèn)題,測(cè)量距離稍微遠(yuǎn)一點(diǎn)的物體,誤差就很大了。因?yàn)槿绻嚯x一遠(yuǎn),角度傳感器上的1度,對(duì)應(yīng)的就是一兩米的距離。要解決這個(gè)問(wèn)題,找精度很高的角度傳感器也無(wú)濟(jì)于事,因?yàn)檎{(diào)節(jié)激光頭給角度傳感器帶來(lái)的旋轉(zhuǎn)角度實(shí)在太小了。除非如圖14一樣,用齒輪組將激光頭的旋轉(zhuǎn)角度放大,然后給角度傳感器。
因?yàn)樽约簞?dòng)手做齒輪組,誤差還是挺大,因此筆者還試著拆了一個(gè)塑料的直流電機(jī)變速箱。但是這樣一來(lái),整個(gè)儀器的體積就要大很多,看來(lái)如果要實(shí)現(xiàn)做工精細(xì)并不是一件容易的事(如圖15)。
筆者還為這款儀器設(shè)計(jì)了一個(gè)外殼,如圖16所示。黑色是激光調(diào)節(jié)旋鈕,紅色按鈕是開(kāi)關(guān)。僅僅是設(shè)計(jì),但并沒(méi)有真正生產(chǎn)。
當(dāng)然,如果僅僅考慮演示用激光進(jìn)行測(cè)距、測(cè)高的原理,筆者也已經(jīng)達(dá)到了探究的目的。其實(shí)這個(gè)作品原理還可以用于課堂教學(xué)。如果將角度傳感器的數(shù)據(jù)接入電腦,使用S4A或者Scratch2.0之類的軟件,教師可以直接使用這些數(shù)據(jù)進(jìn)行教學(xué)或者驗(yàn)證一些數(shù)學(xué)原理,如三角函數(shù)、相似三角形等知識(shí),定然會(huì)有助于學(xué)生的學(xué)習(xí)。
如果對(duì)相關(guān)內(nèi)容感興趣,請(qǐng)關(guān)注主持人博客。