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

/






サーボモーターと超音波距離センサーが一個づつ余っていた。遊びがてらそれらを組み合わせてレーダーでも作ってみようかなと思っていたが、ふと、物体の追跡ができないだろうかと考えてみた。二つセンサーがあれば簡単だが、一つのセンサーだけで追跡させるとなると工夫がいる。

ここではサーボモーター、超音波センサーの基本的な使い方を説明し、最後に物体を追跡させたプログラムを紹介していく。



サーボモーターを動かす


まずはサーボモーターの動作確認をしてみたい。何かのキットに付いていたSM-S2309Sというサーボモータを使用する。プログラムはこちらの記事を参考に、ほとんどそのまま利用させてもらった。
サーボモーターはPWMで制御する。50Hzくらいのパルス信号をSIG端子へ送信すれば良いようだ。PWMのデューティー比を変えることで角度を変えることができる。



ところでモーターやセンサーの電源はラズパイから拾うのではなく、別電源として用意した。やってみると分かるが、別電源にした方が動作が安定する。モバイルバッテリーに二つ口があったのでラズパイ用と、周辺機器用に分けている。




超音波距離センサーで距離を計測


今回使う超音波距離センサーはHC-SR04だ。40kHzの超音波で物体を測定する。

超音波で物体の距離が測れる仕組みは「やまびこ」に似ている。
まず、超音波というのは直進する性質を持っている。これを指向性と呼ぶ。目の前の物体に超音波が当たると自分の方へ跳ね返ってくる。音波を発信してから受信するまでの時間をT秒とすれば片道T/2秒かかる事になる。さて空気中の音の速度は気温20°で343m/sとわかっている。だからT/2*343で物体までの距離[m]がわかるということだ。

HC-SR04ではマイコン側から超音波の発信受信を簡単に行うことができる。
データシートにある通りTriggerピンを10μsの間オンにすると40kHzの超音波信号を自動で発するようになっている。



超音波の発信が終わった時点でEchoピンがオンになる。そして超音波が受信されたらEchoピンはオフになる。つまりEchoがオンになっている間の時間が先ほどのTであり、この時間を取得できれば距離も計算できるということだ。距離の取得を行う簡単なプログラムを次に記す。



一点注意しておきたいのが、HC-SR04とラズパイとの配線だ。HC-SR04の基準電圧は5Vとなっており、Echoからは5Vの信号が出力される。一方ラズパイのGPIOの基準電圧は3.3Vとなっている。だから直接接続するのはよろしくない。抵抗などで分圧させる方法もあるが、今回は3.3Vのツェナーダイオードで電圧降下をさせることにした。Echoからは瞬間的な電圧なので抵抗を省略しても動作するが、安全のために抵抗を入れる癖をつけた方が良いだろう。





物体を追跡させる


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



物体を見つけたら常にその右端または左端を狙うようにする。ごくわずかの角度だけ常に首を振ることで「見つけた」「見つけていない」を高速で繰り返すのだ。こうすることにより、物体の端を捉えることができる。物体が移動して見失ってしまったら、角速度を大きくしてすぐに見つけられるように首を振る。


この考えを元にプログラムを組んでみた。



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



今回のプロジェクトはGithubリポジトリへ公開したので参考に。
https://github.com/araemon/SonicSound


参考サイト


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


関連記事


* 10日で作る!倒立振子ロボット
* はじめてのステッピングモーター (Raspberry Pi zero)
* Raspberry Pi のセットアップ!モニター、キーボードなしでMacからSSH
* I2C通信でADコンバータの値を読み込む (Raspberry Pi zero)
* Raspberry Pi をAirPlayサーバーにしてオーディオ環境を快適にする!
* ラズパイオーディオシステムの省エネ化