ROBOLABソフトウエアでマルチタスクを使うと,プログラムが簡単になるよという話しを前回書いた。続いて,ロボット・プログラミング講習会に参加している小学生に変数をどう教えようか考えていた。一般的なプログラム言語の入門書ではHello World(こんにちは,世界)の次は決まって変数の使い方である。ところがMindStormsで作ったロボットを動かすROBOLABでは,ここはどうしても変数を使わなければという場面にはなかなか出くわさない。たとえば5回ループさせたい場合でも,数値定数で5と指定するだけで5回繰り返してくれる。変数をカウントアップして5になったかなどとチェックする必要がない。変数の使い方を説明するサンプルプログラムを作ってみるが,どうもわざとらしいものになりがちである。

 変数のまっとうな用途して,過去の状態を覚えておくためとカウントアップするために使ってみよう。

 タッチセンサーで何かにぶつかったことを検知しバックした後,どっちかの方向に曲がり,また真っ直ぐ進み出す。そんなプログラムを作るとき,いつも同じ方向に曲がってばっかりいてはおもしろくない。さっき右に曲がったから,こんどは左に曲がろうと判断するために変数を使ってみる。

 変数のことをROBOLABではコンテナという。青コンテナ,赤コンテナ,黄コンテナが用意されている。青信号の横の一番はじめの黄色いコマンドはMindStormsの本体RCXの液晶ディスプレイ(LCD)へ青コンテナの値を表示する。次の0と書いてあるコマンドはコンテナの初期化である。青コンテナを初期化している。値を設定するときは背景が青いコンテナ,値を取得するときは背景が白いコンテナを使う。

 タッチセンサーが押し込まれたときは,A,Cのモーターを逆回転させバックした後,青コンテナの値が0より大きかったらAのモーターだけを回す。その後,青コンテナに0を代入する。0以下だったらモーターCだけを回し,青コンテナに1を代入する。こうすることで,何かにぶつかるたびに違う方向に進むことになる。サイコロマークの時計はランダムな時間を返す。4という数値定数が上限値である。何も指定しないと0から5秒の間のランダムな時間待つことになる。

 次のプログラムは変数を使って黒い線の数をカウントする。

 ライトセンサーの返す値が40より小さくなったら,黒い線の上に来たと判断し,赤コンテナに1を加算する。赤コンテナの値が2以下のときは,黄色ジャンプで,黄色着地に戻り,また前進する。ジャンプする前に,明るくなるまで待つコマンド入れ忘れると一本の黒い線の上でなんども暗いと判断して,前に進まない。

 コンピュータの判断は,私のようなおじさんと違い速い。この例のように太い線でなくても,人間の目には細く映る線でも何度も読み取りを行う。ロボットのプログラムを考えるときは,このっさんの時間の単位はミリ秒(1000分の1秒)とか,マイクロ秒(100万分の1秒)なのだと頭にいれておく必要がある(富山弁解説 このっさん:この人,この方という意味。あのっさんはそう!「あの人」。ちなみに,このっさんには別の意味もある。学校の帰りに肉屋でコロッケなどを買いぐらいすることも「このっさん」という。カレントユーザーは稀少。次男かずが通う中学の近所の肉屋では,あのっさんもこのっさんもこのっさんしている)。

 この画像は前のロボットの画像と同じように見えが実は違う。LCDに注目してほしい。-17と表示されているのがお分かりだろうか。次のプログラムでは,青コンテナと赤コンテナで引き算をしているのだ。

 まず,赤着地の横のコマンドで1番のポートにつながっている光センサーの値を赤コンテナに入れている。0.2秒間前進して,こんどは青コンテナに現在地の光センサーの値を入れる。そして,マイナスマークのコマンドで青コンテナから赤コンテナの値を引く。光センサーは明るいところでは大きな値,暗いところでは小さな値を返すので,引き算した結果が0より大きければ明るいところへ移動した,0以下ならば暗いところへ移動した(あるいは変わらない)と判断できるのだ。明るいところへ移動したときは高いC(ド)の音を鳴らし,そうでないときは低いC(ド)の音を鳴らす。LCDには青コンテナの値を表示している。