1. 程式人生 > >Arduino中使用超聲波測距實驗

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);
}

執行效果如下:
在這裡插入圖片描述