🐺
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の長さになる。後は音速を使って距離を求めらえるので、やることは以下のようになる。
- TrigにLOWを送る。
- TrigにHIGHを10us送る。
- 一応Trigに再度LOWを送ってリセットしておく。
- EchoがHIGHになるまで待つ。HIGHになったらその時間をt0とする。
- EchoがLOWになるまで待つ。LOWになったらその時間をt1とする。
- time_diff = t1 - t0で、これが超音波の往復時間になる。
- time_diff [us] / 音速 [m/s] / 2 / 10000 で距離 [cm] を求める。音速は気温に依存するらしいが、ここでは340m/s。
Discussion