[[2019a/Member]] #contents *課題3 [#z9a1a765] ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。 #ref(./2019a-mission3.png,70%,コース) **フィールドの説明 [#u8d7a3a3] フィールドは課題2で使用した紙を使用する。 生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 プラ容器には色をつけたり文字や記号を書いてもよい。 プラ容器は両面テープ等でフィールドに固定してもよい。 2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。 **ルール [#y06357f8] 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。 競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。 *ロボットの説明 [#o174d6d7] 今回は2台のロボットを使った。 **ロボット1について [#s52e7521] ***ロボット1の移動 [#b2d5a012] #ref(./robo1_tizu.jpg,70%,ロボット1の移動) ***ロボット1の構造 [#n20e4cdc] ロボット1はトレーを持ち上げて、ゴールのトレーまで移動し、ひっくり返しボールを落とすようにした。 #ref(./robo_zenntai.jpg,20%,ロボット全体) ボールを落とすときにボールがこぼれないように柵を張りゴールのトレーにスムーズに入るように工夫した。 #ref(./robo1_tore.jpg,20%,ロボット1運ぶ) トレーを持ち上げるアームの所にもタイヤを設置させた。 丁度、トレーの所が引っ掛かり安定感のある運びが出来た。 #ref(./robo1_tore2.jpg,20%,ロボット1運ぶ) **ロボット2について [#ef091eb3] ***ロボット2の移動 [#z4c68b9f] 下の図のように、A`からライントレースはあまりせずにゴールまで移動するようにした。 #ref(./robo2_tizu.jpg,70%,ロボット2の移動) ***ロボット2の構造 [#xddb7bef] ロボット2は地面に置かれたボールをゴールまで運ぶようにした。 #ref(./robo_zenntai2.jpg,20%,ロボット全体2) #ref(./robo2_tore3.jpg,20%,ロボット2入れる) #ref(./robo2_tore.jpg,20%,ロボット2運ぶ) ボールを輪ゴムと使って、固定するようにした。 また、上にあるブロックも使って移動中でも落ちないように工夫した。 #ref(./robo2_tore6.jpg,20%,ロボット2運ぶ2) 上にあるブロックも使って移動中でも落ちないように工夫した。 #ref(./robo2_tore.jpg,20%,ロボット2運ぶ) *プログラムについて [#vafe2b9f] **ロボット1のプログラムについて [#h9ddb203] ***defineのプログラム [#qdf7e762] 時間と左右に90度回転をするプログラムを書いた。アームの動きが速かったため、アームの動きを遅くするプログラムも書いた。 #define RUN_TIME 610 #define power(s) SetPower(OUT_B,s); #define STEP 5 #define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(148);Off(OUT_AC); #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(120);Off(OUT_AC); ***サブルーチン [#k63b9c99] サブルーチンtoresは黒線をトレースするプログラムにした。 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); //黒なら左へ旋回 } } } サブルーチンdownはアームを下げるプログラムにした。先ほどdefineで宣言したpowerを使ってゆっくり下げるようにした。 sub down() { OnFwd(OUT_B); power(0); //ゆっくり前進 Wait(50); Off(OUT_B); Wait(100); } サブルーチンup1はアームを上げるプログラムにした。これも同様にpowerを使ってゆっくり上げるようにした。 sub up1() { OnRev(OUT_B); power(0); Wait(30); Off(OUT_B); Wait(100); } サブルーチンthrowは、容器に入ったピンポン玉を取り出すプログラムにした。 sub throw() { OnFwd(OUT_B); power(0); Wait(80); Off(OUT_B); OnRev(OUT_B); Wait(50); Off(OUT_B); } ***実行プログラム [#q6a0d096] 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(); } **ロボット2のプログラムについて [#w498a025] defineでは、時間や左右に回転するプログラムを書いた。また、アームのスピード調整のプログラムも書いた。 ***defineのプログラム [#rd3a274b] #define RUN_TIME 700 #define turn OnFwd(OUT_A);OnRev(OUT_C); #define turn2 OnFwd(OUT_C);OnRev(OUT_A); #define power(s) SetPower(OUT_B,s); //モータのパワーをsにする #define go OnFwd(OUT_AC); ***サブルーチン [#df10e504] このサブルーチンupは、アームを上げるプログラムです。アームの速度をpowerを使ってゆくっりにした。これにより、ピンポン玉を持ち上げやすくした。 sub up() { OnFwd(OUT_B); power(1);//ゆっくり前進 Wait(50); Off(OUT_B); } このサブルーチンup2はピンポン玉をアームから離すときのプログラムです。ここでもpowerを宣言した。 sub up2() { OnFwd(OUT_B); power(2);//ゆっくり前進 Wait(20); Off(OUT_B); } このサブルーチンdownは、アームを下げるプログラムです。ここでも、powerを宣言した。 sub down() { OnRev(OUT_B); power(2);//ゆっくり前進 Wait(50); Off(OUT_B); } ***実行プログラム [#sfc30d94] 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); //後退してコースから外れる } *結果 [#lf56aafe] ロボコンでは、2体ともボールを掴むことが出来なかった、電池を前日に変えてしまったからもあるが、9位という結果を残せたのはよかった。 *まとめ [#m39272a6] これまでに学んできたことをこのロボコンですべて出せたので良かった。授業中では、チームで話し合いながらロボットを作ることが出来たので、楽しめながら作成することが出来た。