超音波式の測距センサー「HC-SR04」を使って、対象物までの距離を測定したので紹介します。今回使用した「HC-SR04」は、秋月さんで500円程度で販売されています。超音波センサーと聞くと高そうですけど、意外に安くで手に入ります。
ラズパイとの配線接続図は以下です。今回は、GPIOの22ピンと27ピンを使用しました。注意点として、センサ(HC-SR04)の電源が5Vで、ラズパイのGPIOが3.3Vなので、センサからの出力(Echo信号)を分圧して、電圧を下げてからラズパイ側に入力しています。
センサの制御方法はシンプルで分かりやすいです。
- Trig端子を10us以上Highにします。
- HC-SR04は、Trig端子がLowになってから、40kHZのパルスを8回送信します。
- HC-SR04は、対象物に反射したパルスを受信します。
- HC-SR04は、パルスの伝搬遅延時間分だけEcho端子をHighで出力します。
- Echo端子がHighになった時間を計測して対象物までの距離を算出します。
距離の算出式:Distance in cm = echo pulse width in uS/58
実際に、以下のような試験環境で、対象物(段ボール)を10cm~50cmまで5cm単位でずらしながら距離を計測しました。
計測結果です。思いのほか精度が出ていました。
実際の距離(cm) | 測定結果(cm) |
10 | 10.7740533763 |
15 | 15.1395797729 |
20 | 20.3477925268 |
25 | 25.0339508057 |
30 | 30.1024009442 |
35 | 34.9159898429 |
40 | 40.000882642 |
45 | 44.7733648892 |
50 | 49.7431590639 |
測定に使用した簡易プログラムです。プログラムを実行すると、計測距離が表示されます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
TRIG = 27
ECHO = 22
# GPIO端子の初期設定
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.3)
# Trig端子を10us以上High
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG, GPIO.LOW)
# EchoパルスがHighになる時間
while GPIO.input(ECHO) == 0:
echo_on = time.time()
# EchoパルスがLowになる時間
while GPIO.input(ECHO) == 1:
echo_off = time.time()
# Echoパルスのパルス幅(us)
echo_pulse_width = (echo_off - echo_on) * 1000000
# 距離を算出:Distance in cm = echo pulse width in uS/58
distance = echo_pulse_width / 58
print distance
これを使って、体温測定時の距離を計測できれば、自動でデータが取れるので助かりそうです。ちょっと、体温測定の補正値算出に使ってみようかと…