9月23日 今日はひさしぶりにみんなでMindStormsをしようと,何を作るか相談していた。「モデルチームを作ろう」とこうしろう。とっさに「おお,それや」と答えたが,モデルチームってなんやと?マークの私。
「レゴ通の人なら知っている日本では数年前に発売中止になったシリーズ。」との説明に古いカタログを引っ張りだす。我が家の子供部屋には,こうしろうとかずが集めたレゴが所狭しと並んでいるが,カタログも7,8年分は常備されている。
モデルチームとはトレーラートラックなどの大型のモデルを(レゴとしてはかなり)精巧に再現したシリーズである。その分,価格も結構高い。今回作ることにした『ブラックキャット』は定価23,000円だ。ある人のホームページでこうしろうが見たところ,製作に9時間半を要したそうである。マニア向けのシリーズだ。とても,そんなたいそうなものは作れそうにないのでミニチュア版を作ることにした。
まずは,こうしろうがフロント部分を製作する。
いつもよりは細部のデザインにこだわっている。モーターの回転方向を90度変換し,前輪を回す仕組みである。
リア部分はかずと私の共同制作。
かずはカタログを良く見ないで自分のイメージだけで,どんどん作ってしまうので「おいおい,今回はモデルだろ」と手を出すことになった。
これが,完成品である。いつもよりはカッコイイ!
ミニチュア版なので,MindStormsの本体RCXを載せるスペースがない。「リモコンで動かそう」と操作レバーを2つ作りRCXにつなぐ。
操作レバーを手前に引くと,タッチセンサーが押し込まれる。このリモコンとトレーラーを長いケーブルを2本つないだケーブルでつなぐ。
9月29日 リモコンでトレーラーを操作するプログラムを作成しようと,こうしろうと私が打ち合わせを始める。右側のレバーを引くと加速し,左側のレバーを引くと減速する仕様である。止まっている時はモーターをONにし,最低速度の時に減速レバーを引くと止まるようにしなくてはならない。
RCX Command Centerの白い画面を見つめたまま,まるでフリーズしているかのようなこうしろう。全然,プログラムのイメージがわいてこないようだ。
「こうしろう,設定したスピードを覚えておく変数が必要だな」,「うん。でもif文だらけのプログラムになりそうやね」,「Select Case文使えば,いいだろ」,「Select Case文なんて,NQCにないよ」「…」。
2カ月ほどNQCでプログラムを作っていなかったせいで,こうしろうも私もすっかりMindStormsのプログラミングを忘れてしまっていたのである。下記のプログラムが完成したのは,時計の針が11時を回った後だった。
int set_speed = 0;
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_TOUCH);
start up_power;
start down_power;
}
task up_power()
{
while(true)
{
if (SENSOR_1 == 1)
{
if(set_speed == 0)
{
set_speed = 3;
SetPower(OUT_A,set_speed);
OnFwd(OUT_A);
}
else
{
if(set_speed < 7)
{
set_speed += 2;
SetPower(OUT_A,set_speed);
}
}
until (SENSOR_1 == 0);
}
}
}
task down_power()
{
while(true)
{
if(SENSOR_3 == 1)
{
if(set_speed == 3)
{
set_speed = 0;
Off(OUT_A);
}
else
{
if(set_speed > 3)
{
set_speed -= 2;
SetPower(OUT_A,set_speed);
}
}
until (SENSOR_3 == 0);
}
}
}
set_speedが現在の速度を保存しておく変数で,初期値として0を与えている。右側のレバーが引かれた時,つまりup_powerタスクのif (SENSOR_1 == 1)が真になった場合,加速の処理を行う。set_speedの値が0の時(止まっている状態)は,set_speedに3を代入し(3を最低速度としている),SetPower(OUT_A,set_speed)でモーターの回転速度を指定後,OnFwd(OUT_A)でトレーラーを発車させる。SetPowerに指定できる最大値は7なので,以降,右側のレバーが引かれた時は,set_speedが7より小さいかを確かめて,2ずつ加速させている。down_powerタスクはその逆である。