ひとまず、ロボットカーの仕様を検討。定番で、障害物回避ロボットを考えて、障害物検知のために距離センサをサーボモータに載せ、首振りさせてやることにしてみた。
きょうはまず、距離センサの実験。
前回試した、port 42001の通信をProcessingあたりでXBeeに流しこむのがいいのだろうけれど、動作確認が主目的なので、きょうはScratchセンサーボードのArduinoコードを改造することにした。
横川さんと阿部さんのコードでは、168のArduinoに合わせて、足りないアナログ入力端子で余った「抵抗D」を、抵抗Cと同じにすることでScratchに合わせている。その余った端子をいただく魂胆。
距離センサは、赤外線を使うPSD測距センサが無難だしそのままArduinoのアナログ入力端子に接続できるので簡単ではあるのだけれど、ちょうど手元に使っていないParallax社の超音波距離センサモジュール「PING)))」があったので、試してみることにした。
PING)))をArduinoで使うコードは、本家のチュートリアルにあるので、そのままいただいた。
PING)))の仕様では、ソナーの発信を2μ秒以上行ってから、反射音が受信されるまでの時間をマイクロ秒単位で計測する。上のコードでは、5μ秒の発信をしてから、ArduinoのpulseIn()関数で受信までの時間を計測している。その結果を29で割ってさらに2で割ると、cm単位のリニアな距離になるそうだ。PING)))の仕様書を見ると、3mまで測定できるらしい。
というわけで、借りたコードをそのままチャンネルDに突っ込んだコードが以下のもの。
SensorBoardWithMotorAndPing.pde
まったくもって何の工夫もない。 PING)))は、D5に接続することにしてある。
Scratch側でセンサーボードを表示すると、Dの値がcm単位で出る。しかし、センサーボードは0〜100までの整数値しか扱えないので、最大1mまでの計測ということになる。
きょうはとりあえずここまで。
続く首振りのためのサーボモータはServo関数があるので、例えばモータ用のPWM端子であるD11をanalogWrite()からServo.write()に置き換えればそれで済んでしまうけれど、そこまでやると、もとのセンサーボードとの互換性の問題があるので、やっぱり外部通信でやるべきかなと思う。