超音波センサを使ったプログラミングに挑戦(その1)
1 超音波センサとは
2 超音波センサの取り付け
3 超音波センサで距離を測る
4 正面の超音波センサで障害物をよける

ロボット講座の10回目です。前回は、ホールセンサをRaspberryPiのGPIOに接続し、車輪に取り付けた磁石の磁気を感知するところからスタートし、車輪の回転数を計測、その回転数とその時のデューティ比を記録、記録された結果に基づいて動作を再現するという、一連のセンサによる計測結果に基づいたティーチングを行いました。

今回は超音波センサをRaspberryPiのGPIOに接続し、壁などの障害物の有無、障害物からの距離を検知し、壁を避けて走行するロボットカーの制御に挑戦しました。
1 超音波センサとは

超音波センサとは、目には見えない「音の波」を使って、物の距離を測る装置です。超音波を出すトランスミッターという素子と跳ね返ってきた超音波を受けるレシーバという素子で構成されています。発信した超音波が跳ね返ってくるまでの時間を測り、音速が約340メートル毎秒 (m/s)であることから計算で物体までの距離を出します。
自動ドアや車の近接センサ、ロボットなどにも使われています。今回使用している超音波センサモジュールはHC-SR04で、VCCが5V、Triggerピンに10µsのパルスを入力するとTransmitter(送信機)から40kHz、8サイクルのパルスが出力され、ピンがHighになります。反射して きたパルスをReceiver(受信機)が受信するとEchoピンがLowになります。

この一連の動作を利用して、ほぼリアルタイムに障害物を検知、また障害物への距離を測ることができます。
2 超音波センサの取り付け
超音波センサをロボットカーのフロントと左右に取り付け、RaspberryPiのGPIOに下図のように配線しました。


超音波センサの電源は5Vで、センサの出力(Echo)も5Vとなります。それをそのままラズパイの入力端子に接続するとラズパイが壊れてしまので、2.7kΩと4.7kΩの抵抗で分圧して3.3V以下にしてBCM19ピンに入力しました。Trigger端子は3.3ⅤでそのままBCM20ピンからの信号を受けます。
3 超音波センサで距離を測る
今回使用しているHC-SR04という超音波センサは約2cmから約4mまで測定が可能です。早速、超音波センサで使ってみます。
超音波センサを利用するには、DistanceSensorという便利なクラスがあるので、これを使用しました。
DistanceSensorはecho端子とtrigger端子を指定したオブジェクト(このプログラムではfront_sensor)を生成し、そのオブジェクトに.distanceというメソッドを与えれば超音波を発信してから受信するまでの時間を測定して距離をメートルで出してくれます。3つの超音波センサが働いているかどうか、Pythonのプログラムを使用してチェックします。
4 正面の超音波センサで障害物をよける
超音波センサの取り付けとチェックが完了したら、フロントに取り付けたセンサだけを使って障害物を回避するコントロールに挑戦しました。

周囲をべニア板の壁に囲まれたフィールド内でロボットカーを走行させ、壁に近づいたら方向を変え、衝突を回避しながら走行し続ける制御に挑戦です。フロントの超音波センサだけなので、ロボットカーが壁と平行になってしまうと、壁に衝突する恐れがあります。ロボットカーの動作に工夫が必要です。
試行錯誤を重ねながら左右のモータのデューティ比を変え、動作時間を設定し、みんな壁を回避してロボットカーを走行させることができるようになりました。
