ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
ロボコンのフィールド平面図 フィールドの説明 フィールドは課題2で使用した紙を使用する。 生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 プラ容器には色をつけたり文字や記号を書いてもよい。 プラ容器は両面テープ等でフィールドに固定してもよい。 2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
私は今回の課題では2体のロボットを製作し、それぞれを役割で分けて動作するようにしました。以下より2体のロボットは「ロボット1」、「ロボット2」と分けて呼ぶこととします。
ロボット1は容器に入ったピンポン玉を回収し、別の容器に移す役割を担う。
光センサーが48より大きい値を示すとき(白)で右に曲がる
光センサーが45と49の間の値を示すとき(灰色)で左に曲がる
光センサーが44より小さい値を示すとき(黒)で左に旋回する
このように3つの曲がる動きだけを入力し、大きなカーブを曲がりやすいようにしました。
ピンポン玉が入った容器ごと運ぶ仕組みになっています。
図1
図1のように持ち上げたい容器の横両方にタイヤのついたアームを滑り込ませ、容器のひっかけ部分をアームで持ち上げます。この時、アームについたタイヤが滑り止めの役割を担い、容器がアームから滑り落ちにくくなるようにしてあります。
図2
図2より、アームを限界まであげることによって容器の中のピンポン玉がロボット側にこぼれ落ちます。そのこぼれ落ちたピンポン玉が斜めになっているロボットの背を通ってロボットの後ろに落ちるようにしました。ロボットの背に簡単な柵を設置してピンポン玉が横から滑り落ちることを防ぐようにしてあります。
BからC地点までは行動時間を設定したライントレースによって移動。その後はライントレース無しのタイヤの動きのみによる移動を行う。
赤丸地点にて容器を掴む
緑丸地点にて容器を掴んだアームを上げ、もう一つの容器にボールを入れる
ロボット2は地面に置かれたピンポン玉を回収し、容器に入れるロボットであるが今回のプログラムでは回収するピンポン玉は一つだけとしている。その理由は2台のロボットを同時に動かすうえでロボット同士が接触してしまうことを防ぐためである。
Aと左のタイヤを動かすモーター(赤丸位置)を接続
Cと右のタイヤを動かすモーター(緑丸位置)を接続
Bとアームを動かすモーター(青丸位置)を接続
図A
輪ゴムを図Aの通りに設置し、ロボット2が地面に置かれたピンポン玉にアームを上から押しつけて輪ゴムの間に入り込むようにしました。
図B
図Bのようにロボット2の上部につけられた柱にアームに引っかかったピンポン玉を押し付け、ロボット2に設置された輪ゴムからピンポン玉が抜け落ちるようにしました。
赤丸地点L′にて置かれたピンポン玉を掴む
緑丸地点にてピンポン玉を掴んだアームを上げ、もう一つの容器にボールを入れる
容器にピンポン玉を一つ入れた後、後退して停止する。
光センサーの数値の定義に関しては状況によってセンサーの反応の具合が異なるため、 プログラムを見てすぐに変えられるよう多くを定義しませんでした。
#define RUN_TIME 610 //6.1秒
#define STEP 5
#define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(148);Off(OUT_AC); //右に90度旋回
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(120);Off(OUT_AC); //左に90度旋回
#define power(s) SetPower(OUT_B,s); //アームの動きをゆっくりにする
sub tores() //ライントレースのサブルーチン { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while ( FastTimer(0) <= RUN_TIME ) { if ( 48 < SENSOR_2 ){ OnFwd(OUT_A); Off(OUT_C); //白なら右へ } else if (45 <SENSOR_2 < 49) { Off(OUT_A); OnFwd(OUT_C); //灰色なら左へ } else { OnRev(OUT_A);OnFwd(OUT_C); //黒なら左へ旋回 } } }
sub down() //アームをゆっくりおろす動き { OnFwd(OUT_B); power(0); Wait(50); Off(OUT_B); Wait(100); }
sub up1() //アームをゆっくりあげる動き { OnRev(OUT_B); power(0); Wait(30); Off(OUT_B); Wait(100); }
sub throw() //容器に入ったピンポン玉を取り出す動作 { OnFwd(OUT_B); power(0); Wait(80); //アームをゆっくりさげる Off(OUT_B); OnRev(OUT_B); Wait(50); //アームを素早くあげる Off(OUT_B); }
task main() { OnFwd(OUT_AC); //地点Bまで前進 Wait(100); tores(); //BからCまでのライントレース turn; //ピンポン玉の入った容器のある方に向けて右に90度旋回 OnRev(OUT_AC); //少し後退してアームが容器に当たらないようにスペースをとる Wait(120); Off(OUT_AC); down(); //アームをおろす OnFwd(OUT_AC); //前進してアームの間に容器を挟む Wait(130); Off(OUT_AC); up1(); //容器を持ち上げる(アームをあげる) OnRev(OUT_AC); //そのまま後退して位置調整 Wait(415); turn_left; //左に90度旋回 OnRev(OUT_AC); //後退 Wait(140); Off(OUT_AC); throw(); //運んでいた容器からピンポン玉を取り出し、別容器に移す }
終了
#define RUN_TIME 700
#define turn OnFwd(OUT_A);OnRev(OUT_C);
#define turn2 OnFwd(OUT_C);OnRev(OUT_A);
#define go OnFwd(OUT_AC);
#define power(s) SetPower(OUT_B,s); //モータのパワーをsにする
sub up() //アームをゆっくりあげる動作(ピンポン玉を持ち上げる) { OnFwd(OUT_B); power(1); Wait(50); Off(OUT_B); }
sub up2() //アームをゆっくりあげる動作(ピンポン玉をアームから離す) { OnFwd(OUT_B); power(2); Wait(20); Off(OUT_B); }
sub down() //アームをゆっくりさげる動作 { OnRev(OUT_B); power(2); Wait(50); Off(OUT_B); }
task main() { go;Wait(110);Off(OUT_AC); //A地点を出発して旋回する位置まで直進 turn2;Wait(70);Off(OUT_AC); //左に90度旋回 go;Wait(210);Off(OUT_AC); //K′地点まで直進 turn;Wait(70);Off(OUT_AC); //右に90度旋回 go;Wait(30);Off(OUT_AC); //L′地点まで直進 down();Wait(30); //ピンポン玉を掴む(アームをさげる) up();Wait(30); //ピンポン玉を掴んで保持しながらアームをあげる turn2;Wait(70);Off(OUT_AC); //左に90度旋回 go;Wait(10);Off(OUT_AC); //前進して容器に近づく up2();Wait(30); //ピンポン玉を押し出して容器にピンポン玉を入れる OnRev(OUT_AC);Wait(1000);Off(OUT_AC); //後退してコースから外れる }
終了
最終的にはうまくいかず、ボールを掴むことも出来なかった。
これまでゼミで学んだことを詰め込んで挑戦したロボコンであったが結果は微妙なものであった。しかし、同じグループのメンバーと相談し合い、ロボットを作ることが出来たので良かったと思う。