*ロボットの紹介とコース攻略 [#j5cdf78b] #ref(2013a/Member/Jun/Mission2/robocon2013a_3.png,50%) ↑コース -課題1と同様タイマーを使い細かく時間を区切り、時間の調節をしやすいようにプログラムした -ロボット1…はじめにボールを缶に当てるロボット #ref(2013a/Member/Jun/Mission2/DSC_0009_1_1.jpg,10%) #ref(2013a/Member/Jun/Mission2/DSC_0011_1_2.jpg,10%) #ref(2013a/Member/Jun/Mission2/DSC_0013_1_3.jpg,10%) #ref(2013a/Member/Jun/Mission2/_36974_2_1.jpg,50%) #ref(2013a/Member/Jun/Mission2/_36972_2_2.jpg,50%) #ref(2013a/Member/Jun/Mission2/_36968_2_3.jpg,50%) +ロボット2からボールをもらう位置に移動 +向きを調節し待機 +ボールを受け、向きを調節しパス +ライントレースしボールを受け、またライントレース +缶の前までライントレースしたらシュート +後半はロボット2の前半と同様に動く -ロボット2…はじめにボールを拾うロボット #ref(2013a/Member/Jun/Mission2/_36974_2_1.jpg,50%) #ref(2013a/Member/Jun/Mission2/_36972_2_2.jpg,50%) #ref(2013a/Member/Jun/Mission2/_36968_2_3.jpg,50%) #ref(2013a/Member/Jun/Mission2/DSC_0009_1_1.jpg,10%) #ref(2013a/Member/Jun/Mission2/DSC_0011_1_2.jpg,10%) #ref(2013a/Member/Jun/Mission2/DSC_0013_1_3.jpg,10%) +ライントレースを繰り返し、ボールの前まで進む +アームを上げボールをキャッチ +再びライントレース +パス、ライントレース、受けを繰り返す +待機 +後半はロボット1と同様に動く *プログラム説明 [#h70bcb3f] -ロボット1 #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 arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); //アームを上げる #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(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 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; sub followline_l () //左側のライントレース { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); PlaySound(SOUND_UP); MOVETIME=MOVETIME+600; while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; nOnline++; }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); } } sub followline_r () //右側のライントレース { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+600; PlaySound(SOUND_DOWN); while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; nOnline++; }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); } } sub followline_l1 () //もうひとつの左側のライントレース { int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=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); } } } sub followline_r1 () //もうひとつの右側のライントレース { int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=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(); } -ロボット2 #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 arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); //アームを上げる #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(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; sub followline_l () //左側をライントレース { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); PlaySound(SOUND_UP); MOVETIME=MOVETIME+500; while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_left1; nOnline++; }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); } } sub followline_r () //右側をライントレース { int nOnline=0; int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=MOVETIME+500; PlaySound(SOUND_DOWN); while(nOnline < nMAX && FastTimer(0)<=MOVETIME){ if(SENSOR_2< THRESHOLD -14) { turn_right1; nOnline++; }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); } } sub followline_l1 () //もうひとつの左側のライントレース { int MOVETIME; MOVETIME=0; SetSensor(SENSOR_2,SENSOR_LIGHT); MOVETIME=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); } *まとめ [#qc268b16] -ライントレースをすべて時間で区切って操作していたため、調節することが大変だった。また、電池の残量にも気をつけなければならないので、非常に苦労した。 -時間が少しでもずれると2台のロボットの動きもすべてずれるので、安定してパスするということができなかった。 -結果的に私たちのチームは下から2番目の順位と残念ではあったが、みんなで協力した結果なのでしょうがない。 -このロボティクス入門ゼミは非常に難しい講義のように思えた。そして、多くのことを学ぶことができたので、これからの大学生活にいかしていきたい。