使用Arduino加上HC-SR04超音波測距模組,可以讓我們只使用短短的幾行程式碼就可以知道測距模組前方障礙物的距離,而且精確度還不錯,常常被使用來當做是智慧小車的測距和避障之用,這個單元就讓我們來練習如何使用測距模組。先來看看這次使用的測距模組的正面照以及背面照:

如同照片上看到的,這個模組只有4條連接線,其中左右兩側分別是Vcc以及GND,這是要連接到Arduino板子上的5V以及GND用的。另外的兩條線分別是Trig以及Echo,前者用來發出觸發用的信號,而後者則是可以在觸發信號發出之後,用來量測回應的電位的時間,藉由取得的回應時間,透過聲波在空氣中傳遞速度的公式推算出前方物體的距離。不過,其實這些計算的式子也有熱心的人士幫我們寫好了,所以,只要把線連接好,不用管什麼公式,直接使用別人寫好的函數就可以直接取得距離了。先來看實際接好的線路:

如上圖所示,把Trig接到第2腳,而Echo接到第3腳,再把電源和接地線接好就大功告成了。在程式的部份,如同前一單元的內容,先到這個網址https://bitbucket.org/teckel12/arduino-new-ping/downloads/去下載程式庫解壓縮:

把解壓縮的資料夾放到Arduino的Libraries資料夾之下,如下所示:

然後就可以開始編寫測距的程式了:

在這個程式中我們使用了一個新的C語言語法#define來定義在程式中會使用到的常數,特別要留意的是,此種方式和之前的int宣告變數不一樣,在常數和實際的數值之間沒有等號,而且在#define的行末也不能有分號,此點絕對要留意。因為我們把Trig接到第2支腳,而Echo接到第3支腳,所以在使用NewPing時,要把這兩個腳位指定給實例變數,而且也要給一個最大的距離,在這裡我們使用200,其單位是公分。做好設定之後,在使用上就很簡單了,在這裡我們把測距的實例變數叫做m,使用m.ping()即會傳回Echo信號的回覆時間(以微秒為單位),要輸出成距離時,只要再使用m.convert_cm()函數進行轉換就可以了。由於有時候us回傳回0,因此在程式中也使用一個if判斷,只有傳回值不是0的時候才會計算距離並輸出。

在這個例子中,需使用序列埠監控視窗來觀察,其結果如下所示:

不過,使用序列埠監控視窗的話,你的裝置不就離不開電腦了?所以,接下來是結合上一個單元的實習,我們把液晶顯示模組也套用進來,讓它透過液晶模組來顯示量測到的距離。把前一單元的液晶顯示器再接回來,如下圖所示:

整合之後的程式碼如下所示:

以下是執行的結果示範影片:

 

(402)