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