2011年7月7日木曜日

Scratchに距離センサをつないでみる

Scratch+Arduinoで次はなにをしようかと考えて、遠隔操縦のロボットカーでもやってみようかと考えてみた。通信はXBeeを使う予定。

ひとまず、ロボットカーの仕様を検討。定番で、障害物回避ロボットを考えて、障害物検知のために距離センサをサーボモータに載せ、首振りさせてやることにしてみた。

きょうはまず、距離センサの実験。

前回試した、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()に置き換えればそれで済んでしまうけれど、そこまでやると、もとのセンサーボードとの互換性の問題があるので、やっぱり外部通信でやるべきかなと思う。