MindStormsに付属しているセンサーは、タッチセンサーと光センサーである。タッチセンサーを使うとロボットが何かにぶつかった後、方向を変えたりすることができる。では、ぶつかる前に方向を変えることはできないか…。それを実現するのが、接近センサーである。MindStormsの本体RCXには他のRCXと通信するために赤外線を入出力する機能がついている。「一家に2台もRCXが、あるはずないから、こんな機能は無駄だ。」と私は思っていたのであるが赤外線を出力し、その反射を光センサーで読み取り、障害物を避けることができるのである。
「こうしろう、無限軌道車に光センサーつけて」、「どこにつければ、いいが?」、「うーん、赤外線を出すところの近くだろうね」、「うん」と言ってこうしろうが作ったロボットにはレゴ人ならでは気配りが施してあった。



光センサーを可動式にして角度を調節できるようになっている。「はーん、赤外線の反射がうまく読み取りできなかったら、角度を変えればいいがいね。」(富山弁解説:「いいが?」とか「いいがいね」という富山弁に、もう読者の方は慣れておられると思うので解説は割愛します。)「さあ、次はプログラム入力してみて」

int lastlevel;
task send_signal()
{
 while(true)
  {SendMessage(0);Wait(10);}
}

task check_signal()
{
 while(true)
 {
 lastlevel = SENSOR_1;
 if(SENSOR_1 > lastlevel + 200)
  {OnRev(OUT_C);Wait(115);OnFwd(OUT_A+OUT_C);}
 }
}

task main()
{
 SetSensorType(SENSOR_1,SENSOR_TYPE_LIGHT);
 SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
 OnFwd(OUT_A+OUT_C);
 start send_signal;
 start check_signal;
}

 RCXにプログラムをダウンロードしてテストすると、同じ場所でぐるぐるまわっている。「あれ、照明の光を読み取っているのかな…」などと悩み、モーターの配線が一本逆になっていることに気付くまで多くの時間を要してしまった。ミスはいつも簡単なところにあるのだが、必ず難しいところから疑ってしまう。これからは「ロボットを作ったら『かずのリモコン』で動作を確認する。」ということを今日の教訓とした。気を取り直してテストを行うと、タンスに衝突する15cm手前でロボットは見事に方向を変えた。「これ、すごいな」とこうしろうと父は声を揃えた。

 send_signalタスクでは {SendMessage(0);Wait(10);}で0.1秒に一回、赤外線を出力している。check_signal タスクでは、変数lastlevelに光センサーが読み取った値を格納し、次に読み取った値と比較している。「if(SENSOR_1 > lastlevel + 200)」の個所である。その差が200以上になったら、何かに近づいたと判断しているのである。