筆者がITネットワークアシストたかおか(略称NAT)というボランティア団体で小学生を相手にMindStormsを使ったロボットプログラミングの講習会をしていることは何度もここに書いてきた。子供たちはROBOLAB2.5.4というプログラム開発環境を使ってロボットを動かすプログラムを,ブロックをつなぐようにして作っている。

 ライトセンサーが返す値で分岐するコマンドや繰り返し処理を制御するコマンドを説明して,ライントレースするロボットを作ったりしているが,小学生には難しいだろうと教えていないことがいくつかある。本年度,高岡の小学校で実施している講習会には,昨年度も参加した児童が何人か参加し,WRO(ワールド・ロボット・オリンピアード)に向けたロボット作成に取り組んでいる。経験者には,これまで教えなかった変数(ROBOLABではコンテナという)とマルチタスクを教えたいと思う。

 まずは,マルチタスクから説明しよう。プログラマやコンピュータ業界の人にはなじみの深いマルチタスクという処理の形式をどうやって小学生に教えようか風呂につかりながら考えてみた。「テレビを見ながらご飯を食べること」-これはお母さんに叱られるねと説明しやすいが,ベタすぎて失笑を買いかねない。「CDで英語のリスニングをしながら,算数の問題を解くこと」-これは小学校で英語を教えることには反対だから嫌。

 マルチタスクとは複数の仕事を並行して行うことである。ここにご飯とハンバーグがある。ご飯とハンバーグを食べて減らすことが仕事だと考える。他にもスープやサラダがあるかもしれないが,ご飯茶碗に白いごはんが盛られていて皿にハンバーグがのっていることだけをイメージしてほしい。これを交互に食べることがマルチタスクだ。どこがマルチだと思うかもしれないが,両方を少しずつ,ごはん→ハンバーグ→ごはん→ハンバーグ→ごはん→ハンバーグと交互に食べていくと,どちらも同じように減っていく。これに対し,シングルタスクはハンバーグをだけを先に食べてしまい,次にご飯だけを食べることだ。小学2年生の娘ほのちゃんの食べ方はこれに近い。いつもご飯だけが残っている。

 二つライトセンサーを取り付け,黒い線をセンサーで挟むようにして進むプログラムを考えてみよう。二つのライトセンサーは黒い線の幅より少し広く取り付けてある。

 両方のセンサーが白い部分の上にあるときは,両方のモーターを回して直進すればよい。片方が黒い線の上にあるときは方向を修正するために,片方のモーターを止め,もう一方のモーターを回す。日本語で書くとこれだけのことなのだが,ライトセンサー分岐コマンドを使ってプログラミングすると次のようなプログラムになる。

 少し解説が必要な複雑さだ。明るい/暗いの分岐点として40という値を使用している。黒い線の上にいるときは30台の値を返し,白い部分の上にいるときは45程度の値を返すからだ。どちらも40より大きいときは,モーターA,モーターBを回転させる。片方が暗くてもう一方が明るいときは,一方のモーターだけを回す。どちらも暗いことはロボットが壊れないかぎりないはずだから,B(シ),G(ソ)という音階を鳴らすようにしている。ピーポーというサイレンが鳴る。

 マルチタスクで書くと単純になる。なぜかと言うと,片方のセンサーの値で片方のモーターをオン/オフするタスクを二つ実行することで,両方が明るいときは両方のモーターが勝手にオンになるからだ。1番のポートにつないだライトセンサーの値を聞いて,次に3番のポートにつないだライトセンサーの値を聞いて,Aのモーターをどうする,Cのモーターをどうすると考える必要がない。ごはんを食べろ,ハンバーグを食べろ,一緒に食べろと指示するだけでいい。

 青信号の隣りの「さすまた」のようなブロックがタスク分岐コマンドだ。それぞれのタスクは赤信号ブロックで終わらせる。タスク分岐を使うとプログラムのロジックを簡単にすることができる。

 この例のように一つのセンサーが一つのモーターを制御する場合は簡単なのだが,お互いのタスクの動作が,相手のタスクの動作に干渉する場合には,相手方のタスクの動作状況を考慮する必要がある。

 とりあえずは分離できる動作だけをマルチタスクにすればよいだろう。