*ロボット紹介 [#w05439a6] -今回はパスを捕ることに重点をおいて製作しました。前回のようにうまくいかなくてかなりの時間を費やしてしまいました。 **全体 [#te16edb2] #ref(無題5.jpg) #ref(無題.jpg) 前回のように軽さにこだわらず、できるだけピンポン玉をとれるように大きめに作りました。 この範囲内に入れば上から押し下げるアームによって中央にピンポン玉を持ってくることが可能になってます。アームは左右対称にチュ−ブ(?)を斜めに装着することで端にピンポン玉がいってしまったとしても中央にくる仕組みです。 #ref(無題4.jpg) 部品の着脱が簡単に行えるようにできており、前回同様片づけのことも考慮したロボットになっています。 **起動部分 [#ha55f20c] #ref(無題3.jpg) アームを上げると同時に壁でピンポン玉を蹴ってシュートする仕組みになています。 アームの方が早く上がらなければ玉が引っかかってしまうため、歯車を多くつけ壁をより遅く動かすようにしました。アームが思った以上に重かったためシュート力が下がってしまってかなり苦労しました。できるだけアームを近づけることで対処しました。 *コース攻略 [#v51ff3b0] #ref(robocon2013.png) 初めはパスをもらう側 **フィールド説明 [#m9887695] -フィールドは課題1で使用した紙を2枚つなぎ合わせる -図のように直線を二本加える -図のように空き缶を配置する(緑色) **ルール [#rda38cae] -競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 -書き足した直線部からスタートする。 -図の上部からスタートしたロボットAがピンポン玉を取りにいく -直線部までピンポン玉を持ってくる (1) -直線部に入ってからロボットBへパスを送る (2) -ロボットBは直線部でパスを受け取る -ロボットBは直線部でパスを送る (3) -ロボットAは直線部でパスを受けとる -ロボットAは直線部でパスを送る (4) -ロボットBは直線部でパスを受け取る -ロボットBがゴールの空き缶の近くまでピンポン玉を運んで空き缶に当てる (5) (ただし黒い線で囲まれた空き缶の領域には入ってはいけない) -ロボットBはシュートをした後もう一つのピンポン玉を取りにいく -以後は、これまでのAとBの役割を反対にして、パスを繰り返し、最終的にはロボットAがもう一つのゴールにシュートする。 -開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 -競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 -途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 **攻略 [#t232de87] -初めにパスをもらう。 -シュートについてはあまり自信が無かったので一番のネックでした。 *プログラムの説明 [#b98a219e] #define THRESHOLD 48 #define HIPOWER 7//直進、シュート用の力 #define LOWPOWER 2//カーブ用 #define NOMALPOWER 5//パスをとるための力 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,NOMALPOWER); #define set_power_S SetPower(OUT_B,HIPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L ;\ OnFwd(OUT_C);OnRev(OUT_A); #define turn_left0 set_power_L ;\ OnFwd(OUT_C);Off(OUT_A); #define turn_right0 set_power_L ;\ OnFwd(OUT_A);Off(OUT_C); #define turn_right1 set_power_L ;\ OnFwd(OUT_A);OnRev(OUT_C); #define STEP 1 #define nMAX 300 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 20 #define cross_line set_power_L;\ go_forward;\ Wait(CROSS_TIME);short_break; #define arm_forward set_power_N; OnFwd(OUT_B);//アームを閉じる #define arm_backward set_power_N; OnRev(OUT_B);//アームを開く #define shoot set_power_S; OnRev(OUT_B);//シュート ここまでが定義 task main () { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; ClearTimer(0); while(FastTimer(0)<=200){ if(SENSOR_2< THRESHOLD -10) { turn_right1; nOnline++; }else{ if(SENSOR_2< THRESHOLD -4){ turn_right0; }else if(SENSOR_2< THRESHOLD +3){ go_forward; }else if(SENSOR_2< THRESHOLD +10){ turn_left0; }else{ turn_left1; } nOnline=0; } Wait(STEP); } 通常のライントレース。 PlaySound(SOUND_UP); turn_left1;Wait(120);Off(OUT_AC); arm_backward;Wait(100);Off(OUT_B);Wait(1500); arm_forward;Wait(10);Off(OUT_B); 相手のほうを向いてアームをあげ、パスをキャッチ。 PlaySound(SOUND_UP); turn_left1;Wait(130);Off(OUT_AC); ライントレースをするため向きを元に戻す。 ClearTimer(0); while(FastTimer(0)<=300){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; } if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } 通常のライントレース。外側を走らせることで交差点を無視できる。 PlaySound(SOUND_UP);Off(OUT_AC); turn_right1;Wait(145);go_forward;Wait(30); shoot;Wait(50);Off(OUT_AC);Wait(0);Off(OUT_B); OnRev(OUT_AC);Wait(80);turn_left1;Wait(130);Off(OUT_AC); 相手の方を向き、シュート。 ClearTimer(0); while(FastTimer(0)<=700){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; } if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } PlaySound(SOUND_UP); turn_right1; Wait(120); arm_backward; ClearTimer(0); while(FastTimer(0)<=2600){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_left1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_left0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_right0; }else if(nOnline < nMAX){ turn_right1; } nOnline=0; }if(nOnline >= nMAX){ short_break; turn_right1; Wait(STEP); cross_line; nOnline=0; } } PlaySound(SOUND_UP); arm_forward; ClearTimer(0); while(FastTimer(0)<=4000){ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -8)){ turn_right1; nOnline++; }else{ if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD -3)){ turn_right0; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +3)){ go_forward; }else if((nOnline < nMAX)&&(SENSOR_2< THRESHOLD +8)){ turn_left0; }else if(nOnline < nMAX){ turn_left1; } nOnline=0; }if(nOnline >= nMAX){ short_break; turn_left1; Wait(STEP); cross_line; nOnline=0; } } } *まとめ [#s6b69a6d] 期末試験があったためあまり時間がとれず、結局完成することができませんでした。今回の課題は思ったとおり難しく、ロボット作成の時点でつまずいてしまいプログラムにあまり時間をかけることができませんでした。 プログラムを考えたり、ロボットの製作は思った以上に大変でしたが、ペアまたはチームで考え合い、協力し、試行錯誤しながら、なによりも楽しみながらすることができました。 最後は残念な結果になってしまいましたが、この講義で学んだことを今後にいかしていきたいと思います。