🐺

PicoRubyで超音波距離センサー (HC-SR04) を使う

に公開

PicoRubyで各種デバイスを動かしてみようシリーズ3回目。今回は超音波センサーで距離を測ってみる。

材料

今回の材料は1個だけ。

材料 買い方・備考
超音波距離センサー 秋月電子で買ったHC-SR04。電子工作での定番センサーのようで、各種マイコンでの利用例が簡単に見つかる。ロボットにつけると目みたいになる。

配線

データシートによればインターフェースとしてGPIO, UART, I2Cに対応しているらしいがここではGPIOを使う。UARTとI2Cはやり方がよく分からなかった。


コードと動作確認

ロジックはSunFounderの解説を参考にさせてもらった。
以下コードを実行すると、1秒おきに距離を表示する。

trig = GPIO.new(17, GPIO::OUT)
echo = GPIO.new(16, GPIO::IN)

def get_current_time_us
  (Time.now).to_f * 1000 * 1000
end

loop do
  trig.write 0
  sleep 5.0 / 1000 / 1000
  trig.write 1
  sleep 10.0 / 1000 / 1000
  trig.write 0

  loop do
    break if echo.read == 1
  end
  t0 = get_current_time_us
  loop do
    break if echo.read == 0
  end
  t1 = get_current_time_us
  time_diff = t1 - t0

  d_cm = time_diff * 340 / 2 / 10000
  puts "distance: #{d_cm} cm"

  sleep 1
end

実際に動かしたところ。25cmくらいのところに物を置いてみた。小さくて見にくいが、だいたい25cmと表示されている。

もう少し詳しく

データシートによると、Trigに対してHIGHを10us送るとそれがトリガーになり、超音波を送って返ってくるまでの時間が計測される。結果はEchoから来るHIGHの長さになる。後は音速を使って距離を求めらえるので、やることは以下のようになる。

  1. TrigにLOWを送る。
  2. TrigにHIGHを10us送る。
  3. 一応Trigに再度LOWを送ってリセットしておく。
  4. EchoがHIGHになるまで待つ。HIGHになったらその時間をt0とする。
  5. EchoがLOWになるまで待つ。LOWになったらその時間をt1とする。
  6. time_diff = t1 - t0で、これが超音波の往復時間になる。
  7. time_diff [us] / 音速 [m/s] / 2 / 10000 で距離 [cm] を求める。音速は気温に依存するらしいが、ここでは340m/s。

Discussion