*ロボットの紹介 [#obe56021] +最初にボールを取りに行きパスをするロボット -後ろから見たロボット(全体的に前に重さがあったのでライントレースの際に揺れてうしろに倒れないためとバランスを考え後ろにタイヤを付けた) #ref(./DSC_0013.jpg,10%,画像の説明) -横から見たロボット1(後ろの水色のパーツでボールをパスできる) #ref(./DSC_0012.jpg,10%,画像の説明) -横から見たロボット2(後ろの水色のパーツ以外でライントレースの際ボールがでないようにしている) #ref(./DSC_0011.jpg,10%,画像の説明) -後ろのタイヤの部分(タイヤを固定するとラインとレースの際はただ引きずるだけになってしますのであえて固定しないことでラインとレースの際にも引きずらないようにすることができた) #ref(./DSC_0010.jpg,10%,画像の説明) -ロボットの前の方(水色のものはライトセンサー) #ref(./DSC_0009.jpg,10%,画像の説明) -ボールを運ぶ・取る・渡す部分(見づらいがライトセンサーの前の水色のパーツでパスができて、ほかの部分は出ないようにしている) #ref(./DSC_0008.jpg,10%,画像の説明) +シュートをするロボット(ほぼつくりは一緒) -ボールを運ぶ・取る・渡す部分(一つ目のロボットに比べてシンプル) #ref(./_36974.jpg,30%,画像の説明) -横からのロボット(タイヤの部分が1つ目のロボットが違う) #ref(./_36972.jpg,30%,画像の説明) -タイヤの部分(こっちはタイヤが二つで安定させている・軽い) #ref(./_36968.jpg,30%,画像の説明) -タイヤの部分(こっちはタイヤが二つで安定させている・軽い) #ref(./_36972.jpg,30%,画像の説明) *コースの攻略方法 [#abd3b534] #ref(./robocon2013a.png,50%,画像の説明) -コースの攻略するために利用したもの +ライトセンサーによるライントレース +タイマーで時間を区切りパスなどの動作を挟む +カウンターで交差点の通過 *プログラムの説明 [#hd4ddfb8] +工夫したとこ -サブルーチンを使用した -タイマーを使用し動作をきめた ライントレース用のサブルーチンにサウンドを作りどの、ライントレースをしているか判断できるようにした +最初にシュートを打つロボット 問題点・・・・もうひとつのロボットからのパスのタイミングが合わない時があり #define THRESHOLD 42 // しきい値(黒白判断するために利用する) #define HIPOWER 7 // ハイパワー(直進時に使用) #define LOWPOWER 2 // ローパワー(直進時以外に使用) #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,LOWPOWER); #define go_fwd 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 3 // カウンターの最大値 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 300 // 交差点をわたる時間 #define cross_line set_power_L;\ // 交差点を渡る動作 OnFwd(OUT_A);OnRev(OUT_C);\ Wait(CROSS_TIME);short_break; /* 黒を続けてnMAX回繰り返さない&タイマーが6秒を超えるまで通常のライントレースをする(ラインの左側) */ sub followline_l () { int nOnline=0; // カウンターをリセット int MOVETIME; MOVETIME=0; // MOVETIMEに0を代入 SetSensor(SENSOR_2,SENSOR_LIGHT); PlaySound(SOUND_UP); // 音を鳴らす(どのサブルーチンを使用しているか判断できるよう) MOVETIME=MOVETIME+600; // MOVETIMEに600を代入 while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; nOnline++; // カウンタに1プラス }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP*10); } } /* 黒を続けてnMAX回繰り返さない&タイマーが6秒を超えるまで通常のライントレースをする(ラインの右側) */ sub followline_r () { int nOnline=0; // カウンタをリセット int MOVETIME; MOVETIME=0; // MOVETIMEをリセット SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+600; // MOVETIMEに600を代入 PlaySound(SOUND_DOWN); // 音を鳴らす while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; nOnline++; // カウンタに1プラス }else{ if(SENSOR_2< THRESHOLD -10){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP*10); } } /* タイマーが6秒を超えるまで通常のライントレースをする(ラインの左側) */ sub followline_l1 () { int MOVETIME; MOVETIME=0; // MOVETIMEをリセット SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+450; // MOVETIMEに450を代入 PlaySound(SOUND_LOW_BEEP); // 音を鳴らす while(FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } Wait(STEP*10); } } } /* タイマーが6秒を超えるまで通常のライントレースをする(ラインの右側) */ sub followline_r1 () { int MOVETIME; MOVETIME=0; // MOVETIMEをリセット SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+150; // MOVETIMEに150を代入 PlaySound(SOUND_CLICK); // 音を鳴らす while(FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; }else{ if(SENSOR_2< THRESHOLD -10){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD +1){ turn_left0; }else{ turn_left1; } Wait(STEP*10); } } } /* ボールをとる */ sub catch_1 () { turn_right1;Wait(100); Off(OUT_AC);Wait(50); go_fwd;Wait(50); Off(OUT_AC);Wait(50); OnFwd(OUT_B);Wait(15); Off(OUT_B);Wait(10); turn_left1;Wait(100); Off(OUT_AC);Wait(50); } /* ボールをパスする */ sub throw_1 () { OnFwd(OUT_B);Wait(10); Off(OUT_B);Wait(10); } /* パスを受ける */ sub get_1() { OnFwd(OUT_B);Wait(10); Off(OUT_B);Wait(300); OnRev(OUT_B);Wait(40);Off(OUT_B);Wait(10); } task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); int nOnline; int MOVETIME; turn_left1;Wait(180); Off(OUT_AC);Wait(10); ClearTimer(0); // タイマーリセット while(FastTimer(0)<=150){ followline_r1(); } Off(OUT_AC); Wait(3500); turn_left1;Wait(80); Off(OUT_AC);Wait(100); get_1(); turn_left1;Wait(50); Off(OUT_AC);Wait(800); throw_1(); turn_left1;Wait(80); Off(OUT_AC);Wait(10); ClearTimer(0); // タイマーリセット while(FastTimer(0)<=450){ followline_l1(); } Off(OUT_AC); Wait(50); ClearTimer(0); // タイマーリセット turn_right1;Wait(120);Off(OUT_AC);Wait(10); get_1(); turn_left1;Wait(130);Off(OUT_AC);Wait(10); ClearTimer(0); // タイマーリセット while(FastTimer(0)<=600){ followline_l(); } Off(OUT_AC); Wait(50); turn_left1;Wait(30);Off(OUT_AC);Wait(10); throw_1(); turn_right1;Wait(100);Off(OUT_AC);Wait(10); ClearTimer(0); // タイマーリセット while(FastTimer(0)<=600){ followline_l(); } Off(OUT_AC); Wait(50); ClearTimer(0); // タイマーリセット catch_1(); } +最初に球を取りに行くロボット 問題点・・・・・最初の球をとれるの確率がひくい+一本目のパスを通すことができない #define THRESHOLD 39 // しきい値 #define HIPOWER 7 // ハイパワー #define LOWPOWER 2 // ローパワー #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define set_power_N SetPower(OUT_B,LOWPOWER); #define go_fwd set_power_H; OnFwd(OUT_AC); // 直進 #define throw set_power_H; OnFwd(OUT_B); // ボールをはなす #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 200 // カウンタの最大値 #define short_break Off(OUT_AC); Wait(100); #define CROSS_TIME 300 // 交差点を渡る時間 #define cross_line set_power_L;\ OnFwd(OUT_A);OnRev(OUT_C);\ Wait(CROSS_TIME);short_break; /* 黒を続けてnMAX回繰り返さない&タイマーが5秒を超えるまで通常のライントレースをする(ラインの左側) */ sub followline_l () { int nOnline=0; // タイマーをリセット int MOVETIME; MOVETIME=0; // MOVETIMEをリセット SetSensor(SENSOR_2,SENSOR_LIGHT); PlaySound(SOUND_UP); // 音を鳴らす MOVETIME=MOVETIME+500; // MOVETIMEに500を代入 while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; nOnline++; // カウンタに1プラス }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } nOnline=0; // カウンタのリセット } Wait(STEP*10); } } /* 黒を続けてnMAX回繰り返さない&タイマーが5秒を超えるまで通常のライントレースをする(ラインの右側) */ sub followline_r () { int nOnline=0; // カウンタのリセット int MOVETIME; MOVETIME=0; // MOVETIMEのリセット SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+500; // MOVETIMEに500を代入 PlaySound(SOUND_DOWN); // 音を鳴らす while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; nOnline++; // カウンタに1プラス }else{ if(SENSOR_2< THRESHOLD -10){ turn_right0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_left0; }else{ turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP*10); } } /* タイマーが5秒を超えるまで通常のライントレースをする(ラインの左側) */ sub followline_l1 () { int MOVETIME; MOVETIME=0; // MOVETIMEのリセット SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+500; MOVETIMEに500を代入 PlaySound(SOUND_LOW_BEEP); // 音を鳴らす while(FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; }else{ if(SENSOR_2< THRESHOLD -10){ turn_left0; }else if(SENSOR_2< THRESHOLD -7){ go_fwd; }else if(SENSOR_2< THRESHOLD -1){ turn_right0; }else{ turn_right1; } Wait(STEP*10); } } } /* ボールをとる */ sub catch_1 () { turn_right1;Wait(125); Off(OUT_AC);Wait(50); go_fwd;Wait(20); Off(OUT_AC);Wait(10); OnFwd(OUT_B);Wait(11); Off(OUT_B);Wait(10); go_fwd;Wait(170); Off(OUT_AC);Wait(1); OnRev(OUT_B);Wait(10); Off(OUT_B);Wait(50); turn_left1;Wait(20); Off(OUT_AC);Wait(2); } /* ボールをパスする */ sub throw_1 () { throw;Wait(50); Off(OUT_B);Wait(10); } /* パスをうけとる */ sub get_1 () { OnFwd(OUT_B);Wait(10); Off(OUT_B);Wait(600); OnRev(OUT_B);Wait(50); Off(OUT_B);Wait(50); } task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); int nOnline; // カウンタリセット int MOVETIME; while(FastTimer(0)<=500){ followline_l(); } Off(OUT_AC); Wait(1); ClearTimer(0); // タイマーのリセット while(FastTimer(0)<=500){ followline_l(); } Off(OUT_AC); Wait(1); catch_1(); ClearTimer(0); // タイマーのリセット while(FastTimer(0)<=500){ followline_l(); } Off(OUT_AC); Wait(1); ClearTimer(0); // タイマーのリセット turn_right1;Wait(10); while(FastTimer(0)<=300){ followline_l1(); } Off(OUT_AC);Wait(1); ClearTimer(0); // タイマーのリセット turn_left1; Wait(30); turn_right1;Wait(30); while(FastTimer(0)<=500){ followline_r(); } Off(OUT_AC); Wait(1); ClearTimer(0); // タイマーのリセット while(FastTimer(0)<=500){ followline_r(); } Off(OUT_AC); Wait(1); ClearTimer(0); // タイマーのリセット turn_left1;Wait(200); Off(OUT_AC);Wait(50); throw_1(); turn_right1;Wait(80); Off(OUT_AC);Wait(10); while(FastTimer(0)<=500){ followline_r(); } Off(OUT_AC); Wait(1); ClearTimer(0); // タイマーのリセット while(FastTimer(0)<=500){ followline_r(); } Off(OUT_AC); Wait(1); PlaySound(SOUND_CLICK); // 音を鳴らす ClearTimer(0); // タイマーのリセット turn_left1;Wait(180); Off(OUT_AC);Wait(50); get_1(); turn_right1;Wait(60); Off(OUT_AC);Wait(600); throw_1(); Off(OUT_B);Wait(50); Off(OUT_AC);Wait(50); } *まとめ [#ac33e858] -時間ですべての動作をコントロールしていたので、電池の量によって進む距離が異なりとても時間を合わせるのが難しかった。 -私達のロボットは、球を取ることができてもうまくパスを出すことができんかったことが多かったので、その部分をもう少し改善することによって、精度をあげれたらよかった。 -ロボコンでも下から2番めの順位で残念だった。この課題のために多くの時間をかけたのでなおさら残念だった。 - *ゼミの感想 [#j25b4ece] -このゼミはとても難しい。とくに課題の時、ロボットをまず作り、そのあとにプログラムも考えるので、やることがたくさんあり、テスト勉強との両立が大変だった。しかし、実際に自分が想像してた動きがプログラムでかけることができたときの達成感はとてもよかった。 -これから、こういったプログラム等に関わる人には、いい勉強にもなったし、これから先、こういったことをしない人にもいい思い出ができたと思います。 -ロボットを作成したり解体したりする際、もっと綺麗にパーツごと揃えていれば最後のパーツの確認が楽になると思った。