« 9980円のSIMフリーAndroidスマホ | トップページ | Windows XPのサポートを2019年まで延長できる!? »

2014年5月28日 (水)

Raspberry Piに超音波距離計”HC-SR04”つけてみた

最近思うところがあって(2回目)、Raspberry Piに”超音波距離計”ってやつをつけてみました。

使ったのは”HC-SR04”というArduino用の超音波距離計。

Img_5674jpg_2

安いセンサーで、お値段200円ほど。送料も安かったんですが、この状態で封筒に入れられ、普通郵便相当で送られてきました。大丈夫なのか!?

Img_5707

写真で見るよりは大きく感じるセンサーです。

Raspberry Piへの接続方法は簡単。4つのピンをそのままRaspberry Piにつなぐだけ。余計な回路や部品は不要。

以下のサイトを参考にしましたが

Using an Ultrasonic Sensor (HC-SR04) on a Raspberry Pi with Python — Byte Creation

上のサイトでは1kΩの抵抗をつけることになってますけど、付けたら反応が鈍くなってしまいます。無しでOKです。

Img_5694

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)

センサーの前に手などをかざして、

Img_5687

このpythonコードを実行します。

sudo python usonic.py

すると、こんな感じに値が帰ってきます。

Rpi_dis01

”19.0577・・・”などと出てきますが、どうやらmm単位の距離が出てくるみたいです。

いろいろと試してみましたが、大体3000mm程度までは測れそうです。値もまあまあ正確。

Img_5686

調子に乗って、前回作ったPCA9685につないだサーボ10個と、LEDランプの点灯(Lチカ、Raspberry PiとRubyでLED制御 - Raspberry Pi 電子工作参照)を同時に実行してみました。

問題なく動作します。

さて、一体こんなもので何をするつもりなのか?それはまたいずれ。

超音波距離センサーモジュール HC-SR04

« 9980円のSIMフリーAndroidスマホ | トップページ | Windows XPのサポートを2019年まで延長できる!? »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

昔の超音波センサーは「水分に注意!」だったと思うんですが。

しかし、楽しいものを調達されましたね。
たしかバンパーに超音波センサーを内蔵し
自家用車と周りの距離を検出させてたのは
トヨタが早かったような気がするんですが。

こんにちは、enuteaさん。

思ったより高精度で満足してます。これで数百円とは信じられないですね。

ただし空気中での減衰が大きいため、超音波式距離計は数mが限界だそうですが、まあとりあえずそれくらい測れれば私は満足ですね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Piに超音波距離計”HC-SR04”つけてみた:

« 9980円のSIMフリーAndroidスマホ | トップページ | Windows XPのサポートを2019年まで延長できる!? »

無料ブログはココログ

スポンサード リンク

ブログ村