5月5日子供の日。富山はGWには珍しく暑く,湿度の高い不快な日だった。そんな中でも小学生は元気なもので,ほのちゃん小学4年生もそれなりに楽しく過ごしている。父は朝からぐったりしているが,それでも久しぶりに一緒にマインドストームNXTをすることになった。

 アフレルのデスクロボのテキスト第3号の最後の課題は片側ライントレースだ。

 前回,作成したロボットにライトセンサーを取り付けるところからスタートする。

 一方向にだけ回る片側ライントレースはライントレースの基本である。ライトセンサー1個でコントロールすることができる。ロボットにライトセンサーを付けたら,最初にすべきことはコースの黒と周りの白い部分の反射光の値を測ることだ。

 ほのがNXTのボタンを押してViewに切り換え,コースの白い部分と黒い部分を測る。反射光の値はパーセントで返ってくる。白い部分は67,69,70などの値を返したので,65より大きい場合を白とした。黒い線の上は,40以下の値を返すので,45より小さい場合を黒とした。

 次に,テキストに書かれている考え方の手順をほのに確認する。以下,テキストから引用すると,次のように書いてある。

・スタートする位置はどこから行いますか?
1. 外側の白いところ
2. 黒い線の上
3. 内側の白いところ

 この質問に答えると,ロボットの最初の動作が決まる。ほのは2の黒い線の上からスタートを選んだ。最初の動作は,双方のモーター(BとC)を回して前進することになる。 次にテキストには,色が変化したときの動きはどうするか書きなさいと記述欄が設けてある。

白くなったとき(                        )
黒くなったとき(                        )

 これを基に,ほのとプログラムの仕様を次のように考えた。

・ 白いところに来たら,Cのモーターだけ回して黒い線に向かって曲がる。
・ 黒いところに来たら,BとCのモーターを回して進む。
・ 上の二つの処理を永久ループで繰り返す。

 この仕様をほのは,ほとんど一人で決めた。これまで勉強したことは結構身に付いているようだ。うれしくなって,隣室で片付けをしている妻に「ほの,よくわかっとるぞ」と余計なことを言いに行った。

 しかし,頭の中で考えた通りにうまく行かないのがロボット・プログラミングの常である。

 上記の仕様の通りにプログラムを作ると以下のようになる。

 最初のブロックでBとCのモーターを回転させる。次のブロックは光センサーの待機ブロックだ。光センサーが65より大きな値を返すまで待機する。光センサーの値が65を超えたら実行するコマンドは,「Cのモーターを回転させる」だ。

 つまり,上図の矢印の先頭にロボットが来たときに,右折して黒い線を見つけたいのだ。次のコマンドが光センサー待機ブロックで,45より小さい値を返すまで待機する。黒い線を見つけるまで右折させるのだ。黒い線を見つけたら,ループの先頭に戻り直進する。

 プログラムはこれで良いような気がした。しかし,ロボットは黒い線をはずれてもスーッと進んで行ってしまった。

 なんのことはない。Bのモーターを止めるというコマンドが入っていないせいである。

 いったん,B,Cのモーターを止めるコマンドを入れたが,今度は黒い線からはずれた後,勢いよく右に曲がり黒い線を越え,コースの内側に入ってしまうという問題が発生した。ここまでで1時間程度かかったので,ほのはくたーっとしてしまった。

 Cのモーターだけを回すときのパワーを小さくすることで,黒い線を越えてしまう問題は解消した。

 やっと,ロボットは黒い線をトレースするようになった。ライントレースはロボット・プログラミングの基本なのだが,ギヤの組み方やロボットのスピードによって動作が変わってしまうので,頭で考えた通りにはいかないことが多い。(つづく)