超音波距離センサーで物体を追跡してみた【Raspberry Pi/HC-SR04】



超音波距離センサーとサーボモーターが手元にあったので、何か遊びで作ってみようということになった。
レーダーでも作ろうかと思ったが、それならば物体を追跡できないかという考えに至った。

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

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








超音波距離センサーで物体を追跡するために


今回使うセンサーは HC-SR04 である。
またコンピューターはラズパイの Raspberry Pi 3 を使う。

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

Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon



超音波で距離が測定できる仕組み


まずは超音波で距離が測定できる仕組みを説明しよう。

超音波、つまり音で物体の距離を測れる仕組みは「やまびこ」をイメージすると簡単だ。

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

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

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

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

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



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

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

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

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

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

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





HC-SR04で距離を計測する


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

Kuman 5個 超音波 センサーモジュール DC 5V 2cm-450cm 超音波センサHC-SR04+20ピンオスーメスデュポン線+超音波ステント Raspberry Pi B+Robot ロボットに交換 K18

Amazon


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


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

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


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

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

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



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



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

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

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


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






サーボモーターを動かす



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

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

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

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


動作確認のプログラムをPythonで書いてみた。





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

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







物体を追跡させる


最後に、物体を追跡させてみよう。
一つのセンサーで物体を追跡させるにはどの様にすれば可能だろうか?

私が考えた方法は次の通りだ。

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




こうすることにより、物体の端を捉えることができるはずだ。

もし物体が移動して見失ってしまったら、すぐに見つけられるように首を振る速度を速める。
つまりサーボモーターの 角速度 を大きくすれば良い。


これらの考えを元に、最終的にPythonで組んだプログラムがこちら。



条件分岐のフラグだらけで読みにくいプログラムになってしまったが、なんとか物体に追従することができたので良しとしよう。

その様子を動画にしてみたのでご覧いただきたい。




動画をみてもらえれば分かるが、物の動きが速すぎると見失ってしまう。
サーボモーターだと首振りの速度に限界がありそうだ。


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

これでラズパイで超音波距離センサーで物体を追跡してみた記事を終わる。

詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装

Sebastian Thrunらの名著『確率ロボティクス』の翻訳者であり、同分野の第一人者でもある、上田隆一氏が書き下ろす至極の入門書!理論→実装という一貫した流れで、丁寧に解説。まさにバイブル!

KindleAmazon




参考サイト


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




あなたにおすすめ