稼働中

マイクロビット(e_08)HC-SR04 超音波距離センサー

HC-SR04

HC-SR04超音波距離センサーを使ってみようと思います。以下がHC-SR04の外観です。
HC-SR04は音波を使用して距離を測定します。性能は、測距範囲:2~400cm、精度:センサー基板正面を中心とした15度の範囲、分解能:0.3cmらしいです。

HC-SR04

接続例

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信号時間を測ります。

SR04配線図
※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通信でトリガパルスを送る方法もあるのかも知れません。後に気付きましたが、まだ試していません。