最もポピュラーな超音波センサーHC-SR04を使って、距離を測定する実験を行いました。
HC-SR04で、センサーと物体までの距離を測定する手順は、次のとおりです。
1) micro:bitのpin0から10us幅以上のトリガパルスをHC-SR04のTrig端子に加えます。
2) HC-SR04から40KHzの超音波が発信され、物体に反射されて戻ってきます。Echo端子には、発信から受信に対応するEchoパルスが出力されます。
3) Echoパルスのパルス幅の時間t(s)を測定します。超音波は、センサーと物体の間の距離L(m)の2倍を進んだので、音速をV(m/s)とすると、2L = V * t より、L = (V*t)/2 となります。音速は、温度によって変化し、V(m/s)=331.5+0.6*temp(℃)で近似されます。精度を求めなければ、V=340m/sとすれば良いと思います。センサーと物体間の距離Lを下の図の式で、cm単位で計算します。
接続回路図です。HC-SR04は、5V動作ですので、HC-SR04のECHO出力を分圧して、micro:bitのpin1に入れています。
Trigパルスは、10us以上とされています。pin0からパルスを出力するには、
pin0.write_digital(1)
pin0.write_digital(0)
とすれば良く、これで下の図のように約70us幅のパルスが発生します。
TrigerパルスをHC-SR04に加えると、下の図のように物体までの距離に対応したEchoパルス(赤色)が帰ってきます。
スクリプトです。
ECHOパルスは、立ち上がりの時刻t1と立下りの時刻t2をutime_us()で測定し、その差をutime.ticks_diff(t2,t1)でパルス幅t(us)を求めます。
測定した距離Lは、cm単位でLEDにスクロール表示しています。
------------------------------------------------------
micro:bit HC-SR04による距離の測定
2019.11.28
JH7UBC Keiji Hata
'''
from microbit import *
import utime
# pin0初期化
pin0.write_digital(0)
# 音速を計算する
V = 0.6 * temperature() + 331.5
# トリガパルス
pin0.write_digital(1)
pin0.write_digital(0)
# 距離の測定と表示
while pin1.read_digital() == 0:
utime.sleep_us(1)
t1 = utime.ticks_us()
while pin1.read_digital():
utime.sleep_us(1)
t2 = utime.ticks_us()
t = utime.ticks_diff(t2, t1)
L = int(t * V / 20000)
display.scroll(L)
sleep(100)
測定の様子です。
実測の結果です。
L(cm) 測定値(cm)
10 8
20 19~21
30 30
40 38~40
50 49
60 57~60
70 68~70
80 78~79
90 88~90
100 98
110 109
120 117
130 122~124
140 122~124
といった具合でした。
1m程度までなら1~2cmの誤差で測定できました。1m以内ならほぼ実用になると思います。