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