| Arduino教學 | 感測模組應用 Ultrasonic Sensor | 501 |

超音波感測器( Ultrasonic Sensor )主要作為距離偵測使用,在生活中非常常見,像汽車倒車雷達就是採用防水型的超音波感測器,原理為利用超聲波於空氣中的傳遞反射特性,來計算與障礙物的距離,這篇就來講解 Arduino Uno 常搭配的超音波感測器。

1. Ultrasonic Sensor 原理

超音波感測器是利用聲波在空氣中的傳播原理來計算距離,聲波速度為 340 公尺/ 1秒,所以每走1公尺所需時間為0.002941 秒,走1 cm就是 0.00002941 秒( 29.41us ), 簡單來說我們僅需要計算超音波的行走時間就需要可以知道物體與我們的距離,下圖為一個簡單的示意圖:

ultrasonic sensor

這邊有個地方需要注意一下,因為我們從感測器上得到的時間是為 傳遞時間+反射時間 的總值 2T,實際的距離時間就要將 行走總時間除以2 才為正確的數值,所以得到物體距離的數學式就為『 距離cm = T/29.41us 』,之後就可以將這條數學式放入程式中進行運算就可以得到距離了。

市面上常見的超音波感測器有兩種,一種為 4 隻腳 HC-SR04,另一種為三隻腳的 PING,最大的差別在於用觸發( TRIG )與接收( ECHO )的腳位是否共用,這樣會決定你的程式碼是否需要在啟動超音波感測器時 變換該腳位為輸出或輸入,此次程式碼會先以3隻腳的 PING 作為示範。

HC-SR04
PING

至於超音波感測器的如何驅動,因為模組本身已經把聲波的類比訊號處理完成,我們僅需瞭解模組控制的步驟:

  1. 將 SIG 腳位指定為 OUTPUT,並設定 LOW,維持 2us,此步驟將模組恢復初始狀態。
  2. 將 SIG 設定為 HIGH 值,維持 10us,再將 SIG 設為 LOW 值,模組將開始發出實際的超音波。
  3. 將 SIG 改為 INPUT,並開始計算回傳 HIGH 的時間。
  4. 利用 MCU 來計算脈波時間(也就是聲波飛行時間)換算回實際的距離。

以上就是如何利用超音波感測模組來計算障礙物距離的步驟。

2. 電路接法

由於模組本身的腳位就只有3支,電源、GND、SIG,就直接選定Uno腳位編號10來作為SIG的連接腳即可,電路連接如下:

3. 程式功能

此次我們寫個簡單的功能,除了啟動超音波感測器外,同時利用 UART 傳輸到終端機畫面,確定障礙物與感測器的實際即時資訊。

下面為完整的程式碼內容:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int p_time=0;
  int dist_cm=0;
  pinMode(10,OUTPUT);
  digitalWrite(10,LOW);
  delayMicroseconds(2);
  digitalWrite(10,HIGH);
  delayMicroseconds(10);
  digitalWrite(10,LOW);
  pinMode(10,INPUT);
  p_time=pulseIn(10,HIGH);    //unit: us
  dist_cm=(float)((p_time/2)/29.41);
  Serial.print(dist_cm);
  Serial.print("cm\n");
  delay(500); 
}

$ 程式講解

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

Serial.begin(9600),這個函數主要為初始化 UART 的功能,我們這邊設定 baud rate 為 9600,並透過終端機畫面輸出。

void loop() {
  // put your main code here, to run repeatedly:
  int p_time=0;
  int dist_cm=0;

先定義兩個變數,一為超音波模組回傳的脈波時間 p_time,另一個為經過計算後的實際距離。

  pinMode(10,OUTPUT);
  digitalWrite(10,LOW);
  delayMicroseconds(2);
  digitalWrite(10,HIGH);
  delayMicroseconds(10);
  digitalWrite(10,LOW);
  pinMode(10,INPUT);

利用 pinMode() 設定編號 10 腳位( SIG )為數位輸出,設定為 LOW 維持 2us,目的為將超音波模組設定 RESET。接著將編號 10 腳位 (SIG) 設定為 HIGH,並維持10us,觸發超音波模組。最後將編號10腳位 (SIG) 設定為 LOW (此時仍為OUTPUT )後,接著將編號 10 腳位設定為 INPUT 準備接收模組回傳的脈波訊號。

  p_time=pulseIn(10,HIGH);    //unit: us
  dist_cm=(float)((p_time/2)/29.41);

pulseIn (腳位,準位)為 Arduino 內建的計算脈波時間函數,回傳數值的單位為us。並利用上節所提到的飛行時間/2=實際距離時間 觀念,並將得到的時間/29.41us,換算出單位為公分的距離。( float )為強制將計算式使用浮點數運算,提高計算過程中的準確度(只用整數值計算落差大)。

  Serial.print(dist_cm);
  Serial.print("cm\n");
  delay(500);

將結果利用 UART 搭配終端機畫面輸出確認數值,並加入 delay 500ms。

4. 總結&懶人包

以上就是超音波感測器搭配 arduino 的程式碼,以最簡單的應用來說,就是 arduino 避障小車,將感測器裝在車輛的前端,如果距離小於多少就停止或轉彎,當然實務上還有一些小細節要注意,比如說雜訊處理、訊號穩定性問題、超音波的嚮應速度等,後續吉米哥會在後續章節會再講到,還請大家持續在 Follow~~

最後是今日懶人包內容,如果有什麼問題歡迎在下面留言與我討論~

501-ultrasonic-sensor.ino(下載連結)

↓↓↓↓↓↓賣場連結↓↓↓↓↓↓

歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀 

吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw

Follow JIMI哥 Twitter : https://twitter.com/jimirobot  <–得到最新文章通知

發佈留言

Close Menu