下のようなコースを作成し紙コップをY地点、紙コップの中に入っているピンポン玉を割りばしでできた正方形の領域に入れるロボットを作成する。
私たちのチームは、A地点からスタート→上の画像の1の紙コップを取る→X地点にピンポン玉を入れる→つかんでいる1の紙コップを移動の邪魔にならないところに置く→2の紙コップを取る→x地点にピンポン玉を入れる→つかんでいる2の紙コップをY地点に置く、という順番で作業をし、最終的に基礎点が最高で15点となるロボットを作った。
下の画像は実際に作ったロボットを上から見たものである。当初はRISを2つ使って通信しながらスムーズに紙コップやピンポン玉を運ぶロボットを作ろうとしていたが、RISの場合通信の方法が赤外線による通信であるため、2つのRISが近距離かつ赤外線の読み取り、出力面を向かい合わせる必要があるため、困難であることが分かった。そのため、1つのRISのみを使ったロボットを作ることになった。
下の画像の赤い枠で囲まれた部分は、前輪部分である。当初使っていたものは前輪が大きく、コップをつかむ構造の高さが少し高くなってしまい、紙コップをつかむことができなかったため、摩擦か少なく高さをほとんど使わない丸みを帯びたパーツを使うことで高さを下げることに成功した。
紙コップをつかむ構造部分は今回の課題で一番工夫が必要となる部分であったと思う。なぜなら1つのモーターで紙コップをつかみ・持ち上げる構造を作らなければいけないからである。左下の画像はその1つのモーターでつかみ・持ち上げる構造を下から見たものである。画像の赤の枠で囲まれた歯車は回転の軸を横から縦に変換するものである。右側についているモーターを回すことでアームが閉じる構造となっているが、紙コップをつかみ、これ以上モーターが回らない状態になるとすべての歯車が固定され、青の枠で囲まれた部分の棒が回り、つかんだ紙コップを持ち上げる構造になっている。実際に動かすと右下のようになる。
また、紙コップをつかんだうえで持ち上げなければならなかったので、下の画像のように、はさむ構造の先にゴム製のタイヤを付けることで、アームと紙コップに生じる摩擦力が大きくなり、しっかりとつかむ・持ち上げることができるようになった。更にアーム先にタイヤを付けることで紙コップをつかむ高さを自由に調整できるようになったため、持ち上げた時に1番安定する高さでつかむことができるようになった。
下の画像は、黒く色を塗られた紙コップを見つけるための光センサーである。明るさを読み取る面が前を向いているため、周りからの光の影響を受けやすかったが、そこは紙コップに極力近づくことで対処できた。
下の画像は、紙コップがロボットに対してどの方向にあるかを判断するために後輪に付けられた回転センサーである。
何度も使うと思われた、紙コップをつかむ、紙コップをはなす、右旋回、左旋回という4つを定義した。
#define cup_getup OnFwd(OUT_B);Wait(15);Off(OUT_B);//紙コップをつかむ #define cup_putdown OnRev(OUT_B);Wait(30);Off(OUT_B);//紙コップをはなす #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);//右旋回 #define turn_left(s) OnFwd(OUT_C);OnRev(OUT_A);Wait(s);Off(OUT_AC);//左旋回
紙コップをつかむところまでどのようにロボットを近づけるかが重要だと思い、紙コップがロボットに対してどの方向にあるかを判断し、紙コップに近づくプログラムを作った。
sub search_cup() { SetSensor(SENSOR_1,SENSOR_ROTATION); SetSensor(SENSOR_2,SENSOR_LIGHT); int sun_MAX = 100;//明るさの値であり、のちに値を下げるものなので最初は少し高めに設定している int sensor_MAX = 0;//回転の値であり、のちに上がっていくものなので最初は0としてある ClearSensor(SENSOR_1); while(SENSOR_1 < 4)//回転センサーが4となるまで繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_2 < sun_MAX)//もし明るさがそれまでに記録した値より低くなった時以下のことをする { sun_MAX = SENSOR_2;//最低の明るさを更新 sensor_MAX = SENSOR_1;//最低の明るさを記録した時の回転センサーの値を更新 } } Off(OUT_AC); Wait(100); SetPower(OUT_AC,2); OnRev(OUT_A); OnFwd(OUT_C); until(SENSOR_1 < sensor_MAX);//先ほど最低の明るさを記録したところまで待つ Off(OUT_AC); Wait(100); OnFwd(OUT_AC);//紙コップがある方向に近づく Wait(40); Off(OUT_AC); }
task main() { OnFwd(OUT_AC);//A地点から1つ目の紙コップ付近まで近づく Wait(140); Off(OUT_AC); int A; for (A=1; A<=2; A++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_C);//紙コップを見つけるために一時的に左旋回 OnRev(OUT_A); Wait(20); Off(OUT_AC); Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } cup_getup;//紙コップをつかむ turn_right(185);//紙コップをつかんだ地点で右旋回し、X地点の方向を向く Wait(100); OnFwd(OUT_AC);//X地点に近づく Wait(50); Off(OUT_AC); OnFwd(OUT_B);//紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); Wait(100); turn_left(150);//持っている紙コップを移動の邪魔にならない位置におくため左旋回 Wait(100); cup_putdown;//紙コップをはなす turn_right(155);//2つ目の紙コップの方向を向くために右旋回 OnFwd(OUT_AC);//紙コップに近づく Wait(140); Off(OUT_AC); turn_right(40);//紙コップがある方向を向くため右旋回 OnFwd(OUT_AC);//更に紙コップに近づく Wait(40); Off(OUT_AC); int B; for (B=1; B<=2; B++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); turn_left(20);//紙コップを見つけるために一時的に左旋回 Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } cup_getup;//紙コップをつかむ Off(OUT_AC); Wait(100); turn_right(160);//紙コップをつかんだ地点で右旋回し、X地点の方向を向く OnFwd(OUT_B);//紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); turn_left(85);//X地点の方向を向いてる状態からY地点の方向をを向くため左旋回 OnFwd(OUT_AC);//Y地点に近づき、紙コップをY地点に置く Wait(160); Off(OUT_AC); }
後輪が大きすぎたために移動が速くなってしまい、紙コップを見つける際の旋回も速くなったため、ロボットが紙コップの方向を向くのに生じる誤差が大きくなってしまった。また、一つのモーターで紙コップをつかみ、持ち上げる構造を考えるのに時間を取られ、その他のことにあまり時間をかけられなかった。そのほかにも、発表直前までコースの紙に割りばしでできたピンポン玉を入れる部分を付けなかったため、本番直前に割りばしを付けたところ、ロボットの移動に影響を与えてしまい、思っていた動きをしてくれなかったことなど、反省すべき点は多かったと思う。
発表が終わって順位を見たら9チーム中4位だったので思っていたよりも悪くない順位でよかった。また、発表では工夫されたロボットがたくさんありよく考えられているなと思った。特に1位のチームのロボットはRISであるが、とてもよく作られていたと思った。