すごい雑誌に出会った。『子供の科学』誠文堂新光社発行、大正13年創刊、なんと76年の歴史を誇る。その内容は、と言うとコンピュータ、ロボット、宇宙、天文、写真、恐竜、動物、植物、工作、鉄道模型、はては料理までも科学している。小学校高学年から中学生向けの雑誌のようだが、まさに科学のパラダイス。私はいくそってしまった。(富山弁解説 いくそる:驚く、びっくりするの意)

 落ち着いた編集、色使いなので古臭い雑誌かと思ったが、内容は時代の先端をいっている。次世代の携帯電話の解説やら本田のASIMOの記事などが掲載されている。コンピュータについてはENIACから始まるコンピュータの歴史(これは石田晴久氏が書いておられた)やWindows2000の小ネタ、C++のプログラミングの手ほどきまで載っている。巻末には、紙ヒコーキやブーメランの付録が厚紙で付いている。懐かしのマブチモーターの広告や『ぼくの発明・私の工夫』、『文通相手求む』など、まるで自分が中学生だった頃にタイムスリップしたような企画もある。メル友求むではなく、文通相手求むというところがなんとも味わいある。フルカラーの写真が豊富に使われているわりに、価格は税込み650円。

 私はふと、この『MindStorms日記』が『子供の科学』のどこかのページに載っている様子を想像して、ブルブルッと首を振った。いけない、いけない、ここは日経ソフトウエア。冗談はさておき、『子供の科学』はお子さんだけではなく、お父さんにもお奨めである。年間購読もできるが、公立の図書館には常備されているようだ。私にはチンプンカンプンなニュートリノや素粒子などの解説のもある。我々、大人の知識も専門分野を除いては中学生のラインを上回るか、下回るかぐらいのレベルではないだろうか。大人でも学ぶことの多い雑誌だ。最近、書籍でもテレビ番組でも子供向けのものの方が内容がしっかりしているように感じられる。『子供の科学』には「情熱」や「信条」が感じられる。「21世紀もがんばってくれ!誠文堂新光社。」

1月13日 ROBO Sportsの部品を使って、「走ってきて、ライトセンサーでパックを見つけ、ゴールに叩き込むロボット」を作ることにした。かずは、まずゴールを作り始めた。こうしろうは久しぶりのNQCプログラミングということで、過去の『日記』を読み返し、NQCを頭の中から引き出そうとしている。本体のロボットはこうしろうとかず、そして私の合作となった。みんなで「ああでもない、こうでもない」と言いながらロボットを作るのは、やはり楽しい。



後方のモータ―でゆっくり前進し、先端のライトセンサーで光の反射を読み取る。黒いパックの上に来ると、ライトセンサーが返す値が小さくなるので、前方のモーターを回しパックをシュートする。ボートを牽引するレゴの部品で、RCX本体を引っ張っている。

 こうしろうのプログラムは久しぶりに作ったわりには、要点を押さえたものであった。



#define LIGHT 25
task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  SetPower(OUT_A,1);
  OnFwd(OUT_A);
  while(true)
  {
   if(SENSOR_2 < LIGHT)
   {
   Off(OUT_A);
   SetPower(OUT_C,6);
   OnFwd(OUT_C);
   until(SENSOR_2 >= LIGHT);
   Float(OUT_C);
   }
  }
 }

まず、OnFwd(OUT_A)で前進を開始し、センサーの返す値が定数LIGHT(= 25)を下回ったら、モーターAを止め、OnFwd(OUT_C)でアームを回しパックを打つ。until(SENSOR_2 >= LIGHT)でパックが飛んでいったことを確認し、Float(OUT_C)でアームの回転を止める。これで、パックがゴールマウスに吸い込まれるわけだ。



「こうしろう、うまくいったけどさ、ひとつ覚えておいて。」と今日はすこしプログラムの添削をしてみる。「mainタスクに、たくさんコードを書かずに別タスクに分けたほうがいいよ。」とアドバイスし、パックを見つけシュートする部分をshootタスクに分けたプログラムが下記である。


#define LIGHT 25
task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  SetPower(OUT_A,1);
  OnFwd(OUT_A);
  start shoot;
 }
task shoot()
 {
  while(true)
  {
   if(SENSOR_2 < LIGHT)
   {
   Off(OUT_A);
   SetPower(OUT_C,6);
   OnFwd(OUT_C);
   until(SENSOR_2 >= LIGHT);
   Float(OUT_C);
   }
  }
 }


「どんなプログラム言語でもメインは単純にして、別タスクや関数で細かい機能を実現していくのがコツだからね」、「わかった」とこうしろう。