2012年10月31日

用arduino+超音波模組測距

使用的超音波模組是HC-SR04,目前網購價錢最低只要95元,我買100元。同樣的模組價錢居然可以高到660元,購買時請多比價。

程式碼參考網址

原先的duration和distance以整數int宣告,但我需要小數點的精確數字,所以改以float宣告
test



接著為了能夠和PLX DAQ串接後以MS EXCEL呈現資料,所以修改不少程式碼。

用Excel可即時用折線圖呈現趨勢,下圖一個是xt圖,另一個是vt圖。有時候兩個時間點測量時,距離沒有改變,所以vt圖就會呈現v =0的狀態(折線上下跳動),解決方法應該是在excel中公式改寫成每10個或20個點測量一次速度改變。

test2

以下是arduino的程式碼
/*
HC-SR04 Ping distance sensor]
VCC to arduino 5v GND to arduino GND
Echo to Arduino pin 13 Trig to Arduino pin 12
More info at: http://goo.gl/kJ8Gl
*/

#define trigPin 12
#define echoPin 13
int time=0;
int row = 0;


void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.println("CLEARDATA");
Serial.println("LABEL,Time,X");
}


void loop() {
float duration, distance;
int intervaltime=100;  //每幾毫秒測量一次
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
Serial.print("DATA,");
Serial.print(time);
Serial.print(",");
Serial.println(distance);
time = time + intervaltime;
row ++;
delay(intervaltime);
if (row > 1000)
{
row=0;
Serial.println("ROW,SET,2");
}
}


以上的程式碼重點在於超音速測距的原理,是透過arduino發出訊號給超音波模組,然後發射端就會發出超音波,當超音波打到東西再返回時,接收端收到訊號告訴arduino。arduino計算這兩者的時間差Δt,Δt再除以2,那個就是單程所費的時間。

音速的計算方式和溫度有關
c = 331.5 + 0.6 * [攝氏]
20°C的時候, c = 331.5 + 0.6 * 20 = 343.5 m/s

換算成每微秒(ųs)幾公分的話,那就是
c = 343.5 * 100 / 1000000 = 0.03435 cm/ųs

假設在20°C,arduino計算的時間差Δt為 250 ųs,那麼測距就是
 250 * 0.03435 = 8.6 cm

除了用音速直接計算,也可以用速度的倒數(pace)來計算
The Pace of Sound = 1 / Speed of Sound = 1 / 0.03435 = 29.1 ųs/cm
因此距離就可以用 D = 250 / 29.1 = 8.6 cm



作這個東西是因為暑假時參加一個儀器商辦的研習,他們用貴森森的儀器作滑車加速度的測量。我猜想那個貴森森儀器應該是用超音波測量,所以我改用arduino+超音波模組,果然可以達到相同效果。