🤖

【Raspberry Pi】 距離を測ろう。

2022/09/25に公開

超音波を使って距離を測ります!

自動車に衝突防止機能がついて久しいですが、
秋月商店散策中に面白そうなものを見つけたので、使ってみます。
(戦車道においても敵との距離を把握することは大切だと思います。)

超音波距離センサー HC-SR04

超音波によって距離の計測が可能になるそうです。なんかカッコイイ。
PIN4本というのも良いですね。

距離センサー

最近このミニブレッドボードが大活躍しており、秋月商店に行くたびに購入しています。

画像左から GND, Echo, Trig, Vcc となっております。
Vccは電源プラス、GNDはマイナス。おなじみです。5V駆動ですので、ラズパイ5Vに繋ぎます。
Trigはラズパイからの出力、echoはラズパイへの入力です。この2PINはGPIOに繋ぎます。
Echoはラズパイへの入力となっていますが、ラズパイのGPIOは、5Vを入力すると危ないので、
抵抗を挟んで減圧したほうが良いそうです。(1KΩを挟んでいます。)

データシートを見ますと、
Trig を minimum 10マイクロ秒以上 HIGHにすると、モジュールが 8回 40KHzの超音波を送信し、
それを受信するということです。超音波を送信してから受信するまでの間、EchoがHeighになっているということなので、
音速を使って距離を計算しろとのことです。

TrigをHighにした後、EchoがHighの時間を測れという事です(大雑把)。
距離 = EchoがHighの時間 * (音速/2)

ではソースです。

# -*- coding: utf-8 -*-

import time
from time import sleep
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

TRIG = 5
ECHO = 6

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
        
for num in range(0,5):
    try:
        GPIO.output(TRIG, GPIO.LOW)
        sleep(0.5)
         
        GPIO.output(TRIG, True)
        sleep(0.00001)
        GPIO.output(TRIG, False)
 
        while GPIO.input(ECHO) == GPIO.LOW:
          low = time.time()

        while GPIO.input(ECHO) == GPIO.HIGH:
          high = time.time()

        distance = (high - low) * (340*100/2)
        print(distance)

    except KeyboardInterrupt:
        pass

GPIO.cleanup()

5回計測するソースです。
Arduino用のスケッチを参考にしています。
https://www.switch-science.com/catalog/1606/
超音波距離測定としては定番商品らしく、似通ったソースは多かったですね・・・。

Arduinoですと、パルス時間を測る際に、pulseInという関数があるようですが、
ラズパイにはないため、そしてpythonには無い為、このような記述となっております。
ECHOがLOWからHIGHになった瞬間の時間が、line25のendに入り、ECHOがHIGHからLOWになった瞬間の時間が、line28のhighに入ります。(ダジャレじゃないです。)
HIGHからLOWになれば、line27のループを抜けるため、high - lowでHIGHになっていた時間が分かります。
IF文では最初の一回しか取得できないためアウトです。またECHOは最初LOWであるため、
line24とline27のループ文を逆にすると、highループに入らないのでアウトです。

line30で距離の計算をしています。音速の約340m/sec をセンチメートルに直すため100倍し、
測定値は往復分の値であるため、半分にします。time.time()メソッドは戻り値が秒単位なので、掛け合わせれば距離が計算できます。

小学校の時、音速は340m/秒と教わった気がしますが、温度によって変わるそうです。
15℃で340m/sec、20℃で343m/sec、30℃で349m/sec 程度だとか。
今は20℃くらいなので、343m/secの方が良かったかもしれません。
温度センサを併用すれば、温度に応じた音速の計算も出来そうです。
今回そこまで厳密なものは求めていません。温度センサ行方不明
さて、では測定結果です。


10cm ラズパイラズパイ

15cm ラズパイラズパイ


結果の単位はcmです。
そもそもどこから測れば良いか不明ですが、調子が良いと誤差±5mm程度、何度か測定しましたが、1cm以上の誤差はありませんでした。
測定可能範囲が2cm~400cmですので、mm単位で考えなければ、なかなかの精度なのではないでしょうか。(今回気温とか無視してますし・・・)

まとめ

他のセンサーと組み合わせれば、面白いことが出来そうですね。
実はArduinoの方が使用用途としては適切なのでは、とか最近よく思いますが、今のところ浮気の予定はありませんよ。

GitHubで編集を提案

Discussion