超音波距離センサは、計測対象物に超音波を発信して、その反射波を受信するまでの時間から、センサと対象物との距離を計算・検出するセンサです。
この記事では超音波距離センサ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
電子回路の初心者です。記事を読んでいて気になったので質問させてください。
どうしてEchoピン(GPIO.input(20))がHIGHになっている時間が超音波が返ってくるまでにかかった時間ということになるのでしょうか。
これは超音波パルスの先頭が返ってきてから最後尾が返ってくるまでの時間ですよね。上の図でいうと、二つ目の②~③までの時間を測っているように思いましたが、違うのでしょうか。
コメントいただきありがとうございます。
「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 ]
稚拙な解説で恐縮ですが、また不明点があればコメントください。