マイクロビット(e_08)HC-SR04 超音波距離センサー
HC-SR04
HC-SR04超音波距離センサーを使ってみようと思います。以下がHC-SR04の外観です。
HC-SR04は音波を使用して距離を測定します。性能は、測距範囲:2~400cm、精度:センサー基板正面を中心とした15度の範囲、分解能:0.3cmらしいです。
接続例
HC-SR04のデータシートをみると5.0V動作なので、micro:bitから電源供給ができません。別途、DC 5V電源が必要です。また、レベルコンバータを介しての接続になります。詳細はデータシートを参照してください。
micro:bitとの接続は以下のようにしました。外部の5V電源を使用します。
レベルコンバータを介して、micro:bitのPin0、Pin1を各々HC-SR04のECHO、TRIGと接続します。micro:bitのPin1からトリガ信号を出してHC-SR04のTRIGに送ります。トリガで音波を発信、受信したらECHOがL信号になります。その時間を測り距離を算出します。micro:bitのPin0でECHOのH信号時間を測ります。
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
以下は実体接続の写真です。
距離の算出
距離の算出です。
音速はC=331.5 + 0.6t(℃) (m/s)で計算できます。20℃なら343.5m/sになります。
そのため測定した時間をT(sec)とすると、L = (C x T)/2 (m)になります。(往復の時間なので2で割ってます)簡易的な計算は、20℃でL=0.017*T(cm)としておきます。
スクリプト
スクリプトは以下のようにしました。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
import machine
while True:
sleep(5000)
# TRG_PULSE
pin1.write_analog(0)
pin1.set_analog_period_microseconds(256) # 255<
pin1.write_analog(1) # 0-1023
# ECHO TIME
d = machine.time_pulse_us(pin0,1)
pin1.write_analog(0)
# L=(C m/sec x Tsec)/2 (m) C=331.5 + 0.6t(℃) (m/s)
# 温度補正 20℃ 343.5m/s
# L_cm = 0.017*echo(usec)
dist=0.017*d
print('%5d'%d,'%6.2f'%dist)
pin1でトリガを出しています。以下の部分だけで実測すると16usecでした。
pin1.write_analog(0)
pin1.set_analog_period_microseconds(256) # 255<
pin1.write_analog(1) # 0-1023
analog_periodを最小値の256に設定してもOSCで実測すると16usecでした。16usec以下にできなかったのでそのまま使ってます。
実行結果(ThonnyのShell表示)
遮蔽物を移動させて測定してみました。結果は以下のようになりました。大まかには問題無さそうです。データシートではトリガパルスは10usecですが、micro:bitからの16usecのトリガでも問題が無く動作していると思われます。
>>> %Run 1212_hc_sr04_01b.py
66 1.12 # 1cm
66 1.12
198 3.37 # 5cm
198 3.37
530 9.01 #10cm
511 8.69
798 13.57 #15cm
775 13.17
1095 18.61 #20cm
1079 18.34
1633 27.76 #30cm
1632 27.74
2212 37.60 #40cm
2234 37.98
2833 48.16 #50cm
2838 48.25
3001 51.02 #60cm 指向角15°内に遮蔽物がある
3088 52.50
温度補正
micro:bitには温度測定の関数があります。実際にはチップ温度ですが周囲温度とみなして音速を補正して見ました。スクリプトは以下のようにしました。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
import machine
# micro:bit temperature
r_temp=temperature() # micro:bitの温度測定
print('%3d'%r_temp) # 温度表示
while True:
sleep(5000)
# TRG_PULSE
pin1.write_analog(0)
pin1.set_analog_period_microseconds(256) # 255<
pin1.write_analog(1) # 0-1023
# ECHO TIME
d = machine.time_pulse_us(pin0,1)
pin1.write_analog(0)
# L=(C m/sec x Tsec)/2 (m) C=331.5 + 0.6t(℃) (m/s)
# 温度補正 20℃ 343.5m/s
# L_cm = 0.017*echo(usec)
c=331.5+0.6*r_temp # 音速の温度補正
dist=0.017*d
dist2=c*d/2*10**(-4)
print('%5d'%d, '%6.2f'%dist, '%6.2f'%dist2) # 時間、20℃、補正値
実行結果です。(ThonnyのShell表示)
>>> %Run 1212_hc_sr04_02b.py
23 # micro:bitの温度
3984 67.73 68.78 # usec、20℃、補正した距離(cm)
2838 48.25 49.00
2881 48.98 49.74
2817 47.89 48.64
1791 30.45 30.92
683 11.61 11.79
まとめ
micro:bitでHC-SR04超音波センサーを使ってみました。トリガパルスを16usecにしかできませんでしたが、支障なく距離測定ができたと思います。
追記
MOSI端子(DefautはPin15)からSPI通信でトリガパルスを送る方法もあるのかも知れません。後に気付きましたが、まだ試していません。