ESP32, IOT物聯網

【IOT物聯網應用-ESP32】第十篇:超音波測距模組HC-SR04

實驗說明:

超音波模組HC-SR04,是一個非常實用且常見的模組,特別是用在智慧車、電子尺等專案中,用來測量前方障礙物的距離。現在米羅就來跟各位介紹ESP32 搭配超音波測距HC-SRO4模組使用方式。

▼ 其規格如下 

材料:

  • ESP32-E DevKit
  • USB 傳輸線
  • 超音波模組HC-SR04
  • 1602 I2C 顯示模組
  • 麵包板
  • 杜邦線

▼ 購買IoT物聯網學習教材:

ESP32 物聯網應用學習套件 ESP32CAM IoT物聯網學習教材 適用Arduino

 

相關知識:

什麼是超音波感測器?

  • 超音波感測器是由超音波的發射器、接收器和控制電路所組成的。發射器 (Transmitter) 會發出 40 kHz 的聲波,由於這個聲波的頻率超過人類可聽見的 20 kHz,因此被稱為超音波,接收器 (Receiver) 可以接收超音波。HC-SRO4 可以感測的距離為 2cm 到 400cm,感應角度為 15 度。
  • 超音波感測器測量距離的方法,是利用超音波碰到物體會反射的特性,計算發射與接收的時間差,來計算出距離。
  • 給trig pin一個10 us TTL pluse, 模組會發射8個40k Hz的聲波出去,然後量測訊號是否回來。
  • 如果有收到TTL的高電位訊號,那Echo會送出超音波來回的時間,此 HIGH 位準脈衝上緣可以看成超音波開始發射時間; 而下緣則是接收到反射波的時間, 所以整個高位準脈衝的寬度就是超音波往返的總時間。

要怎麼量測Echo pulse的時間長度呢?

聲波的傳遞速率:音速又會依空氣之狀態(如濕度、溫度、密度)不同而有不同數值。所以使用超音波量測距離必須知道音波的傳遞速度, 這主要取決於大氣的密度, 而溫度又是影響空氣密度的主因. 音速與溫度的關係如下 :

V=331m/s +0.6t
(V:空氣中的音速;t:空氣中的攝氏溫度)
在常溫 20 度時, 音速是 331.5+0.6*20=343.5 m/s

超音波測距的原理是利用一個超音波發射器與一個接收器組成的模組來量測音波從發射到收到反射波的時間, 乘以音速即可得到音波往返的距離, 除以 2 即得與反射物體間的距離. 在常溫 20 度下, 音波前進 1 公分約需 58 微秒, 計算如下 :

1 公分=0.01公尺
0.01 公尺=(343.5 公尺/秒*t)/2

 

此處除以 2 是因為音波花了 t 秒往返走了兩倍距離, 須除以 2 才是單程距離.

t=(0.01*2)/ 343.5 =58us(微秒)

 

接線說明:

 

程式:

int trigPin=17; //發出聲波腳位(ESP32 GPIO17)
int echoPin=16; //接收聲波腳位(ESP32 GPIO16)

void setup() {
  pinMode(trigPin, OUTPUT); 
  Serial.begin(9600);
  }

void loop() {
  unsigned long d=ping()/58; //計算距離
  Serial.print(d);
  Serial.println("cm");
  delay(1000);
  }

/*副程式
 *Send 10us pulse to HC-SR04 trigger pin
 */
unsigned long ping() { 
  digitalWrite(trigPin, HIGH); //啟動超音波
  delayMicroseconds(10);  //sustain at least 10us HIGH pulse
  digitalWrite(trigPin, LOW);  //關閉超音波
  return pulseIn(echoPin, HIGH); //計算傳回時間
 }

 

▼輸出結果如下:

程式說明:

HC-SR04 的 Trig 腳送出 10 微秒的 HIGH 準位脈衝, 以觸發發射器送出超音波, 然後用 pulseIn() 函數測量 Echo 腳送出的 HIGH 脈衝寬度傳回. 此值為超音波往返的時間 (微秒), 將其除以 58 即得與障礙物之間的距離 (公分).

 

pulseIn ( ) 函式使用方式:

在Arduino裡有現成的指令“pulseIn ( )” 為讀取一個針腳的脈衝時間(HIGH或LOW)。

此函數有 2 或 3 個參數 :

pulseIn(pin, value)
pulseIn(pin, value, timeout)
  • 第一參數 pin 是 Arduino 接 HC-SR04 的 Echo 腳之 DIO 數位腳位編號,
  • 第二參數 value 是要偵測的位準 (LOW/HIGH), 對於 HC-SR04 而言要用 HIGH,
  • 第三參數 timeout 是等候脈衝出現的延遲時間 (單位是微秒), 預設是 1 秒 (即1000000). 如果在 timeout 時間內未偵測到脈衝, 則回傳

 

進階範例(測距槍)

在這個範例中,米羅將帶各位實作一個好玩又實用的測距槍,測距槍搭載了超聲波模組與LCD1602 顯示模組,可對 1~400cm 範圍內物體進行測距,測出的距離將顯示在 LED 面板上。

 

接線說明:

 

程式:

#include <LiquidCrystal_I2C.h> 

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
int trigPin=17; //發出聲波腳位(ESP32 GPIO17)
int echoPin=16; //接收聲波腳位(ESP32 GPIO16)

/*副程式
 *Send 10us pulse to HC-SR04 trigger pin
 */
unsigned long ping() { 
  digitalWrite(trigPin, HIGH); //啟動超音波
  delayMicroseconds(10);  //sustain at least 10us HIGH pulse
  digitalWrite(trigPin, LOW);  //關閉超音波
  return pulseIn(echoPin, HIGH); //計算傳回時間
 }

void setup()
{
  pinMode(trigPin, OUTPUT); 
  lcd.init(); //初始化LCD1602 
  lcd.backlight(); //開啟背光
}

void loop()
{
  unsigned long d=ping()/58; //計算距離
  lcd.clear(); //清除所有內容
  lcd.setCursor(0,0); //游標從第0行,第0個字開始印出文字
  lcd.print("Distance : "); //印出文字
  lcd.setCursor(0,1); //游標從第1行,第0個字開始印出文字
  lcd.print(d); //顯示距離
  lcd.print("CM");
  delay(1000);
}

 

相關文章