超音波是指超出人耳所能聽到的頻率 20KHz 的音波, 人類的聽覺一般只能聽到 20Hz~20KHz 左右的音域, 但某些動物如狗, 海豚或蝙蝠等, 可以聽到 20KHz 以上的超音波, 例如海豚利用超音波傳遞溝通訊息; 而蝙蝠則利用超音波在飛行中定位以避開障礙物
超音波於 19 世紀被發現, 並於第一次世界大戰首次應用於潛水艇之偵測, 如今在工業, 醫學, 與農業上都有廣泛之應用, 例如非破壞性檢測中的孔隙偵測, 孕婦姙娠掃描, 人體組織斷層掃描, 物件清洗, 以及蔬果品質檢測等等
在空氣中傳遞的超音波其頻率在 20K~200KHz 之間,頻率越高,衰減程度越大,可傳播的距離越短。
一般常用的超音波模組,其頻率通常是 38K,40K,或 42KHz 這三種。
HC-SR04 超音波模組使用的是 40KHz 的超音波,可探測距離為 2cm~400cm。
有 Vcc (5V)、Gnd、Trig、Echo 四隻接腳
T:發送超音波
R:接收超音波
電源:DC5V/2mA(只能5V供電)
輸出電位( 1/ 0):5V/ 0V
精度:1cm
距離範圍:2 ~ 450cm
有效的角度:<15度
觸發輸入信號:10uS TTL pulse
HC-SR04P 超音波測距糢組是 HC-SR04的升級版
寬電壓的輸入範圍:DC3V~5.5V
採用I/O觸發測距
給 Trig 一個 10 us 寬度的脈波,啟動模組,模組就會發射8 個 40k Hz 的聲波,Echo 會由低電位變成高電位,直到接收到反射回來的超音波,Echo 會由高電位變回低電位。
要特別注意的地方是被測物體最好大於 0.5 平方公尺,而 Trig 時間間隔最好大於 60ms,避免 Trig 與 Echo 互相干擾。
超音波測距的原理是利用一個超音波發射器與一個接收器組成的模組來量測音波從發射到收到反射波的時間,乘以音速即可得到音波往返的距離,除以 2 即得與反射物體間的距離。
Q:
在常溫 20 度時, 音速是 344 m/s。
344 m/s = cm/us(公分/微秒)
HC-SR04 的 Echo 腳輸出的高位準脈衝,其時長即是超音波往返所花的時間(duration)(us)。
距離 = 速率 * 時間
distance = (duration/2) * 0.0344 cm/us
= (duration/2) * 1/29 cm = (duration/2)/29 cm
= (duration/58 cm)
HC-SR04 的 Echo 腳輸出的高位準脈衝,其時長即是超音波往返所花的時間,用 Arduino 的 pulseIn() 函數量取 Echo 的脈衝時長(單位:微秒),再除以 58, 即可得到與反射超音波的障礙物之間的距離是幾公分了。
duration = pulseIn()
distance = (duration/2) * 0.0344 cm
= duration/58 cm
若設定好 HC-SR04 超音波模組與障礙物之間的距離(objectDistance),用 Arduino 的 pulseIn() 函數量取 Echo 的脈衝時長 duration(單位:微秒),依速率 = 距離 / 時間,即可得到聲波在空氣中的傳輸速率了。
速率 = 距離 / 時間
duration = pulseIn()
speed = distance / (duration/2) cm/us
= m/s
setup()
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
loop()
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); //sustain at least 10us HIGH pulse
digitalWrite(trigPin, LOW);
pulseIn(echoPin, HIGH);
pulseIn(pin, value)
pulseIn(pin, value, timeout)
此函數有 2 或 3 個參數:
第一參數 pin 是 Arduino 接 HC-SR04 的 Echo 腳之 DIO 數位腳位編號。第二參數 value 是要偵測的位準 (LOW/HIGH),對於 HC-SR04 而言要用 HIGH。第三參數 timeout 是等候脈衝出現的延遲時間 (單位是微秒),預設是 1 秒 (即 1000000us),如果在 timeout 時間內未偵測到脈衝,則回傳 0。
開瀏覽器,連線 https://www.motoduino.com/,選最新版(ver6.0.0)
完成之積木程式
完成之積木程式
由序列埠視窗擷取儲存
將資料串接給 EXCEL (PAL_DAQ) 儲存,即時繪圖
將資料串接給通訊埠軟體儲存,再利用 Kst-Plot 即時繪圖
將資料儲存於 SD 卡
將資料串接給手機 App 儲存
將資料傳上雲端(IoT)
將資料透過通訊模組傳送,手機 App 接收儲存繪圖(IoT)
下載 ,PLX-DAQ-v2.11.zip。接壓縮後,參考資料夾內 Beginners Guide to PLX DAQ v2 (rev1).doc,依說明,要透過序列部串接 arduino 感測資料給 PLX-DAQ EXCEL 檔,序列埠資料格式如下:
setup():
Serial.println("CLEARSHEET"); //清空工作表所有資料(包含欄位名)
Serial.println("CLEARDATA"); //保留欄位名,刪除欄位名下所有資料
Serial.println("LABEL,欄位名一,欄位名二,欄位名三,......"); //設定作用工作表的第一列(標題列),將指定之欄位名寫入第一列
loop():
Serial.println("DATA,DATE,TIME,資料一,資料二,資料三,......."); //將感測資列由第一欄起依序寫入一列中。DATE:寫入系統日期,TIME:寫入系統時間
Serial.println("AUTOSCROLL_20"); 隨著資料一列列寫入,向上捲動,顯示最後 20 列資料。
完成之積木程式
DATA,DATE,TIME,
AUTOSCROLL_20
關閉序列埠視窗(一定要)
開啟 PortableArduino資料夾(C:\Arduino)\Excel\PLX-DAQ-v2.11.xlsm
自訂欄位名:這兒需三個欄位。日期、時間、距離
設定Arduino序列埠(COMxx)
設定序列埠傳輸速率(115200)
連線,開始接收數據
資料導入 EXCEL了,可做進一步科學上的統計分析
無現成積木可用。
先拉好積木後,於 Arduino IDE 改程式碼
Q:
A4 紙長、寬各若干?
B4 紙長、寬各若干? 36.4cm, 25.7cm
完成之積木程式
float ultrasonic_distance_7_8() {
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delayMicroseconds(5);
digitalWrite(7, HIGH);
delayMicroseconds(10);
digitalWrite(7, LOW);
unsigned long sonic_duration = pulseIn(8, HIGH);
float distance_cm = (sonic_duration / 2.0) / 29.1;
return distance_cm;
}
原程式為回傳計算後的距離(變數 distance_cm)
float ultrasonic_distance_7_8() {
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delayMicroseconds(5);
digitalWrite(7, HIGH);
delayMicroseconds(10);
digitalWrite(7, LOW);
unsigned long sonic_duration = pulseIn(8, HIGH);
float distance_cm = (sonic_duration / 2.0) / 29.1;
return sonic_duration;
}
更改為回傳 echo time(變數 sonic_duration)
完成之積木程式