大家好 我是阿俊 上次利用紅外線的特性 來達成偵測物體的感應 這次要使用超音波的特性來達成偵測物體和之間的距離 來達成事件的作動應用 在現實生活中 某些汽車倒車時 會啟動後保險桿上的 超音波模組 藉由 聲波反射特性 來達成 不同的距離有不同的警報聲 讓駕駛能夠辨別是否快撞到後方物體的防撞機制 先來實作得影片吧~~~
何為超音波?
超音波(Ultrasound、超音波)是指任何聲波或振動,其頻率超過人類耳朵可以聽到的最高閾值20kHz(千赫)。超音波由於其高頻特性而被廣泛應用於眾多領域,比如金屬探傷,工件清洗等。
某些動物,如狗隻、海豚、以及蝙蝠等等都有著超乎人類的耳朵,也因此可以聽到超音波。亦有人利用這個特性製成能產生超音波來呼喚狗隻的犬笛。(取至維基)
沒錯正常人是聽不到 超音波 應其頻率太高 超過耳朵可以聽到的範圍 也因為這樣 使用該特性 來達成 生活中所運用到的便利工具
準備材料
Arduino X 1
連接線 X N
蜂鳴器 X1
超音波模組 X1
官方程式編譯器
麵包板
超音波程式庫 下載後解壓到C:\Program Files (x86)\Arduino\libraries
超音波模組我則是使用HC-SR04 探測的距離為 2cm-400cm,精度為 0.3 cm感應角度為 15 度 價格 差不多100內有找
接下來是電路圖
SR04 接線電路 不會太難 4隻腳 按照圖接不太會有問題 其中Trig 和 Echo Trig是 發送 40KHz 超聲波給物體 Echo是接收 Trig碰撞物體反射回來的超聲波 探測距離的原理就是使用 Trig發送至少10µS寬度的脈波 發射後 Echo會由低電位變為高電位 直到接收到反射回來的超音波Echo由高電位回復為低電位 其中間的反應時間 藉由換算 得到我們可知的 公分 和 英吋
接下來是程式碼
// —————–新手實作 超音波應用(HC-SR04) 倒車雷達 by 阿俊 ~ //
#include <Ultrasonic.h> // 使用超音波的程式庫
#define TRIGGER_PIN 12 // 定義模組triger端為數位接腳12
#define ECHO_PIN 11 // 定義模組echo端為數位接腳11
int spk=13; // 定義揚聲器為數位接腳13
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); //設定HC-SR04初始化參數
void setup()
{
Serial.begin(9600);
pinMode(spk, OUTPUT);
}
void loop()
{
float cmMsec; // 定義浮動數
long microsec = ultrasonic.timing(); // 測距,返回的是一個時間單位(microsec)
cmMsec = ultrasonic.convert(microsec,Ultrasonic::CM); //將測得的時間單位計算為距離單位
Serial.print(” CM: “);
Serial.println(cmMsec);
if( cmMsec >= 80 && cmMsec <= 100){ // 假設距離介於80~100之間
for(int i = 0; i < 12000; i++) // 迴圈重複
digitalWrite(spk, 0);
digitalWrite(spk, 1);
delay(300);
}
else if (cmMsec >= 60 && cmMsec <= 79){ // 假設距離介於60~79之間
for(int i = 0; i < 12000; i++) // 迴圈重複
digitalWrite(spk, 1);
digitalWrite(spk, 0);
delay(100);
}
else if (cmMsec >= 40 && cmMsec <= 59){ // 假設距離介於40~59之間
for(int i = 0; i < 12000; i++) // 迴圈重複
digitalWrite(spk, 1);
digitalWrite(spk, 0);
delay(50);
}
else if (cmMsec >= 30 && cmMsec <= 39){ // 假設距離介於30~39之間
for(int i = 0; i < 12000; i++) // 迴圈重複
digitalWrite(spk, 1);
digitalWrite(spk, 0);
delay(20);
}
else if (cmMsec >= 20 && cmMsec <= 29){ // 假設距離介於20~29之間
for(int i = 0; i < 6000; i++) // 迴圈重複
digitalWrite(spk, 1);
digitalWrite(spk, 0);
delay(10);
}
else if (cmMsec <19){ // 假設距離小於19
digitalWrite(spk, 1);
delay(10);
}
else
digitalWrite(spk, 0);
}
這是有許多使用新的語法 其中 && 是邏輯閘應用語法 其中有 && (邏輯上的 and) || (邏輯上的 or) ! (not) 那又代表什麼呢? 我附上高中時的筆記~~
And 代表 兩件事為真才能通 Or 代表 只要一件事為真 就可以通 Not 只要是假的 就能通 所以 And( cmMsec >= 80 && cmMsec <= 100) 用意在於 讓他有介於某數和某數之間的 定義域
再來是 for for是迴圈用的語法 後面用到像(int i =0; i <X; i++) X為任意數 ++為遞增 i=0 一直加到不超過X 在X之前重覆執行 我用迴圈主要控制 蜂鳴器的 響應頻率 讓他有急促的感覺
總結
利用超音波讀取到的距離 在利用程式上的變化 來達成蜂鳴器的變化 越近越急的感覺 汽車的倒車雷達 其原理都一樣 我是阿俊 謝謝大家~~



請問 方便詢問一些事情嗎?
根本就沒辦法用阿 虎我喔
版主回覆:(12/04/2018 10:08:44 PM)
每個人的實作環境都不一樣,多多少少會有不同的情況發生,遇到難題的話不仿放上來詢問一下。
確實可用…讚
版主回覆:(12/04/2018 10:09:58 PM)
謝謝! 可以嘗試修改程式,自己做不同的效果!
請問有辦法增加控制led嗎
"Ultrasonic.h"找到多個程式庫
已使用: C:\Users\shi\Documents\Arduino\libraries\Ultrasonic
未使用: C:\Users\shi\Documents\Arduino\libraries\HCSR04Ultrasonic
未使用: C:\Program Files (x86)\Arduino\libraries\Ultrasonic
未使用: C:\Program Files (x86)\Arduino\libraries\HCSR04Ultrasonic
exit status 1
‘class Ultrasonic’ has no member named ‘timing’
多次都出現此此訊息
這是要新增zip程式庫的意思嗎
迴圈裡的digitalWrite 1/0 也可寫成 HIGH/LOW 吧!!
可考慮使用下例算法取代整段if-else if-else 邏輯.
long delayBase = cmMsec / 20;
if(delayBase <=5) {
for(int i = 0; i < 12000; i++) // 迴圈重複
digitalWrite(spk, 1);
digitalWrite(spk, 0);
delay(delayBase * 20+10);
}
請問這款超音波可以用在汽車盲區偵測上面嗎?我想要改改看,但是不知道下雨天或是溫度因素會部會造成誤判。
版主回覆:(12/04/2018 09:58:39 PM)
以單純超聲波的工作原理是可以用來探測物品的遠近,但是如果要向你所說的使用的話還需要不同的感測器去配合,必竟以超聲波而言環境的變數太多了,需要用不同的感測器配合效果才會好喔!
你好我是Arduino初學者想請教是否有中文書可學.謝謝
版主回覆:(12/04/2018 10:01:08 PM)
通常的話可以考慮網路上的一些電子書大部分都可以找到的還不錯的資源而且有些是免費的,再配合實作學習效果會更好!