図のコースを周回し、配置された缶を収集、積み上げを行うロボットを作成する。今回私たちが課題に取り掛かるにあたって、最初に考えたのが、二つのNXTをそれぞれ独立して分離させるか、一体にするかである。最初私たちが考えたのがこの分離型で、その名の通り、二台のNXTを分離させ、それぞれ独立したロボットとして動かし、相互間の通信を適宜行うという物であった。具体的には缶を収集するロボットを一つと、積み上げるロボット一つをゴールにて待機させるという物であったが、二台を連携させるまでの精度を実現するのは難しいという事で却下された。†これが今回の課題で実際に実現された一体型で、二つのNXTを載せた巨大なロボットで、缶の収集、積み上げを一台で行う。上記の分離型に比べて、精度は調節しやすいが、二台のNXTという荷重を持ったままコースを周回しなければならないというデメリットもある。†これが私たちのロボット。この形に落ち着くまで、数えきれないほどの試行錯誤があった。今回のロボットでは、NXTのキットを二つ使えるという事で、センサー類の数も単純に倍になったので、それを様々な点で利用した。光センサーを二つ使うことで、コースの黒線を挟む形で、ライントレース、交差点認識などを容易にさせた。これは実現には至らなかった。†このアームの最大の特徴は、アームに底が付いている点である。アームの下の部分のパーツ(写真の赤い部分)が、缶の底の窪みに入ることで、缶を3個、4個と重ねても、落ちないような設計になっている(図)。軽量化をはかるため、アームのガイドは缶のつなぎ目を中心に、最小限で済むように工夫してある。†ロボットを組み立てる中で、最初の難関は、アームにつなぐモータのトルクをいかにして稼ぐかという事であった。最初はサーボモータにアームを直接付けていたが、アームの重量を水平状態から持ち上げるためには、サーボモータの出力を最低でも80%は出さなければならなかった。缶を積んで持ち上げるという非常に繊細な作業を行うアームを、このような出力で動かすのは、現実的ではない。そこで使ったのがギアである(写真)。写真の様にギアを接続することで、モータの出力を50%前後でアームを動かすことができるようになった。後に駆動にもこの機構を使った。†2つのNXTを写真の様にL字にすることで、全体の大きさをできるだけ小さくした。操作、配線等もしやすくなっている。今回の課題での最大の特徴は、2台のNXTをBluetoothによる通信で動作させるという事である。この通信をするにあたって、2台をそれぞれマスターとスレーブとする。私たちのロボットでは、基本的な駆動をマスター、アーム等の動作をスレーブという風に割り振った。OnFwdSync(BOTH,SPEED2,100);//時計回りに旋回。OnRL(-SPEED1,SPEED1);//時計回りに旋回。音波探知用にスピードを落としている。"arm1.rxe"//アームを開き、つかむ準備をするプログラムを定義しなおした。1000//ゴールの交差点に止まったあと、ゴール中央を向くための回転に必要な時間。523//音程C、E、Gを指定。3//走行駆動系のギア比(24:8)。r)//引数r[cm]だけ進むのに必要な回転角を導くマクロ。MAXCross)//右側の光センサを使ってライントレースを行いつつ、引数MAXCrossの分だけ交差点を感知するサブルーチン。交差点の判定は左右の光センサが同時に閾値を下回ったことで行う。catch()//持っている缶を新しい缶の上に載せ、掴み、また持ち上げる一連の動作。{angleB=GetAngle(RANGE4);RotateMotor(BOTH,SPEED1,-angleB);//缶をホルダーの中に押しこむために少し前進するPlayTone(262,400);//ネット上で見つけたメロディー。Wait(500);PlayTone(294,400);Wait(500);PlayTone(300,400);Wait(500);PlayTone(294,400);Wait(500);RemoteStartProgram(CONN,arm_down);//スレーブにアームを開かせるWait(5000);ReceiveRemoteNumber(MAILBOX1,true,msg);if(msg==SIGNALON){PlaySound(SOUND_CLICK);}else{PlaySound(SOUND_FAST_UP);}angleA=GetAngle(RANGE2);RotateMotor(BOTH,SPEED2,angleA);//アームの伸びに合わせ後退するRemoteStartProgram(CONN,arm_up);//スレーブに缶を掴ませるPlayTone(DO,120);Wait(150);//達成感のあるメロディー。一回ごとに半音ずつ上昇させたかったPlayTone(MI,120);Wait(150);PlayTone(SO,120);Wait(150);PlayTone(DO*2,240);Wait(300);PlayTone(SO,120);Wait(150);PlayTone(DO*2,360);Wait(450);Wait(10000);if(msg==SIGNALON){PlaySound(SOUND_CLICK);}else{PlaySound(SOUND_FAST_UP);}RotateMotor(BOTH,SPEED2,-angleA+angleB);//つかむ動作の開始点まで戻る。build()//ゴールで缶を載せるだけのプログラム。†アームの動作の途中に、本体の後退、つまりマスター側の動作が入るため、2つに分けてある。持っている缶を離して積む動作。main(){until(BluetoothStatus(CONN)==NO_ERR);RotateMotor(OUT_A,20,-48);Wait(1000);PlaySound(SOUND_FAST_UP);Wait(2000);SendResponseNumber(MAILBOX1,SIGNALON);}これが終わるとマスター側で後退をする。今回の課題を通して学んだのは、単にプログラムが、組立が...というだけでなく、限られた時間で与えられた課題をチームで突破するようにプロジェクトの進行をする事の難しさである。課題に対して、どれだけの時間がかかるか、というビジョンを持つことや、ある程度の取捨選択を行うという面で、足りない部分が少なからずあった。厳しい条件の中で、チーム全員が協力して作り上げることができて良かった。