10月7日 前回はNQCでタッチセンサーを使う方法を勉強した。今日は光センサーをプログラミングをしてみる。さて、今回の題名に『光センサーとランプ』とあるが、ご存知のように光センサーはMindStorms標準の部品である。しかし、ランプはMindStormsには付いていない。そう、とうとう拡張キットを入手したのである。一年前に初めてRobotics Invention Systemを購入した時に比べるとMindStormsは買いやすくなった。レゴのカタログにMindStormsシリーズが載っているので、近所のおもちゃ屋で「これ、取り寄せてくれる。」って注文すれば数日で手に入る(ちょっと割高な気がするが)。

 今回はかずの誕生日プレゼントとして、『Ultimate Accessory Set』を購入した。なぜ、『Exploration Mars』などの派手な拡張キットではなく、地味な『Ultimate Accessory Set』を選んだかというと、このセットにはリモコンが入っているからだ。かずは本当にリモコンが好きなのだ。「リモコン付いとる」という理由だけで、かずはこのセットを選択した。リモコンの他には回転角度をセンスするローテーションセンサー(回転センサー)、タッチセンサーそしてランプなどが含まれる。初めて見る形状のレゴ・ブロックも何点か付いていた



 まず、かずが無限軌道車を改造して光センサーとランプを取り付けた。次に、こうしろうに今回作成するプログラムの概要を説明した。「光センサーは、光を出して反射する光の強さを読み取り0~100の値で返すんだったね。THRESHOLDで定数定義した値より大きくなったら、つまり明るい場所に来たら、モーターCを逆転させて暗い場所の上に戻るまで軌道を修正するわけだ。まあ、とりあえずプログラムを作ってテストしてみよう。」

#define THRESHOLD 35
task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  OnFwd(OUT_A+OUT_C);
  while(true)
  {
   if (SENSOR_2 > THRESHOLD)
   {
   OnRev(OUT_C);
   until(SENSOR_2 <= THRESHOLD);
   OnFwd(OUT_A+OUT_C);
   }
  }
 }

 こうしろうは「while (true)のtrueちゃなんやったけ?」とか「whileが無かったらどうなるけ?」などと私に質問しながらプログラミングを進めた。このプログラムはMindStormsに添付されているテストシートを使ってテストする。テストシート上の黒い線をトレースするように無限軌道車が走るわけである。



当初、THERSHOLDの値を40に設定していたので、テストシート上の緑の部分も暗いと判断して、その上も走行してしまった。35にしてちょうど黒い線の上だけを走るようになった。光センサーは明るい/暗いの分岐点となる値の調整が難しい。30に設定すると黒い線でさえ明るいと判断してもっと暗い部分を探そうとロボットはあらぬ方向へ進んで行ってしまった。

 次に道に迷ったらランプを点けるようにプログラムを改変してみた。

#define THRESHOLD 35
task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  OnFwd(OUT_A+OUT_C);
  while(true)
  {
   if (SENSOR_2 > THRESHOLD)
   {
   On(OUT_B);
   OnRev(OUT_C);
   Wait(10);
   until(SENSOR_2 <= THRESHOLD);
   Off(OUT_B);
   OnFwd(OUT_A+OUT_C);
   }
  }
 }

黒い線を外れるとあたかも道を探っているようにランプを点灯させる。ランプは出力ポートのBにつながっているのでOn(OUT_B)で点灯する。コースに戻るとOff(OUT_B)で消灯する。あまりにも、しょわしけなく(富山弁解説:「しょわしけなく」はせわしなくの意)点滅を繰り返していたが、モーターを反転させるOnRev(OUT_C)の次行にWait(10)を追加すると、無限軌道車が首を振る幅が大きくなり点滅回数も減少した。