[[2009b]] ---------------------------- CENTER:&size(30){ロボコン〜玉入れロボット〜}; ---------------------------- RIGHT:製作者:ゆあ,kata,PuKKu CENTER:只今作成中 目次 #contents *ロボコンの競技内容(詳しくは[[ロボコン>2009b/ロボコン]]へ) [#kf84829c] ピンポン玉をできるだけ多く所定の場所に入れる。 **フィールド [#v585f877] #ref(2009b/A2/ロボコン/field3.jpg,around,60%) -フィールドは約160cm×110cm -18個のピンポン玉はフィールドの中央にある、2x4の角材(長さ40cm)2本にはさまれた正方形の領域にあり、領域のこの角材が置かれていない辺には500mlの紙パックが並べられている -紙パックはすべての面に白あるいは緑色の画用紙がはられている -目的地の長方形は19mm×19mmの角材で仕切られていて -黒い線の太さは約25mm #Clear LEFT:単位(mm) **ルール [#x4a2fa56] ''基本ルール'' -それぞれスタートと同じ記号のところにピンポン玉を入れる -単独の競技(1回)%%および対戦の競技(リーグ戦、計2回の対戦)の合計点%%で争う。 -スタート時は「スタート地点」の内部以外に接していないこと。 -スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。 -開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。 -競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 -途中でうまく動かなくなった場合、1回限り再スタートすることができる。 -競技時間終了までにもとのスタート地点にもどらなければならない%%(リーグ戦では戻らなくてもよい)%%。 -競技時間は3分とする。ただし審判が、競技続行不能と判断した場合は途中で終了する。 RIGHT:([[2009b/ロボコン>2009b/ロボコン]]より抜粋) *ロボットの作成 [#tc0f6bb4] **方針 [#e8e50710] 確実に多くのピンポン玉を集めて所定の場所に入れたい。それを行うために重要なことは次の2点であった。 ***ピンポン玉をどう集めて入れるか [#r4d3fcec] #ref(2009b/A2/ロボコン/IMG_000110.jpg,right,around,20%) ピンポン玉を入れる目的地は19mmの高さで囲まれているため、直径が40mmであるピンポン玉を入れるには、ただ単に押し込むだけでは難しい。そのため、ピンポン玉を枠の中に入れるには、少しだけも持ち上げていれる必要がある。その方法として考えられるのは、集めるときにピンポン玉を持ち上げる方法と入れるときに持ち上げる方法がある。私たちは、試行錯誤の末、両方の方式でロボットを作ってみることにした。 #Clear ***紙パックをどうするか [#ee561274] 今回のロボコンの課題で大きな問題となるのが、この紙パックだ。当初は、追突すれば、どうにかなるかと考えていた。だが、実際にできたフィールドを見てみると図のように、紙パックの間にすき間がなく、しかも5つの紙パックだけが丁度入る広さだったのだ。そのために、無闇にぶつかって行くと、摩擦によって周りの紙パックも一緒に内側に入り、ピンポン玉が取りにくくなってしまう。だから、私たちは上から紙パックを覆い、引きぬいて紙パックを移動させることにした。 **ロボコンまでの過程 [#rb97b1ea] **完成(最終形態) [#xbf4ef1a] **ロボットの特徴 [#md2f42a5] ***ピンポン玉を集めて入れるロボット [#u7417795] ***紙パックを移動させるロボット [#xfcfd65d] **工夫した点・苦労した点など [#w064da81] **問題点 [#pe82b4ab] *プログラム [#v757cfd6] **ピンポン玉を集めて入れるロボット [#u3587279] *最初 [#ce4cbb86] define Bright 45 #define GOFWD(t) OnRev(OUT_A+OUT_C); Wait(t); #define Stop Off(OUT_A+OUT_C); #define GOREV OnFwd(OUT_A+OUT_C); task main () { SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_1,SENSOR_ROTATION); while(SENSOR_2 > Bright){ GOFWD(10); } Wait(10); while(SENSOR_2>Bright){ OnRev(OUT_C); Off(OUT_A); } PlaySound(SOUND_DOUBLE_BEEP) ; ClearSensor(SENSOR_1); while (abs(SENSOR_1)< 60) { if (SENSOR_2 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´ OnRev(OUT_A); Off(OUT_C); Wait(20); } else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´ Off(OUT_A); OnRev(OUT_C); Wait(20); } } Stop; ClearSensor(SENSOR_1); OnRev(OUT_B); //start arm; /*while(abs(SENSOR_1)<5){ OnRev(OUT_C); Float(OUT_A); Wait(40); OnFwd(OUT_A); Wait(5); }*/ ClearTimer(0); while(FastTimer(0)<150){ OnRev(OUT_A); Float(OUT_C); Wait(60); OnFwd(OUT_C); Wait(20); } Stop; PlaySound(SOUND_DOUBLE_BEEP) ; while(abs(SENSOR_1)<40){ GOFWD(10); } Stop; Wait(100); //stop arm; PlaySound(SOUND_FAST_UP) ; ClearSensor(SENSOR_1); /*while(SENSOR_3<Bright){ GOREV; }*/ while(abs(SENSOR_1)<40){ GOREV; } Stop; Off(OUT_B); /*ClearTimer(0); while(FastTimer(0)<150){ OnFwd(OUT_A); Float(OUT_C); Wait(40); OnRev(OUT_C); Wait(5); } Stop;*/ while(SENSOR_2>Bright){ OnFwd(OUT_C); OnRev(OUT_A); } /*while(SENSOR_3>Bright){ GOREV; }*/ PlaySound(SOUND_FAST_UP) ; Stop; ClearTimer(0); ClearSensor(SENSOR_1); while (FastTimer(0)<500) { if (SENSOR_3 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´ OnFwd(OUT_C); Off(OUT_A); } else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´ Off(OUT_C); OnFwd(OUT_A); } } Stop; ClearSensor(SENSOR_1); while(abs(SENSOR_1)<=20){ OnFwd(OUT_C); Float(OUT_A); Wait(20); OnRev(OUT_A); } ClearTimer(0); while(FastTimer(0)<500){ OnFwd(OUT_A+OUT_C); } /*ClearSensor(SENSOR_1); while(abs(SENSOR_1)<=180){ OnFwd(OUT_A+OUT_C); } Stop;*/ /*ClearSensor(SENSOR_1); while(abs(SENSOR_1)<=90){ OnFwd(OUT_A); Float(OUT_C); Wait(40); OnRev(OUT_C); Wait(40); } Stop;*/ /*while((SENSOR_3>Bright) || (SENSOR_2>Bright)){ if(SENSOR_3<Bright){ OnRev(OUT_C); Off(OUT_A); }else if(SNESOR_2<Bright){ OnRev(OUT_A); Off(OUT_C); }else{ GOFWD(10); } } GOREV(300);*/ //ClearSensor(SENSOR_1); /*while(SENSOR_2 < Bright){ OnRev(OUT_A); Float(OUT_C); }*/ while(SENSOR_2<Bright){ OnRev(OUT_A+OUT_C); } ClearTimer(0); ClearSensor(SENSOR_1); while (abs(SENSOR_1)<=450) { if (SENSOR_2 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´ OnRev(OUT_A); Off(OUT_C); } else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´ Off(OUT_A); OnRev(OUT_C); } } Stop; } /*task arm(){ while(true){ OnFwd(OUT_B); } Off(OUT_B); }*/ *二個目 [#fb5f7e3b] #define FWD_AC OnFwd(OUT_A+OUT_C); #define FWD_A OnFwd(OUT_A); #define FWD_C OnFwd(OUT_C); #define REV_AC OnRev(OUT_A+OUT_C); #define REV_A OnRev(OUT_A); #define REV_C OnRev(OUT_C); #define OFF_AC Off(OUT_A+OUT_C); #define OFF_A Off(OUT_A); #define OFF_C Off(OUT_C); #define FLOAT_AC Float(OUT_A+OUT_C); #define FLOAT_A Float(OUT_A); #define FLOAT_C Float(OUT_C); #define THRESHOLD 45 #define ARM_OPEN OnFwd(OUT_B); #define ARM_CLOSE OnRev(OUT_B); #define ARM_STOP Off(OUT_B); task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_ROTATION); SetSensor(SENSOR_3,SENSOR_LIGHT); Wait(3000); ClearSensor(SENSOR_2); while(abs(SENSOR_2)<=21){ FWD_AC; } while(abs(SENSOR_2)<=45){ line_trace(); } 45r(); OFF_AC; Wait(100); /*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){ if(SENSOR_1>THRESHOLD){ REV_C;OFF_A; }else if(SENSOR_3>THRESHOLD){ REV_A;OFF_C; }else{ REV_AC; } } OFF_AC; ARM_CLOSE; Wait(25); ARM_STOP;*/ ClearSensor(SENSOR_2); while(abs(SENSOR_2)<25){ FWD_AC; } OFF_AC; Wait(100); ARM_CLOSE; Wait(50); ARM_STOP; ClearSensor(SENSOR_2); /*while(abs(SENSOR_2)<25){ REV_AC; }*/ while(abs(SENSOR_2)<24){ REV_AC; } OFF_AC; Wait(100); ClearSensor(SENSOR_2); ClearTimer(0); while(SENSOR_1>THRESHOLD) { FWD_C;REV_A; } ClearSensor(SENSOR_2); while(SENSOR_3>THRESHOLD){ line_trace1(); } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<=15){ FWD_A;REV_C; } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<30){ line_trace1(); } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<5){ FWD_C;REV_A; } OFF_AC; Wait(10); FWD_AC; Wait(300); OFF_AC; ARM_OPEN;Wait(30); ARM_STOP; while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){ REV_AC; } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<=5){ FWD_C;REV_A; } while(SENSOR_1>THRESHOLD){ line_trace3(); } while(abs(SENSOR_2)<=5){ FWD_C;REV_A; } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<200){ line_trace3(); } OFF_AC; /*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){ line_trace(); } while(SENSOR_1<THRESHOLD){ FWD_A;REV_C; } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<=15){ line_trace(); } ClearSensor(SENSOR_2); while(abs(SENSOR_2)<=5){ FWD_C;REV_A; } FWD_AC;Wait(300); OFF_AC; /*ARM_OPEN; Wait(25); ARM_STOP; while((SENSOR_1>THRESHOLD) ||(SENSOR_3>THRESHOLD)){ REV_AC; } while(abs(SENSOR_2)<5){ FWD_C;REV_A; } while(SENSOR_1)*/ } sub line_trace(){ if(SENSOR_1<THRESHOLD){ FWD_C;REV_A; }else if(SENSOR_3<THRESHOLD){ FWD_A;REV_C; }else { FWD_AC; } } sub line_trace1(){ if(SENSOR_1<THRESHOLD){ FWD_A;OFF_C; }else{ FWD_C;OFF_A; } } sub line_trace3(){ if(SENSOR_3<THRESHOLD){ FWD_C;OFF_A; }else{ FWD_A;OFF_C; } } sub 45r(){ ClearSensor(SENSOR_2); while(abs(SENSOR_2)<5){ FWD_A;REV_C; } } sub 45l(){ ClearSensor(SENSOR_2); while(abs(SENSOR_2)<5){ FWD_C;REV_A; } } **紙パックを移動させるロボット [#t63d2905] #define eye_L SENSOR_1 #define eye_R SENSOR_3 #define cont 45 #define time 2 #define new_count ClearSensor(SENSOR_2) sub follow_line() { if ((eye_L >= cont ) && (eye_R >= cont )){ OnRev(OUT_A+OUT_C); Wait(time); Off(OUT_A+OUT_C); } else if ((eye_L >= cont ) && (eye_R <= cont )){ OnRev(OUT_A); Wait(time); Off(OUT_A); } else if ((eye_L <= cont ) && (eye_R >= cont )){ OnRev(OUT_C); Wait(time); Off(OUT_C); } else { OnRev(OUT_A+OUT_C); Wait(time); Off(OUT_A+OUT_C); } } task main () { SetSensor(eye_L, SENSOR_LIGHT); SetSensor(eye_R, SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_ROTATION); Wait(20); new_count; while ( abs(SENSOR_2) <= 35 ) { follow_line(); } Off(OUT_A+OUT_C); Wait(50); new_count; while ( abs(SENSOR_2) <= 3 ) {OnRev(OUT_A); OnFwd(OUT_C);} OnRev(OUT_A); OnFwd(OUT_C); Wait(5); OnRev(OUT_A+OUT_C); Wait(45); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_B); Wait(200); Off(OUT_B); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(15); OnRev(OUT_A); OnFwd(OUT_C); Wait(15); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(60); Off(OUT_A+OUT_C); Wait(100); new_count; while ( abs(SENSOR_2) <= 3 ) { OnFwd(OUT_A); OnRev(OUT_C); } Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(10); OnRev(OUT_A); OnFwd(OUT_C); Wait(10); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); Wait(5); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(5); Off(OUT_A+OUT_C); new_count; while ( abs(SENSOR_2) <= 27) { follow_line(); } PlaySound(1); Off(OUT_A+OUT_C); Wait(100); new_count; while ( abs(SENSOR_2) <= 10) { OnFwd(OUT_A+OUT_C); } Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(30); Off(OUT_A+OUT_C); Off(OUT_A+OUT_C); Wait(20); OnRev(OUT_A+OUT_C); Wait(30); Off(OUT_A+OUT_C); Wait(50); new_count; while ( abs(SENSOR_2) <= 45 ) { follow_line(); } Wait(50); OnFwd(OUT_A+OUT_C); Wait(20); Off(OUT_A+OUT_C); repeat(3) { OnRev(OUT_A); OnFwd(OUT_C); Wait(5); Off(OUT_A+OUT_C); Wait(50); OnRev(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); Wait(50); OnRev(OUT_A); OnFwd(OUT_C); Wait(10); Off(OUT_A+OUT_C); Wait(50); } PlaySound(1); Off(OUT_A+OUT_C); new_count; while ( abs(SENSOR_2) <= 51 ) { follow_line(); } OnFwd(OUT_B); Wait(190); Off(OUT_B); Wait(100); OnFwd(OUT_A+OUT_C); Wait(40); Off(OUT_A+OUT_C); PlaySound(1); Off(OUT_A+OUT_C); new_count; while ( abs(SENSOR_2) <= 3 ) { OnRev(OUT_A); OnFwd(OUT_C); } Off(OUT_A+OUT_C); OnRev(OUT_A); OnFwd(OUT_C); Wait(7); Off(OUT_A+OUT_C); Wait(20); new_count; while ( abs(SENSOR_2) <= 45 ) { follow_line(); } OnRev(OUT_C); Wait(80); OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); } ** [#e7a10b86] *感想(ロボコンを終えて) [#ob2b7f89] *コメント [#o919465d] #comment