Raspberry Pi 電子工作 09:距離センサー(HC-SR04)で距離を測る
「HC-SR04」という電子部品があります。
これは、超音波を発射し、跳ね返ってきた超音波を検知するものです。
イルカなどと同じ原理ですね。
今回は、この電子部品をPythonから制御して、センサーからの距離を測定してみます。
1. センサーの購入
センサーを購入します。
|
|
|
|
2. 配線
センサーとRaspberry Pi を接続します。

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()