【PR】この記事には広告が含まれています。

超音波距離センサーHC-SR04を使って距離を計測する方法について解説します。

こちらがHC-SR04です。 秋月電子通商で300円で販売されています。

超音波の反射時間を利用して、非接触で距離を測ることができます。測定可能距離は2~400cmです。

ピンヘッダーが取付けされているので、はんだ付けせずにそのままブレッドボードに差し込んで接続することができます。
かなり接近して撮影しています。実物は相当小さいです。
超音波距離センサーとラズパイを接続するためのパーツ
①ブレッドボード

ブレッドボードを使用すると、センサーやジャンパワイヤのピンを穴に差すだけで簡単に接続ができるため、はんだ付けをする必要がなく、やり直しもできるため、とても便利です。
②ジャンパワイヤ

片側がブレッドボードの穴に差し込める「オス型」(ピン)で、もう一方がラズパイのピンに差し込める「メス型」になっているものが必要です。
③抵抗(1kΩ)×3

GPIOに5Vを入力するとラズベリーパイが壊れてしまうので、抵抗を使って電圧を下げます。

ブレッドボードとジャンパワイヤの接続はピンを差し込むだけで簡単にできます。
ラズベリーパイと超音波距離センサーを接続する。

まず、超音波センサHC-SR04のピンについて解説します。
①「VCC」 5V 電源
②「trig」 トリガー・・・ラズパイからの信号を受けると、超音波を送信します。GPIO27に接続します。
③「echo」 エコー・・・超音波を送信してから受信するまで、ECHO端子はHighになります。Highになっている時間の半分を音速で割った数値が距離になります。GPIO18に接続します。
④「gnd」 グランド
それでは下図のように配線していきます。

注意点は、抵抗を使うことです。ラズパイのGPIOピンは、3.3V用であるため、Echo信号をラズパイがそのまま受けると、GPIOが破損する恐れがあります。そこで、抵抗器を用いて分圧します。
超音波距離センサーを動かすためのプログラム
import RPi.GPIO as GPIO | |
import time | |
import sys | |
# HIGH or LOWの時計測 | |
def pulseIn(PIN, start=1, end=0): | |
if start==0: end = 1 | |
t_start = 0 | |
t_end = 0 | |
# ECHO_PINがHIGHである時間を計測 | |
while GPIO.input(PIN) == end: | |
t_start = time.time() | |
while GPIO.input(PIN) == start: | |
t_end = time.time() | |
return t_end - t_start | |
# 距離計測 | |
def calc_distance(TRIG_PIN, ECHO_PIN, num, v=34000): | |
for i in range(num): | |
# TRIGピンを0.3[s]だけLOW | |
GPIO.output(TRIG_PIN, GPIO.LOW) | |
time.sleep(0.3) | |
# TRIGピンを0.00001[s]だけ出力(超音波発射) | |
GPIO.output(TRIG_PIN, True) | |
time.sleep(0.00001) | |
GPIO.output(TRIG_PIN, False) | |
# HIGHの時間計測 | |
t = pulseIn(ECHO_PIN) | |
# 距離[cm] = 音速[cm/s] * 時間[s]/2 | |
distance = v * t/2 | |
print(distance, "cm") | |
# ピン設定解除 | |
GPIO.cleanup() | |
while True: | |
try: | |
# TRIGとECHOのGPIO番号 | |
TRIG_PIN = 27 | |
ECHO_PIN = 18 | |
# 気温24[℃]の場合の音速[cm/s] | |
v = 33150 + 60*24 | |
# ピン番号をGPIOで指定 | |
GPIO.setmode(GPIO.BCM) | |
# TRIG_PINを出力, ECHO_PINを入力 | |
GPIO.setup(TRIG_PIN,GPIO.OUT) | |
GPIO.setup(ECHO_PIN,GPIO.IN) | |
GPIO.setwarnings(False) | |
# 距離計測(TRIGピン番号, ECHO_PIN番号, 計測回数, 音速[cm/s]) | |
calc_distance(TRIG_PIN, ECHO_PIN, 1, v) | |
time.sleep(1) #1秒間待つ | |
except KeyboardInterrupt: #Ctrl+Cキーが押された | |
GPIO.cleanup() #GPIOをクリーンアップ | |
sys.exit() #プログラム終了 |
プログラムを実行すると、距離の測定が繰り返し行われて、結果が表示されます。測定を中止するには「ctrl」キーを押しながら、「C」を押します。
有機ELディスプレイに測定結果を表示させてみました。
こちら、ちょっとした活用事例です。
先ほどのプログラムを少しアレンジしています。
あらかじめセンサーから床までの距離を測っておいて、その値から頭までの距離を引いた数値が、身長になります。