超音波で距離測定

raspi-distance Raspberry Pi 工作

購入した超音波距離センサー(HC-SR04)を使って距離測定実験をおこなってみます。このセンサーは外部からのトリガー信号で超音波を発信して、その反射波が戻ってくるまでの時間がパルス幅となるパルス信号を出力します。これによって、センサー前の超音波を反射する物体までの距離を取得することが出来ます。

センサーを正面から見るとこんな感じです。測定位置を高めにするためにブレッドボード3枚重ねにしていあります。

端子の信号

端子信号のTrigがTRIGGER(トリガー)信号の入力端子になります。Echoが反射波が返ってくるまでの時間に対応したパルス幅信号の出力端子になります。HC-SR04のデータシートによると、超音波は周波数40Kで8パルス分発射されます。このパルスの内の最後のパルス発射後にエコーパルスが立ち上がります。物体に反射して超音波が返ってくる(反射波)とエコーパルスは立下ります。よって、パルス発射の最後尾から反射波の先頭までの時間をパルス幅として得ることができます。このパルス幅から超音波を反射した物体までの距離は以下の計算式で得られます。

    物体までの距離 (cm) = エコーパルス幅(μs)/ 58

タイミングチャート

トリガーパルス発生とエコーパルス幅測定を行うPythonコードは以下になります。写真でグリーンのジャンパーワイヤーでロジアナにつないでいるのがTrigger信号で、Pythonコードではgreenと言う名前で定義しています。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(4, GPIO.IN)
GPIO.setup(18, GPIO.OUT)

green=GPIO.PWM(18, 10) 
green.start(0)
green.ChangeDutyCycle(1)

try:
  while True:
    count_total = 10
    time_total = 0
      for count in range(count_total):
        while GPIO.input(4) == 0:
          low_time = time.time()
        while GPIO.input(4) == 1:
          high_time = time.time()
        time_total += high_time – low_time
      time_ave = (time_total / count_total)*1000000
      print(“pulse width average(us)”, time_ave)
      print(“distance(cm)”, (time_ave/58))

except KeyboardInterrupt:
  pass

green.stop()
GPIO.cleanup()



Raspberry PiのPWMパルスとHC-SR04のEchoパルスをロジアナでモニターしました。

PWM周期を10Hzに設定していますが、ロジアナでも100ms周期(ロジアナスクリーンではエコーパルス周期になっていますが)になっています。正確にPWMが動作していることが分かります。

距離センサーから20cmのところに壁(バインダー)を設置して距離計算をしました。気温は22度です。7%程度の誤差がプラス方向(実際より長い距離方向)に発生しています。

pulse width average(us) 1250.1955032348633
distance(cm) 21.55509488335971
pulse width average(us) 1256.0129165649414
distance(cm) 21.655395113188646
pulse width average(us) 1232.1949005126953
distance(cm) 21.244739664011988
pulse width average(us) 1252.0313262939453
distance(cm) 21.586747005068023
pulse width average(us) 1263.7615203857422
distance(cm) 21.78899173078866
pulse width average(us) 1263.6184692382812
distance(cm) 21.786525331694506


次に部屋の壁から130cmの所にセンサーを置いて測定してみました。計算結果はおよそ120cmで今度はマイナス方向(距離が短くなる方向)に8%程度の誤差が生じました。

pulse width average(us) 6970.858573913574
distance(cm) 120.18721679161335
pulse width average(us) 6882.524490356445
distance(cm) 118.6642153509732
pulse width average(us) 6908.249855041504
distance(cm) 119.10775612140525
pulse width average(us) 6912.589073181152
distance(cm) 119.18257022726125
pulse width average(us) 6909.8711013793945
distance(cm) 119.13570864447232
pulse width average(us) 6952.261924743652
distance(cm) 119.86658490937332

距離精度についてはもう少しデータをとって確認してみたいと思っています。

コメント  

タイトルとURLをコピーしました