學習目標 : 認識faya超音波距離感應模組的功能及使用方式
學習時間 : 50min
示範模組 : (1) faya brickNano
(2) faya蜂鳴器模組
(3) faya超音波距離感應模組
====================功能介紹====================
faya超音波距離感應模組採用市面上的超音波距離感應器(HC-HR04),他具有一對類似眼睛的超音波介面,一邊是發射器,另一邊是接受器,當發射器發出40KHz超音波,遇到障礙物時會反彈,接收器會感應到反彈回來的超音波,我們可以透過時間差來算出障礙物和模組間的距離,規格書上顯示此模組能夠量測從2~400公分的理想距離,應用在避障自走車、機器人、物體測距上都有不錯的效果。
HC-HR04簡單易用,只要幾行的指令就能夠測出感測距離。他的介面為Trig(輸入埠)和Echo(輸出埠),負責通知模組何時送出超音波訊號,何時收到超音波的反彈訊號。
- Trig埠 : 收到方波(10us)訊號後,會送出超音波
- Echo : 收到回彈的超音波訊號時,會送出HIGH訊號
模組的面板圖如下所示,右方有一個4pin的排母,其中上方的2pin為Trig埠,下方的2pin為Echo埠,上方標示Trig的2pin是相通的,下方標示Echo(但被遮住了)也是相通的,連接線路時,只要選擇其中一個孔位連接即可。

====================原理知識====================
以下解釋提供給有需要知道背後原理的人
HC-SR04的原理很簡單,當我們給模組一個10us的方波時,模組就會發射出8個40KHz的超音波,此時Echo會由LOW轉HIGH,等到模組接收到超音波的反彈訊號時,Echo由HIGH轉LOW。

===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)在串列埠監視視窗顯示超音波感應距離
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版

(2) 訊號線連接
Arduino_D5 ===> 超音波距離感應模組_Trig
Arduino_D6 ===> 超音波距離感應模組_Echo

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/8/21 | |
// Faya-Nugget 範例程式 (UltrasonicDistance_1.ino) | |
// 單元: 模組介紹:faya超音波距離感應模組 | |
// 網址: https://fayalab.blogspot.com/2017/08/UltrasonicDistance.html | |
// 目標: (1)在串列埠監視視窗顯示超音波感應距離 | |
// 接線: Arduino ==> faya模組 | |
// D5 ==> Trig (超音波距離感應模組) | |
// D6 ==> Echo (超音波距離感應模組) | |
unsigned long distance=0; //宣告distance變數 | |
#define Trig 5 //Trig = pin 5 | |
#define Echo 6 //Echo = pin 6 | |
void setup() { | |
Serial.begin(9600); //開啟串列埠, 9600bps | |
pinMode(Trig, OUTPUT); //設定trig為輸出埠 | |
pinMode(Echo, INPUT); //設定echo為輸入埠 | |
} | |
void loop() | |
{ | |
digitalWrite(Trig, HIGH); // 輸出Trigh為HIGH | |
delayMicroseconds(10); //維持10uS | |
digitalWrite(Trig, LOW); // 再轉LOW | |
distance=(pulseIn(Echo, HIGH)/58); // 利用pulseIn計算Echo的寬度(時間),再除以58uS的單位時間,算出感測距離 | |
Serial.print("Distance = "); //顯示字串 | |
Serial.print(distance); //顯示距離 | |
Serial.println(" cm"); //顯示單位 | |
delay(500); //每0.5秒測一次距離 | |
} |
備註:
- L22~L24: 產生10uS脈衝寬度,觸發Trig
- L25: 利用pulseIn( )函式讀取指定針腳(Echo腳位)的脈衝時間,指令的參數填入HIGH,函式會等待Echo腳位變為HIGH後開始計時,再等待Echo腳位變為LOW並停止計時。輸出的脈衝寬度單位為uS,因此除以58uS後得到公分。
範例結果:
目標:
(1)在串列埠監視視窗顯示超音波感應距離
(2)蜂鳴器根據感測距離,輸出週期性聲音,距離愈短輸出聲音愈急促
(3)距離小於3公分時,蜂鳴器長叫
接線:
(1) 電源線連接

Arduino_D5 ===> 超音波距離感應模組_Trig
Arduino_D6 ===> 超音波距離感應模組_Echo

Arduino_D13 ===> 蜂鳴器模組_BZ

範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/8/21 | |
// Faya-Nugget 範例程式 (UltrasonicDistance_2.ino) | |
// 單元: 模組介紹:faya超音波距離感應模組 | |
// 網址: https://fayalab.blogspot.com/2017/08/UltrasonicDistance.html | |
// 目標: (1)在串列埠監視視窗顯示超音波感應距離 | |
// (2)蜂鳴器根據感測距離,輸出週期性聲音,距離愈短輸出聲音愈急促 | |
// (3)距離小於3公分時,蜂鳴器長叫 | |
// 接線: Arduino ==> faya模組 | |
// D5 ==> Trig (超音波距離感應模組) | |
// D6 ==> Echo (超音波距離感應模組) | |
// D8 ==> BZ (蜂鳴器模組) | |
unsigned long distance=0; //宣告distance變數 | |
#define Trig 5 //Trig pin = 5 | |
#define Echo 6 //Echo pin = 6 | |
#define BZ 13 //Buzzer pin = 13 | |
void setup() { | |
Serial.begin(9600); | |
pinMode(Trig, OUTPUT); //設定Trig為輸出埠 | |
pinMode(Echo, INPUT); //設定Echo為輸入埠 | |
pinMode(BZ,OUTPUT); //設定BZ為輸出埠 | |
} | |
void loop() { | |
digitalWrite(Trig, HIGH); // 輸出Trigh為HIGH | |
delayMicroseconds(10); //維持10uS | |
digitalWrite(Trig, LOW); // 再轉LOW | |
distance=(pulseIn(Echo, HIGH)/58); // 利用pulseIn計算Echo的寬度(時間),再除以58uS的單位時間,算出感測距離 | |
Serial.print("Distance = "); //顯示字串 | |
Serial.print(distance); //顯示距離 | |
Serial.println(" cm"); //顯示單位 | |
if(distance <= 30 & distance >5) // 量測距離在30cm~5cm時 | |
{ | |
tone(BZ,784,10*distance); //發出G5(So)的音階,聲音長度和距離成正比 | |
delay(distance*20); //暫停發音,暫停時間和距離成正比 | |
} | |
else if (distance <= 5) // 量測距離在5cm以內時 | |
{ | |
tone(BZ,784,1000); // 發出長鳴 | |
} | |
else // 超過30時 | |
{ | |
delay(500); // 什麼事都不做,延遲500毫秒就好 | |
} | |
} |
備註:
- 蜂鳴器的使用方式,請參考faya蜂鳴器模組
- L34~L46: 感測距離分成三個範圍,30cm以上靜音,30~5公分發出嗶嗶聲,愈短愈急促,5公分以內直接長鳴。
- L36~L37: 透過tone()和delay()函式,讓鳴叫和休鳴的時間成正比,也就是距離長時,鳴叫的時間變長,休鳴的時間也變成,距離短時,鳴叫的時間變短,休鳴的時間也會變短,會有急促的感覺。
- L41: 只發出鳴叫,但沒有休鳴時間,因此如果一直在此距離時,會一直發出鳴長鳴聲
- L45: 距離太長時,什麼事也不做,就像上一個範例一樣,每0.5秒在串列埠監視視窗顯示超音波感應距離。
範例結果:
討論:
大家有沒有發現第二個範例就是在模擬倒車雷達的動作,通常車子後方會裝上三顆超音波測距元件(發射和接收為同心圓,價格較貴),在車子打倒車檔時開始動作,快撞到牆壁時,會發出急促甚至長鳴聲,如果有三個超音波同時運作,我們就能夠偵測是正後方,右後方還是左後方快要碰撞到了。
大家有沒有想到利用此模組達到有意思的創作呢? 歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
沒有留言:
張貼留言