這顆sensor 蠻好玩的... 它可以用超音波的量測方式...來測量在他前面的障礙物的距離....
然後它所提供的sample code非常簡單...
# GrovePi + Grove Ultrasonic Ranger from grovepi import * # Connect the Grove Ultrasonic Ranger to digital port D4 # SIG,NC,VCC,GND ultrasonic_ranger = 4 while True: try: # Read distance value from Ultrasonic print ultrasonicRead(ultrasonic_ranger) except TypeError: print "Error" except IOError: print "Error"
他就直接呼叫 ultrasonicRead(port_num);
就可以得到距離值....用是很好用....不過以後要移植平台時...這樣就不行了
所以還是來研究一下他去怎麼實作的
從他的連結所下載的ultrasonic.zip來看
它提供了兩個function....
一種是 measure in centimeter.....
一種是 measure in inch
那來看看他的實作 ....
/*The measured distance from the range 0 to 400 Centimeters*/
void Ultrasonic::MeasureInCentimeters(void)
{
pinMode(_pin, OUTPUT);
digitalWrite(_pin, LOW);
delayMicroseconds(2);
digitalWrite(_pin, HIGH);
delayMicroseconds(5);
digitalWrite(_pin,LOW);
pinMode(_pin,INPUT);
duration = pulseIn(_pin,HIGH);
RangeInCentimeters = duration/29/2;
}
從這段code來看....
1.set low 2ms
2. set high 5ms
3. 然後set low之後...設成input mode
4. 接下來量取 ultrasonic 這次傳輸(拉high一段時間...再拉low)....level為high的時間為多少
5. 得到的答案就是 duration_time /29/2
其實它的原理就是用超音波的速度*時間來得到 距離...由於時間是算來回的時間
所以要除以2......
音波的速度為 每秒 330公尺...這是一個大概值....以公式來說就是 331.5 + 0.6*溫度
如果以室溫20度來說....速度大概就是 331.5*0.6*20 = 343 (m/s)
從上段的code來看.... pulseIn 所回傳的單位是 微秒(10^-6)
t*10^-6 * 343 /2*100 = t*0.0343/2 = t/29/2
公式就是這樣來的....
Reference 1: http://www.seeedstudio.com/wiki/Grove_-_Ultrasonic_Ranger
Reference 2: http://www.seeedstudio.com/wiki/images/9/95/Ultrasonic.zip
Reference 3: https://developer.mbed.org/cookbook/Seeed-grove-ultrasonic-ranger
Reference 4: Make :感測器運用Arduino 和Raspberry Pi 感測的專題與實驗
沒有留言:
張貼留言