今回は,前回作成した,右側にNXTの光センサー,左側に古いRCXの光センサーを変換ケーブルで取り付けたロボットで,ライントレースをするプログラムを作る。
まずは,何も考えずに,二つの光センサーでライントレースをするプログラムを作る。何も考えずにと言っても,本当に何も考えないでプログラムを作ることができるわけではなく,プログラムの形式というか構成を考えずにダラダラとコードを書く。
まず,定数宣言しているのは光センサーが黒い線の上に来たと判断するしきい値だ。それが45である。次の定数宣言CORRECTは補正値である。何を補正するかというとRCXの光センサーが返す値は,NXTの光センサーの値よりも常に小さいので,それを補正する。その補正値が定数名CORRECTで宣言した14だ。
NXTの光センサーはSetSensorLight関数で利用可能になる。RCXの光センサーの方はタイプとモードを指定する。
次のWhile(true)は無限ループを作る。ループの中ではまず,液晶ディスプレイにStart B,Start Cと表示してから,BとCのモーターをスタートさせている(if以降の説明はコードの後に書く)。
-------------------------------------------------------------- #define THRESHOLD 45 #define CORRECT 14 task main() { SetSensorLight(IN_2); SetSensorType(IN_3,SENSOR_TYPE_LIGHT); SetSensorMode(IN_3,SENSOR_MODE_PERCENT); while (true) { TextOut(1,LCD_LINE2,"Start B"); TextOut(1,LCD_LINE3,"Start C"); OnFwd(OUT_BC, 75); if (Sensor(IN_2) < THRESHOLD) { Off(OUT_B); TextOut(1,LCD_LINE2,"Stop B"); Wait(50); continue; } if (Sensor(IN_3) + CORRECT < THRESHOLD) { Off(OUT_C); TextOut(1,LCD_LINE3,"Stop C"); Wait(50); } } } --------------------------------------------------------------
ポート2につながった右側のNXTの光センサーがしきい値より小さい値を返したら,自分の側のBポートにつないだモーターを止める。止める時間は50ミリ秒,つまり0.05秒だ。
ポート3につないだ左側のRCXの光センサーの値をしきい値と比較するときは,補正値を足している。自分のサイドのモーターを0.05秒間止めるという仕様は同じだ。0.05秒という時間には何か根拠があるわけではなく,コース上のテストから得られた「これぐらいでちょうどだろう」という経験値である。
これで,二つの光センサーを使う基本的なプログラムはできた。しかし,これで本当によいのだろうか? 短いプログラムだから,ロジックの理解に困るということはない。でも,もう少し見やすいプログラムにした方がよいだろう。そこで,関数を使う。