9月23日 NQCプログラミングを始めてから、手持ち無沙汰なかずにやっと仕事らしい仕事がめぐってきた。今回はタッチセンサーを使い方を学習するので無限軌道車を改造してタッチセンサーを付ける必要がある。



多少やりすぎではあるが、「Good Job」としておこう。

 プログラミングを開始する前に、NQCの開発環境RCXCCの便利な機能の1つTemplates(テンプレート)について説明した。

 「テンプレートを使うと、ステートメントをプログラムの中に自動的に挿入することができるんだよ。task ..(){..}っていうところをクリックしてごらん。」こうしろうが「うん。」と言ってテンプレート上のtask ..(){..}をクリックした。テンプレートは次のように展開された。

task "name"()
{
 "statements"
}

これを基にプログラムを作成した。

task main()
{
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 OnFwd(OUT_A+OUT_C);
 until (SENSOR_1 == 1);
 Off(OUT_A+OUT_C);
}

 「このプログラムのキーポイントは2つあるね。」と、こうしろうに説明を始めた。まず、SetSensor(SENSOR_1,SENSOR_TOUCH)でセンサーのつながっているポート(SESOR_1)とセンサーの種類(SENSOR_TOUCH)を指定している。「Until…はちょっとわかりにくいだろう。タッチセンサーは2つの値をとる。押されていない時は0で、押されている状態が1だ。until (SENSOR_1 == 1)はセンサーが押されるまで待つわけだ。」『待つ』というと何もしないでボーとしているみたいだが、このプログラムでは一生懸命、モーターを回しているわけである。「それで、タッチセンサーの返す値が1になると、次のステップに進む。つまり止まるんだね。」

 コンパイル&ダウンロード後、かずがテストを担当したのであるが、タンスにぶつかってもロボットは停止しない。なんどやっても止まらない。「かず!線つながっとらんねけ。」とメッチャ富山弁なこうしろう。(標準語訳:かず!線つながっていないじゃないか。)やはり、Good Jobではなかった。

 次のプログラムは障害物にぶつかったら、バックして方向を変えるプログラムである。

task main()
{
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 OnFwd(OUT_A+OUT_C);
 while (true)
 {
  if (SENSOR_1 == 1)
  {
  OnRev(OUT_A+OUT_C); Wait(50);
  OnFwd(OUT_A); Wait(70);
  OnFwd(OUT_A+OUT_C);
  }
 }
}

 こうしろうはwhileもifステートメントもテンプレートを使って入力した。手を抜くことにかけては鋭いセンスを発揮する。テンプレートを利用するとタイプ・ミスによるコンパイル・エラーを予防できるので便利である。一度ぶつかった障害物に再度ぶつからないようにするには、OnRev(OUT_A+OUT_C)の後の Wait( )とOnFwd(OUT_A)の 後のWait( )の中のチック数(1/100秒)を何度か変更する必要があった。