超音波を利用して、距離を測る仕組み
超音波測距モジュールは、超音波が障害物に当たると反射する原理を利用します。超音波が送信されてから障害物に反射して戻ってくるまでの時間間隔から距離を算出することができます。
使用モジュール
HC-SR04

コード
from machine import Pin
import time
Trig = Pin(19, Pin.OUT, 0)
Echo = Pin(18, Pin.IN, 0)
distance = 0
soundVelocity = 340
def getDistance():
"""
超音波センサーを使って距離を測定する
Returns:
int: 距離(cm)
Examples:
distance = getDistance()
print("Distance: ", distance, "cm")
"""
# 超音波距離モジュールを10usだけHIGHにする(トリガー信号を送信)
Trig.value(1)
time.sleep_us(10)
Trig.value(0)
# Echo信号がHIGHになるまで待つ
while not Echo.value():
pass
pingStart = time.ticks_us()
# EchoピンのHIGH状態が終了するまで待つ
while Echo.value():
pass
pingStop = time.ticks_us()
# エコー時間を計算(往復の時間の半分を算出)
distanceTime = time.ticks_diff(pingStop, pingStart) // 2
# 距離を算出(音速×片道にかかった時間、音速はcm/μs単位)
distance = int(soundVelocity * distanceTime // 10000)
return distance
time.sleep(2)
while True:
time.sleep(1) # 1秒ごとに測定
distance = getDistance()
print("Distance: ", distance, "cm")
ポイント①: EchoピンのHIGHとLOWの状態
超音波距離モジュールには超音波を送信するTrigピンと、超音波を受信するEchoピンがあります。
Trigピンに10us以上の高レベルパルスを出力すると、モジュールが超音波を送信し始めると同時に、EchoピンがHIGH状態になります。
モジュールが障害物に反射して戻ってきた超音波を受信した瞬間、EchoピンはLOW状態になります。
ポイント②: 出力単位を合わせる
distance = int(soundVelocity * distanceTime // 10000)
この部分での//10000は、単位をそろえるために行っています。内訳としては以下の通りです。
- soundVelocityはm/sなので、出力したい単位のcmに合わせるために*100する。
- distanceTimeはμsなので、soundVelocityのm/sに合わせるために//1000000する。
感想
想像では30センチ程度しか測れないのではないかと思っていたのですが、今回使用したモジュール(HC-SR04)でも450cm未満の範囲で計測できるとのことで、安価なモジュールでも思っていた以上に長い距離が測れると知り驚きました。
実際の使用用途としてはドアの開閉の検知などが多いようですが、自分の頭くらいの高さから地面にセンサーを向けて計測してみるときちんと自分の身長と一致していました。久しぶりに身長を測りたい方、超音波距離モジュールで身長測定に挑戦してみてはいかがでしょうか。