Raspberry Piに超音波距離計”HC-SR04”つけてみた
最近思うところがあって(2回目)、Raspberry Piに”超音波距離計”ってやつをつけてみました。
使ったのは”HC-SR04”というArduino用の超音波距離計。
安いセンサーで、お値段200円ほど。送料も安かったんですが、この状態で封筒に入れられ、普通郵便相当で送られてきました。大丈夫なのか!?
写真で見るよりは大きく感じるセンサーです。
Raspberry Piへの接続方法は簡単。4つのピンをそのままRaspberry Piにつなぐだけ。余計な回路や部品は不要。
以下のサイトを参考にしましたが
Using an Ultrasonic Sensor (HC-SR04) on a Raspberry Pi with Python — Byte Creation
上のサイトでは1kΩの抵抗をつけることになってますけど、付けたら反応が鈍くなってしまいます。無しでOKです。
Raspberry Piの電子工作入門キット買ってみたのときに入手したブレッドボードを利用してつなぎました。
Raspberry Piへの接続は以下の通り(Raspberry Piの黄色いビデオ端子を上向きにしたときのピンの配置で示します)。
・ VCC(赤線)を上段の左から1つ目のピン(5V)
・ Trig(緑線)を下段の左から6番目のピン(GPIO 17)
・ Echo(青線)を下段の左から7番目のピン(GPIO 27)
・ GND(黒線)を上段の左から10番目のピン(GND)
へそれぞれ挿します。
つづいて、ソフト編です。
前回のサーボモーター編と同じで、pythonを使います。Raspberry Piへのpython導入などは前回記事を参照。
HC-SR04用を制御するpythonコードを記述します。
Raspberry Piにて
sudo vi usonic.py
と入力(”vi”のところは”nano”でもOK)。
以下のコードを入力します。
#!/usr/bin/python
# remember to change the GPIO values below to match your sensors
# GPIO output = the pin that's connected to "Trig" on the sensor
# GPIO input = the pin that's connected to "Echo" on the sensor
def reading(sensor):
import time
import RPi.GPIO as GPIO
# Disable any warning message such as GPIO pins in use
GPIO.setwarnings(False)
# use the values of the GPIO pins, and not the actual pin number
# so if you connect to GPIO 25 which is on pin number 22, the
# reference in this code is 25, which is the number of the GPIO
# port and not the number of the physical pin
GPIO.setmode(GPIO.BCM)
if sensor == 0:
# point the software to the GPIO pins the sensor is using
# change these values to the pins you are using
# GPIO output = the pin that's connected to "Trig" on the sensor
# GPIO input = the pin that's connected to "Echo" on the sensor
GPIO.setup(17,GPIO.OUT)
GPIO.setup(27,GPIO.IN)
GPIO.output(17, GPIO.LOW)
# found that the sensor can crash if there isn't a delay here
# no idea why. If you have odd crashing issues, increase delay
time.sleep(0.3)
# sensor manual says a pulse ength of 10Us will trigger the
# sensor to transmit 8 cycles of ultrasonic burst at 40kHz and
# wait for the reflected ultrasonic burst to be received
# to get a pulse length of 10Us we need to start the pulse, then
# wait for 10 microseconds, then stop the pulse. This will
# result in the pulse length being 10Us.
# start the pulse on the GPIO pin
# change this value to the pin you are using
# GPIO output = the pin that's connected to "Trig" on the sensor
GPIO.output(17, True)
# wait 10 micro seconds (this is 0.00001 seconds) so the pulse
# length is 10Us as the sensor expects
time.sleep(0.00001)
# stop the pulse after the time above has passed
# change this value to the pin you are using
# GPIO output = the pin that's connected to "Trig" on the sensor
GPIO.output(17, False)
# listen to the input pin. 0 means nothing is happening. Once a
# signal is received the value will be 1 so the while loop
# stops and has the last recorded time the signal was 0
# change this value to the pin you are using
# GPIO input = the pin that's connected to "Echo" on the sensor
while GPIO.input(27) == 0:
signaloff = time.time()
# listen to the input pin. Once a signal is received, record the
# time the signal came through
# change this value to the pin you are using
# GPIO input = the pin that's connected to "Echo" on the sensor
while GPIO.input(27) == 1:
signalon = time.time()
# work out the difference in the two recorded times above to
# calculate the distance of an object in front of the sensor
timepassed = signalon - signaloff
# we now have our distance but it's not in a useful unit of
# measurement. So now we convert this distance into centimetres
distance = timepassed * 17000
# return the distance of an object in front of the sensor in cm
return distance
# we're no longer using the GPIO, so tell software we're done
GPIO.cleanup()
else:
print "Incorrect usonic() function varible."
print reading(0)
センサーの前に手などをかざして、
このpythonコードを実行します。
sudo python usonic.py
すると、こんな感じに値が帰ってきます。
”19.0577・・・”などと出てきますが、どうやらmm単位の距離が出てくるみたいです。
いろいろと試してみましたが、大体3000mm程度までは測れそうです。値もまあまあ正確。
調子に乗って、前回作ったPCA9685につないだサーボ10個と、LEDランプの点灯(Lチカ、Raspberry PiとRubyでLED制御 - Raspberry Pi 電子工作参照)を同時に実行してみました。
問題なく動作します。
さて、一体こんなもので何をするつもりなのか?それはまたいずれ。
« 9980円のSIMフリーAndroidスマホ | トップページ | Windows XPのサポートを2019年まで延長できる!? »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« 9980円のSIMフリーAndroidスマホ | トップページ | Windows XPのサポートを2019年まで延長できる!? »
昔の超音波センサーは「水分に注意!」だったと思うんですが。
しかし、楽しいものを調達されましたね。
たしかバンパーに超音波センサーを内蔵し
自家用車と周りの距離を検出させてたのは
トヨタが早かったような気がするんですが。
投稿: enutea | 2014年5月29日 (木) 23時40分
こんにちは、enuteaさん。
思ったより高精度で満足してます。これで数百円とは信じられないですね。
ただし空気中での減衰が大きいため、超音波式距離計は数mが限界だそうですが、まあとりあえずそれくらい測れれば私は満足ですね。
投稿: arkouji | 2014年5月30日 (金) 21時55分