超音波距離センサーを使って物体を追跡してみた (Raspberry Pi, HC-SR04)



超音波距離センサーとサーボモーターで遊んでみたくなった。
最初はレーダーでも作ってみようと思ったが、同じような理屈で物体に追従させてみようと思った。

二つセンサーがあれば物体の追従は正確で簡単ではあるが、一つのセンサーだけで追跡させるとなると少し工夫がいる。

人間に例えれば、片目、または片耳だけで方向を探知しようということだ。



今回使う超音波センサーHC-SR04は、二つの目があるように見えるが、これは片方が音を発して、もう片方は受信するだけなので、人間で言うところの片目、片耳といって良い。


この記事では超音波センサーおよび、サーボモーターの基本的な使い方を説明していき、最後に動画にあるような超音波で物体に追従させたロボットを紹介していく。





01.音で距離が測定できる仕組み


音で物体の距離を測れる仕組みは「やまびこ」をイメージすれば良い。

音を発してから測定物に当たって、跳ね返ってくるまでの時間を測れば良いのだ。
都合の良いことに、空気中の音の速度は大体決まっている。

それは、気温20°で343m/sとなっている。

音は高音になればなるほど直進する性質を持っていて、これを指向性と呼ぶ。

指向性が高いほど、ピンポイントで物体に焦点を当てられるメリットがあるのだ。

逆に低周波だとぼんやりとしていて、どこから跳ね返ってきたのか分からなくなってしまう。低周波の波長は数十センチから数メートルもあったりするので、そもそも近距離の測定には向いていない。



それでは、次がその計算方法だ。

ここでは、音を発信してから受信するまでの時間を測定できたとして、その時間を T秒 とする。
片道の時間は2で割った値、T/2秒 ということになる。

空気中の音の速度は 気温20°で343m/s であることが分かっている。

そこで中学生の頃に勉強したはずの、速度 x 時間 = 距離 で計算できるということだ。

つまり T/2 x 343 が、物体までの 距離[m] となるのだ。

$$ Distance = \frac{T}{2} \times 343 $$



02.HC-SR04で距離を計測する




今回使う超音波距離センサーは HC-SR04 である。
このセンサーは周波数40kHzの音波で、物体を測定する仕様となっている。

HC-SR04 では、超音波の発信から受信までを自動でやってくれるようになっている。
マイコンからは発信のトリガーと、受信までにかかった時間を測定すれば良いだけだ。


Triggerピンを10μsの間オンにすることで、40kHzの超音波信号を発信する。

HC-SR04 PDFデータシートより


そして超音波の発信が終わった時点で、Echoピンが オン になる。
跳ね返ってきた超音波が受信されたら、今度はEchoピンが オフ になる。

つまり、Echoがオンになっている間の時間がTである。

$$ Distance = \frac{T}{2} \times 343 $$



実際に距離の測定を行ったプログラムがこちら。



一点注意しておきたいのが、HC-SR04とラズパイとの配線だ。

HC-SR04の基準電圧は5Vとなっており、Echoからは5Vの信号が出力される。
一方ラズパイのGPIOの基準電圧は3.3Vとなっている。

今回のセンサーの場合、受け取る信号が瞬間的な電圧なので抵抗を省略しても動作するが、安全のために抵抗を入れる癖をつけた方が良いだろう。


だから、直接接続するのはよくない。
抵抗などで分圧させる方法もあるが、今回は3.3Vのツェナーダイオードで電圧降下をさせてみた。







03.サーボモーターを動かす



今回は距離の測定だけでなく、物体の動きに追従できるようにしてみたいので、サーボモータを使ってみよう。

まずはサーボモーター動作確認しておこう。
何かのキットに付いていた SM-S2309S というサーボモータだが、これで十分そうなので採用することにした。

サーボモータの動かし方は、こちらの記事を参考にさせてもらった。

サーボモーターはパルス幅変調(PWM)で制御する。
50Hz辺りのパルス幅変調を、SIG端子へ送信することで位置が決定する。
信号のデューティー比を変えることで、角度が決まるようになっている。


動作確認のプログラムがこちら。





ところで、モーターやセンサーの電源はラズパイから拾うのではなく、別電源として用意するべきだ。
特にモーターの消費電力は大きいので、別電源にしないと動作が不安定となる。

このようにモバイルバッテリーに二つ口があったのでラズパイ用と、周辺機器用に分けてみた。






04.物体を追跡させる


最後に、一つのセンサーで物体を追跡させるにはどの様にして実現できるだろうか?
私が考えた方法は次の通りだ。

物体を見つけたら常にその右端または左端を狙うようにする。
ごくわずかの角度だけ常に首を振ることで「見つけた」「見つけていない」を高速で繰り返すのだ。




こうすることにより、物体の端を捉えることができるだろう。
そして物体が移動して見失ってしまったら、角速度 を大きくし、すぐに見つけられるように首を振る速度を速めるのだ。

これらの考えを元に、次のようなプログラムを組んでみた。



条件分岐のフラグだらけで読みにくいプログラムになってしまったが、動画のようになんとか物体に追従することができたので良しとしよう。
物の動きが速すぎると見失ってしまうのは、首振り速度の限界か。




今回のプロジェクトは、Githubリポジトリへ公開しているので、よかったら参考にしてもらいたい。
https://github.com/araemon/SonicSound




05.参考サイト


Raspberry Piでサーボモーターを回す
超音波距離センサ(HC-SR04)を使う
HC-SR04データシート
Arduino Radar Project



あなたにおすすめ