Arduino——超聲波測距

原理:超聲波(聲音)在空氣中傳播的速度爲已知340m/s(也會受溫度影響輕微,在粗測中可忽略),超聲波遇到障礙物時就會原路反射回來,根據L=(V T)1/2 可求得發出聲波的位置到障礙物的距離(因爲時間T是超聲波來回兩段路程的時間,所以要除以2)。

 

HC-SR04模塊介紹:

VCC引腳:接+5V。

GND引腳:接GND。

Trig引腳:實際是trigger,有觸發引發的意思,到時候只需要給這個引腳一個持續10us的高電平,HC-SR04就會自動地發射8個40KHz的方波(即爲超聲波)。

Echo引腳:echo實際是是回聲回波的意思,當HC-SR04成功的向外發射超聲波的時刻開始,這個引腳就會變成高電平,高電平會一直持續到HC-SR04接收到回波爲止。

注意:由上面的各引腳的功能我們可知道Trig和Echo必須接在arduino的D口(即數字端口)

 

程序示例:(trig引腳我是接在了arduino的D3口,echo就接在了D4口)

/*
日期:2016.04.06
編輯器:sublime text 3 (基於arduino-1.6.5)
功能:通過SR04超聲波傳感器進行測距,並通過串口監視器顯示測出的距離
*/

const int Trig = 3;                                           // 設定SR04連接的Arduino引腳
const int Echo = 4; 
double distance,time ; 
void setup() 
{   
        Serial.begin(9600);                                    // 初始化串口通信及連接SR04的引腳
        pinMode(Trig, OUTPUT); 
  
        pinMode(Echo, INPUT);                                  //要檢測引腳上輸入的脈衝寬度,需要先設置爲輸入狀態
    Serial.println("The distance is :");
} 
void loop() 
{ 
    
        digitalWrite(Trig, LOW);                                 
        delayMicroseconds(2);                                   
        digitalWrite(Trig, HIGH);                               
        delayMicroseconds(10);                                  //產生一個10us的高脈衝去觸發SR04
        digitalWrite(Trig, LOW);                                
        
        time = pulseIn(Echo, HIGH);                              // 檢測脈衝寬度,注意返回值是微秒us
        distance = time /58 ;                                  //計算出距離,輸出的距離的單位是釐米cm

        Serial.print(distance);                                //把得到的距離值通過串口通信返回給電腦,通過串口監視器顯示出來
        Serial.println("cm"); 
        delay(1000); 
}

把模塊與arduino連接好,然後把程序寫好後就下載到arduino裏面運行,然後打開串口監視器,就可以看到有數據不斷地在屏幕上輸出。

 

pulseIn(Echo, HIGH)的作用是把Echo引腳高電平的持續時間測出,並返回,返回值的單位是微秒us。

 

計算過程:L =  (1/2) * 340 *(time /10^6) * 100 = time / 58

上面計算過程包括了把us變成s , 速度乘時間, m變成cm 三個部分。 

 

注意:在把超聲波對着目標障礙物的時候,模塊與目標障礙物之間的其他障礙物【有可能】會影響測距的準確性,因爲聲波的方向性並不強,並不是只朝着一個方向傳播的,當沿某一個方向傳播的超聲波遇到的障礙物比目標障礙物的距離要近並且回波成功的被超聲波模塊接收到的時候測出的距離值就是不準的了。下面是一個示意圖,可能有點誇張了,但 想要表達的意思是在的。


 

超聲波發射器向某一方向發射超聲波,在發射的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。聲波在空氣中的傳播速度爲340m/s,根據計時器記錄的時間t,就可以計算出發射點距障礙物的距離s,即:s=340m/s×t / 2 。這就是所謂的時間差測距法。

pulseIn函數知識要點:

pulseIn():用於檢測引腳輸出的高低電平的脈衝寬度。
pulseIn(pin, value)
pulseIn(pin, value, timeout)
Pin---需要讀取脈衝的引腳
Value---需要讀取的脈衝類型,HIGH或LOW
Timeout---超時時間,單位微秒,數據類型爲無符號長整型。
使用方法及時序圖:


1、使用Arduino採用數字引腳給SR04的Trig引腳至少10μs的高電平信號,觸發SR04模塊測距功能;
2、觸發後,模塊會自動發送8個40KHz的超聲波脈衝,並自動檢測是否有信號返回。這步會由模塊內部自動完成。
3、如有信號返回,Echo引腳會輸出高電平,高電平持續的時間就是超聲波從發射到返回的時間。此時,我們能使用pulseIn()函數獲取到測距的結果,並計算出距被測物的實際距離。
代碼如下:

const int TrigPin = 2;
const int EchoPin = 3;
float distance;
void setup()
{   // 初始化串口通信及連接SR04的引腳
        Serial.begin(9600);
        pinMode(TrigPin, OUTPUT);
    // 要檢測引腳上輸入的脈衝寬度,需要先設置爲輸入狀態
        pinMode(EchoPin, INPUT);
    Serial.println("Ultrasonic sensor:");
}
void loop()
{
    // 產生一個10us的高脈衝去觸發TrigPin
        digitalWrite(TrigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(TrigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW);
    // 檢測脈衝寬度,並計算出距離
        distance = pulseIn(EchoPin, HIGH) / 58.00;
        Serial.print(distance);
        Serial.print("cm");
        Serial.println();
        delay(1000);
}
 
pulseIn函數其實就是一個簡單的測量脈衝寬度的函數,默認單位是us。也就是說pulseIn測出來的是超聲波從發射到接收所經過的時間。對於除數58也很好理解,聲音在乾燥、攝氏 20度的空氣中的傳播速度大約爲343米/秒,合34,300釐米/秒。或者,我們作一下單位換算,34,300除以1,000,000釐米/微秒。即爲:0.0343釐米/微秒,再換一個角度,1/(0.0343 釐米/微秒)即:29.15 微秒/釐米。這就意味着,每291.5微秒錶示10CM的距離。1釐米就是29.15微秒。但是發送後到接收到回波,聲音走過的是2倍的距離呀。
所以實際距離就是1釐米,對應58.3微秒。實際上整個測距過程是測的發出聲波到收到回波的時間,你的程序裏的第一個distance實際上是時間us。所以換成距離cm,要除以58。當然除以58.3可能更精確。所以我們可以用 pulseIn(EchoPin, HIGH) / 58.00獲取測得的距離。
————————————————
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章