超音波距離センサの仕組み[HC-SR04とラズパイの場合]

  • このエントリーをはてなブックマークに追加
  • Pocket

超音波距離センサは、計測対象物に超音波を発信して、その反射波を受信するまでの時間から、センサと対象物との距離を計算・検出するセンサです。
この記事では超音波距離センサHC-SR04とRaspberryPiを使って、超音波距離センサの距離検出の仕組みを紹介します。
記事の最後にRaspberryPiでHC-SR04を動かすサンプルコードも掲載します。

超音波距離センサの仕組み

超音波距離センサの仕組みは、超音波を計測対象に発射し、反射が返ってくるまでに要した時間と、音の進むスピードから距離を計算し求めるものです。距離測定の手順を示します。

①パルス発射・計測開始

②パルス伝搬中

②パルス伝搬中

③反射パルス到着・記録終了

④距離計算

実際に距離を測定してみる

以降はラズパイを使ってセンサ使って距離を測定します。

必要なもの

  • RaspberryPi2
  • ジャンパワイヤ(メス—メス)×4本
  • 超音波距離センサHC-SR04×1個

HC-SR04の仕様

測距範囲 2~400cm(15度の範囲、分解能:0.3cm)
電源電圧 DC 5.0V
動作電流 15mA
動作周波数 40kHz
トリガ信号 10μS(TTLレベルのパルス波)
エコー出力信号 反射(往復)時間
サイズ 45×20×15mm

※通電時の接続はGND端子から行ってください。

配線

HC-SR04(gnd)—GPIO6番ピン(GND)

HC-SR04(trig)—GPIO21番ピン

HC-SR04(echo)—GPIO20番ピン

HC-SR04(vcc)—GPIO4番ピン(5V)

コード

#!/usr/bin/python
class hcsr04:
    def measure(sensor):
        import time
        import RPi.GPIO as GPIO
        #GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        if sensor == 0:
            GPIO.setup(21,GPIO.OUT)
            GPIO.setup(20,GPIO.IN)
            GPIO.output(21, GPIO.LOW)
        
            time.sleep(0.3)
            GPIO.output(21, True)
            time.sleep(0.00001)
            GPIO.output(21, False)

            while GPIO.input(20) == 0:
              startTime = time.time()
            while GPIO.input(20) == 1:
              stopTime = time.time()
        
            timepassed = stpoTime - startTime    
            distance = timepassed * 17000
        
            return distance
        
            GPIO.cleanup()
        else:
            print "Incorrect usonic() function varible."
    print measure(0)

if __name__ == "__main__":
    pass

 

参考

超音波距離センサ(HC-SR04)を使う|Make.

超音波センサーってなに?仕組みとアプリケーション例から学ぼう!|富士エレクトロニクス株式会社

超音波距離センサー HC-SR04|秋月電子通商

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメント

  1. Swich より:

    電子回路の初心者です。記事を読んでいて気になったので質問させてください。
    どうしてEchoピン(GPIO.input(20))がHIGHになっている時間が超音波が返ってくるまでにかかった時間ということになるのでしょうか。
    これは超音波パルスの先頭が返ってきてから最後尾が返ってくるまでの時間ですよね。上の図でいうと、二つ目の②~③までの時間を測っているように思いましたが、違うのでしょうか。

    1. matu_mio より:

      コメントいただきありがとうございます。

      「Echoピン(GPIO.input(20))がHIGHになってる時間は、パルスの先頭が返ってきてから最後尾が返ってくるまでの時間でないか」
      つまりEchoピンは常にエコーの長さ分の時間(40kHz*8回=200ms(0.2s))HIGHを出力するのではないか、というご質問ですね。

      Echo(GPIO20番ピン)は反射波を中継している訳ではなく、センサの制御によってHIGHを出力している点が重要です。

      HC-SR04はデータシートによると、
      “(1) Using IO trigger for at least 10us high level signal,
      (2) The Module automatically sends eight 40 kHz and detect whether there is a pulse signal back.
      (3) IF the signal back, through high level , time of high output IO duration is the time from sending ultrasonic to returning.”

      (1)IOトリガ(GPIO21番ピン)に10μs以上のトリガ信号を入力すると
      (2)センサは40kHzのパルスを8回送信し、パルス信号が戻ってきたかどうかを検出する。
      (3)パルス信号(を発信してから)戻ってくるまでの間、(GPIO20番ピン)はHIGHを出力し続ける。
      とあります。

      このセンサは40kHz*8回のパルスを発信する直前から、反射したパルスを受信し始めるまでの間、エコー(GPIO20番ピン)でHIGHを出力し続けます。ただ、単純にエコー(GPIO20番ピン)がHIGHの時間が距離を示すのではなく、エコーの長さ(25ms*8回=200ms(0.2s)を考慮し、エコーの発信開始のタイミングで計測を始め、反射パルスの頭を受信した時点で計測を終了しているのです。

      各PINの入出力タイミングを図で示しました。
      [ https://mio.yokohama/wp-content/uploads/2018/05/HC-SR04Comment01.png ]

      またこちらのデータシートを参考にしております。
      [ http://akizukidenshi.com/download/ds/sainsmar/hc-sr04_ultrasonic_module_user_guidejohn_b.pdf ]

      稚拙な解説で恐縮ですが、また不明点があればコメントください。

matu_mio へ返信する コメントをキャンセル

*