2019年6月17日 星期一

HC-SR04超音波測距模組


利用超音波的發射、反射、接收所需的時間來計算距離,
所使用的原理跟公式網路上的說明非常多,但是對物理系的我來說公式都看得懂,
兜到程式上就是連結不起來,只好一步一步來了。

















先講公式的原理,擷取自   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);
}












沒有留言:

張貼留言