Raspberry Pi 電子工作 09:距離センサー(HC-SR04)で距離を測る

「HC-SR04」という電子部品があります。

これは、超音波を発射し、跳ね返ってきた超音波を検知するものです。

イルカなどと同じ原理ですね。

今回は、この電子部品をPythonから制御して、センサーからの距離を測定してみます。

 

 

1. センサーの購入

   センサーを購入します。


 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

超音波距離センサモジュール HC-SR04 [Arduino センサ関連]
価格:1705円(税込、送料無料) (2021/2/11時点)

楽天で購入

 

 

2. 配線

  センサーとRaspberry Pi を接続します。

f:id:kobatom5278:20210211131519p:plain

HC-SR04

 

3. Pythonプログラミング

  仕様はシンプルに、0.5秒ごとに距離を測定、20回ほど繰り返します。

  結果はターミナルに表示されます。

  なお、距離の算出は「乾燥空気」での音速、「33145 [cm/S]」を基にしています。

  正確な算出には、温度(室温)や湿度を加味する必要があるようです。

  今回は、精度はあまり気にせず、センサーを動かすことを目的とします。

  その精度についてですが、センサーのしくみ、超音波の跳ね返りを利用するためか、服を着た状態ではあまりうまく測れていないようです。

 

# -*- coding: utf-8 -*-
# 日本語コメントをエラーとしないように、UTF-8で保存

# 使用するライブラリのインポート
import time
import RPi.GPIO as GPIO

# 定数の定義
PIN_TRIG = 24
PIN_ECHO = 25
# 音速(cm / s)
SPEED_OF_SOUND = 33145

def init_GPIO():
    # GPIOの初期設定
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)

    GPIO.setup(PIN_TRIG, GPIO.OUT)
    GPIO.setup(PIN_ECHO, GPIO.IN)

def calc_distance():
    # 0.5秒ほど落ち着かせれる
    GPIO.output(PIN_TRIG, GPIO.LOW)
    time.sleep(0.5)
    # 0.00001秒間、超音波を発射
    GPIO.output(PIN_TRIG, True)
    time.sleep(0.00001)
    GPIO.output(PIN_TRIG, False)

    # 超音波が跳ね返ってくるまでの時間を計測
    while GPIO.input(PIN_ECHO) == 0:
        signaloff = time.time()
    while GPIO.input(PIN_ECHO) == 1:
        signalon = time.time()    
    time_passed = signalon - signaloff

    # 距離を計算する(音速 * 超音波を出力、戻ってくるまでの時間 / 2)
    distance = SPEED_OF_SOUND * time_passed / 2
    return distance

init_GPIO()

for measure in range(20):
    # 0.5 * 20 で、10秒間、0.5秒間隔で測定結果を表示
    # 測定結果が約0.5秒で取得されるので、
    # 0.5秒毎に距離が測定される
    distance = f'{calc_distance():.3f}'
    print(f'distance: {distance: >7} cm')

GPIO.cleanup()