Arduino中使用超聲波測距實驗
儘管網上已經有很多使用超聲波測距的案例,但為了配合我們的前面用Processing寫好的雷達掃描程式付諸實踐,所以我們還是要把超聲波的測距的完整步驟在這裡列出來,以供初學者來參考,尤其是讓前面看到了Processing雷達掃描程式而不知道如何實踐硬體部分的小夥伴們有依樣畫葫的“葫蘆”。
一、超聲波感測器(Ultrasonic Sensor)
我們常用的超聲波感測器有好幾種,我這裡有兩種,一種是SR04、SR05 ,(US-100)Y401 US-015等,這些都是做好了電路整合的模組了。所以叫做超聲波感測器模組。如下圖:
但真正的感測器沒有模組的,就是一個傳送一個接收(對應到我們上面的模組就是Trig和Echo兩個腳了)
實物連線圖
瞭解外形之後,我們還要來看看她是如何配合工作的。其實說到超聲波,我們就會想到蝙蝠,是的,它的工作原理就是模仿蝙蝠的。先發出一個聲音,然後在接收返回的聲音,通過發出和返回的時間差來可以計算出距離,就這麼簡單。
所以,我們就要有一個機制,發出多長的聲波訊號(和發電報一樣),回收採集的理論上應該是發出的同時就要取樣收集了。
但我們的微控制器或者這裡說的arduino採用的是單執行緒的程式執行機制,故而傳送的同時肯定不能收集,一般是等傳送完畢後開始收集,所以這個模組中則有一個緩衝機制,將收到的訊號暫時儲存等待裝置來讀取。
那麼傳送多長的訊號呢?一般是10個毫秒。所以這裡必須有觸發腳Trig拉高電平10毫秒的動作;我們從圖中可以看到,一共有四個腳,分別為VC,Trig,Echo,GND,兩邊的兩個為接電源的正負極,中間的兩個一個傳送一個接收,可以連線在任意訊號埠是包括1到13口及A0~A5,當日在程式中也必須對應設定好。
二、程式碼實現
編寫程式碼我們一如既往的要使用串列埠,這裡不再贅述。使用超聲波模組,我們要特別注意pluseIn函式的使用,它用於檢測引腳輸出的高低電平的脈衝寬度。
pulseIn(pin, value) //value為LOW或者HIGH
pulseIn(pin, value, timeout)
可以看出,這和我們之前使用到的digitalWrite基本相同,一般都是兩個引數,一個引數是管腳一個是高低電平的設定。
好了,瞭解好這些了,我們可以看看程式碼:
int TrgPin = A0; int EcoPin = A1; float dist; void setup() { Serial.begin(9600); //設定TrgPin為輸出狀態 pinMode(TrgPin, OUTPUT); // 設定EcoPin為輸入狀態 pinMode(EcoPin, INPUT); } void loop() { digitalWrite(TrgPin, LOW); delayMicroseconds(8); digitalWrite(TrgPin, HIGH); // 維持10毫秒高電平用來產生一個脈衝 delayMicroseconds(10); digitalWrite(TrgPin, LOW); // 讀取脈衝的寬度並換算成距離 dist = pulseIn(EcoPin, HIGH) / 58.00; Serial.print("Distance:"); Serial.print(dist); Serial.println("cm"); delay(300); }
執行效果如下: