【Raspberry Pi】 距離を測ろう。
超音波を使って距離を測ります!
自動車に衝突防止機能がついて久しいですが、
秋月商店散策中に面白そうなものを見つけたので、使ってみます。
(戦車道においても敵との距離を把握することは大切だと思います。)
超音波によって距離の計測が可能になるそうです。なんかカッコイイ。
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の方が使用用途としては適切なのでは、とか最近よく思いますが、今のところ浮気の予定はありませんよ。
Discussion