下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。†A地点を出発し、次の経路を黒い線にそって動くロボットを作成する。A地点に入る(ゴール)交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。組み立て説明書にある基本のロボットをベースに、光センサーと玉を扱う部品を組み込んだ。光センサーとタイヤの回転軸の距離が遠すぎるとカーブを曲がれないので、注意した。玉を扱う部品は、アームが一回転するようになっており、玉をつかんだりシュートしたりできる。実際に走らせたところ、パワーがなくカーブで止まってしまったので、左右のモーターにギアを組み込みトルクを上げた。†まず、線の左側の、白と黒の境界線をたどるプログラムを作った。黒、黒寄りのグレー、白寄りのグレー、白の閾値を定義し、黒なら左、グレーなら直進、白寄りのグレーなら少しだけ右、といったように進むようにした。D地点のような交差点やK地点のような丁字路では、黒の値をとる時間が一定値以上になったときに交差点と判断し、直進や左折等をするようにした。カーブを曲がりきることができなかった。そこで、G地点を超えたところから線の右側の境界線をたどるようにすることでどちらもクリアすることができた。これで一通りミッションを遂行できるが、問題は左右の境界線それぞれのプログラムが必要になり、サブルーチンの量が倍になってしまうことだ。試行錯誤の結果、左を1、右を-1とする方法を見つけた。follow_line(left);turn_right(right);のように使い、マクロ内の変数に1または-1が代入される。することで、プログラムの量を増やさずに左右で反対の命令を出すことができる。†left、rightを定数として扱い、サブルーチンの変数に代入して使う。「ブレーキ」を意味するが、気にしないでほしい。左側境界線をたどる仕組みを説明する。赤い丸は光センサー、数字はセンサーの値、青い四角はタイヤを示す。右側の場合はその逆である。↑センサーがちょうど境界線上にあるとき、値は45から52の範囲にあるので、まっすぐ進む。↑軌道からずれてセンサーが黒と認識すると、左に進んで軌道修正する。↑反対ににセンサーが白と認識すると、右に進んで軌道修正する。↑このようにセンサーが150/1000秒以上黒と認識すると、交差点と判断する。(実際には、黒でないときに現在時刻t0が更新され、黒であるときに最後に更新されたt0と現在時刻の差を求めている。定義することでプログラムを増やさなくて済んだ。†あとはサブルーチン等を並べるだけ。同じものが連続する箇所はrepeatでまとめている。今回は早く完成させることができた。サブルーチンや定数を使いこなせるようになった。プログラムを短くするのに苦労したが、結果的にうまくいってよかった。