利用超音波的發射、反射、接收所需的時間來計算距離,
所使用的原理跟公式網路上的說明非常多,但是對物理系的我來說公式都看得懂,
兜到程式上就是連結不起來,只好一步一步來了。
先講公式的原理,擷取自
https://atceiling.blogspot.com/2017/03/arduino_28.html
在攝氏零度之海平面音速約為331.5公尺/秒,每升高1攝氏度,音速就增加0.607公尺/秒,可以列出一個公式:
• 音速 c = 331.5 + 0.607 * t (其中 t 為攝氏溫度)。
例: 攝氏20度時的音速約為: 331.5 + 0.607*20 = 343.64 公尺/秒
因為我們是要把時間轉換成距離,所以知道速度之後,再把
• 音速公尺/秒 換算成 公分/微秒:343.64 * 100 / 1000000 = 0.034364 公分/微秒,亦即
音速每公分需要29.1 微秒: 1 / 0.034364 = 29.1 微秒/公分
不過,最前面有說過,這個模組的作用是發射、反射、接收所需的時間,因此實際上時間是兩倍,所以還要先把時間除以二。
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
cm = (duration/2) / 29.1; // 將時間換算成距離 cm
那,這個模組是怎麼計算出這個時間呢,擷取自
http://ming-shian.blogspot.com/2013/09/arduino-hc-sr04.html
還是脫離不了最前面所說的發射、反射、接收,重點就是發射超音波,接收反射的超音波,
Trig就是驅動發射超音波,Echo就是送出接收反射的超音波
依據下圖的規格,第一步就是送出10us的TTL pulse給Trig (
TTL pulse是什麼),
模組就會送出8個超音波,
最後再去接收時間,(要用pulseIn這個函數,讀取收到反射超音波的時間,所以要寫HIGH)
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT); // 讀取 echo 的電位
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
配合Otto的腳位,trig是8, echo是9,完整的測試碼如下所示
int trigPin = 8; //Trig Pin
int echoPin = 9; //Echo Pin
long duration, cm, inches;
void setup() {
Serial.begin (9600); // Serial Port begin
pinMode(trigPin, OUTPUT); //Define inputs and outputs
pinMode(echoPin, INPUT);
}
void loop()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT); // 讀取 echo 的電位
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
cm = (duration/2) / 29.1; // 將時間換算成距離 cm 或 inch
inches = (duration/2) / 74;
Serial.print("Distance : ");
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(250);
}