†フィールドの説明フィールドは課題2で使用した紙を使用する。350ml缶(中が入っていても空でよい)は逆さまにして使い、ロボットのスタート直後にサイコロを振って出た目の番号の位置に置く。その番号の次の番号のところにもダミーの缶を置くことができる。6の目が出た場合は6の位置と25cm以上離れていない場所ならどこに置いてもよいものとする。距離は缶と缶のもっとも近い部分で測る。空き缶には色をつけたり文字や記号を書いてもよい。周囲に紙を張ってもよい。赤と青のボールは、図のように所定の場所に置いておく。その際、キットに含まれない小さな輪ゴムを使用するものとする。基本ルール競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。図のX地点または(および)Y地点からスタートする。接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。赤いボールを図のピンクのいずれかに置いた缶に、青いボールを図の水色のいずれかに置いた缶に、それぞれ乗せる。開始の合図から5秒以内にスタートボタンを押す作業を完了すること。競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。基本得点の計算方法ボールを一つ乗せればそれぞれ10点、二つとも乗せればボーナス点としてさらに10点。ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれさらに6点加点する。ボールを目的の缶に当てることができれば、それぞれ4点。ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6点。ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2点。ボールを違う領域内の缶に乗せた場合は、それぞれ2点。ボールを違う領域内の缶に当てた場合は、0点。してしまった場合は2点または取得した得点の半分のいずれか少ないほうを減点、その缶を完全にだしてしまったときは点数を半分にする。ダミーの缶がもとの位置から移動しても減点はしない。以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。アームと車体で構成した。†この課題では、ボールを拾って缶に乗せる。その為、ボールを拾った後に缶の高さまで持ち上げる必要があり、更に、ボールを掴むという動作にモータを一つ使うことになる。私達のチームでは、電池の消耗という点からボールを掴むモータを持ち上げるのは難しいという結論に至った。この問題を解決するに当たって、チームメンバーからマジックハンドという案が挙がり、採用された。これが実際にできたものである。†こちらは、ボールを掴むハンドパーツだ。上部にあるギアが回ることで、下の二つのギアがそれぞれ逆方向に回り、開閉する仕組みとなっている。下図はハンドパーツを上から見たものである。上部にあったギアを➡の方向に回すと、その下のギアが➡の方向に回る。その為、ハンドパーツが開く。†こちらは、ハンドを上下させるアームパーツだ。写真の下側のモータがアームを上下させるようになっている。実際に動かすと、アームの動きは下の図のようになる。黒いパーツがハンドを取りつけるもので、黄緑のパーツがモータの回転によって動くパーツである。⇒モータ一つだと負担が大きいので、二つ並べて使用し負荷を軽減している。ハンドへ動力を伝える為に、軸となるパーツにギアを取り付けた。このギアを通して、ハンドの開閉を行うことができる。車体はブロックでフレームを製作し、そこにモータやタイヤを取り付け、頑丈になるようにした。アームが予想以上に重く、車体を支える為アームの下近くに大きなタイヤを二つ追加し、計四つも使用することになった。モータへの負担を軽減するため、ここにもギアを使用した。ここのギアの配置は次にようになっている。モータとギア1、ギア2とギア3、ギア4とタイヤが直結している。各ギアの歯数は次の通り。24表から、ギア比は、次の式に歯数を代入することで求められる。ここで、ギア2とギア3は直結していて、回転数が等しいので、式は次のようになる。よって、ギア比は6となった。モータにかかる負担が6分の1になったことになる。今回は、缶だけでなくボールも探さないといけないので、超音波センサを二つ使用した。ボールの探索また、ライントレースに使用する光センサもアームの下に付けてある。†このロボットではハンドに一つ、アームに二つ、タイヤに二つモータを使用している。NXT一つではモータを三つまでしか制御できないが、二つのNXTをBluetoothで通信させることで動かす。Bluetoothを使用する時、片方を"master"、もう片方を"slave"として動作させる。ライントレース等、前回の課題のプログラムを流用しているので、新たに追加したり、変更した部分のみ説明する。通るコースは次のようにした。Yから出てIまで進む。ボールを取って、円の中心まで進む。缶を探して乗せて、戻る。円の中心からIまで戻る。IからEとLの間まで戻る。Eで曲がり、Fを超えてボールが見つかるまで進む。(Fの先一つ目の急カーブを曲がった辺りで見つけられる。その位置のまま缶を探して乗せて、戻る。†Bluetoothの通信はマクロでまとめた。BluetoothStatus(slave番号)は通信ができているかどうかを示す関数。RemoteStartProgram(slave番号,実行形式のプログラムファイル名)は指定したslaveの指定プログラムを起動する関数。rotate_angle){//最初の一周の部分で、旋回方向と角度を指定する引数を追加した。†アーム側では四つの簡単なプログラムを容易して、マスター側から通信があった時、任意のプログラムが動作するようになっている。モータAがハンドの操作、モータB・Cがアームの操作を担当している。RotateMotor(OUT_A,-30,320);//モータAをパワー30、320°で逆回転させる。RotateMotor(OUT_A,30,320);//モータAをパワー30、320°で回転させる。今回の課題は、テスト期間と重なっていたことで、製作時間が少なくなってしまった。その少ない時間の多くをロボットに使った為プログラムが拙いものとなってしまった。本番では、一つ目のボールを掴むまではできたのだが、ハンドが開かず缶に一つも乗せられないまま終わってしまった。缶に向かう際にズレが生じた。こちらは、二段階のサーチをするという話を先生から聞き、とても参考になった。ハンドが開かない問題については、RotateMotor(モータ,パワー,角度);の関数をOnFwd(モータ,パワー);に変えることで回避できたのではないかと今更に思った。発想力が足りないというのはとても歯がゆいものであった。この講義では、結果こそ奮わなかったものの多くのことを学べた。ハードを理解していなければ、ソフトは作れないということをこれでもかと痛感した。ここで学んだことを来年度以降にも活かしていきたいと思う。