目次 #contents *ロボットの説明 [#u91f4c0f] -任務 +今回作ったロボットは自作したコースに沿って一周するロボットです。交差点をきちんと認識し、正しく判断して通過できるようにする。 確実に一周できるようにする。スタート地点から出発して元にもどるようにする。空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。 -問題点 +交差点の認識が一番難しいだと思う、センサーの認識度が低いです。 -解決方法 +ロボットは一つずつ交差点到着する時間を測量する、時間によってどちらの交差点の前止めできる、そして自身を調節する交差点を通過する。 -長所 +正確に交差点を渡させる -写真 &ref(./32764676.jpeg,100%,robotto); &ref(2013b/Member/dtb/Mission1/bk201.gif,100%,keiro); *プログラム [#s2c3add9] #define THRESHOLD 37 #define HIPOWER 6 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define turn_left set_power_L;Off(OUT_A);OnFwd(OUT_C); #define senkai_left set_power_L;OnRev(OUT_A);OnFwd(OUT_C); #define turn_right set_power_L;Off(OUT_C);OnFwd(OUT_A); #define senkai_right set_power_L;OnRev(OUT_C);OnFwd(OUT_A); #define go_forward set_power_H;OnFwd(OUT_AC); #define STEP 1 #define SAIDAI 3 #define short_break Off(OUT_AC);Wait(80); //小休憩 #define CROSS_TIME 60 //交差点を渡る時間 #define cross_line(p,q) short_break;senkai_right;Wait(p);senkai_left;Wait(q);go_forward;\ Wait(CROSS_TIME);Off(OUT_AC); //交差点渡る #define counter3 PlaySound(SOUND_CLICK);Off(OUT_AC);Wait(50);//3回鳴ると交差点を渡る #define GOOL short_break;turn_right;Wait(350);go_forward;Wait(100);Off(OUT_AC); sub akikan_1() //空き缶をどかすプログラム1回目 { if(SENSOR_3==1){ Off(OUT_AC);Wait(60); turn_left;Wait(460); go_forward;Wait(80); senkai_left;Wait(500); OnRev(OUT_AC);Wait(80); senkai_right;Wait(110); go_forward;until(SENSOR_2 <= THRESHOLD); senkai_right;Wait(170);} } sub akikan_2() //空き缶をどかすプログラム2回目 { if(SENSOR_3==1){ Off(OUT_AC);Wait(60); senkai_left;Wait(120); go_forward;Wait(180); senkai_left;Wait(500); OnRev(OUT_AC);Wait(100); senkai_right;Wait(80); go_forward;until(SENSOR_2 <= THRESHOLD);} } sub line_race() //普通の黒線を走るプログラム { int nOnline=0; if(SENSOR_2 < THRESHOLD -2){ senkai_right; }else if(SENSOR_2 < THRESHOLD -1){ //黒い線上 turn_right; }else if(SENSOR_2 <= THRESHOLD){ //黒い線と白い線の間 go_forward; }else if(SENSOR_2 < THRESHOLD +2){ //白い線上 turn_left; }else{senkai_left;} Wait(STEP);nOnline=0; } sub before_cross_line() //境界線付近の黒線を走るプログラム { int nOnline=0; while (nOnline < SAIDAI){ if(SENSOR_2 < THRESHOLD -3){ counter3; senkai_right; nOnline++; }else{ if(SENSOR_2 < THRESHOLD -1){ turn_right; }else if(SENSOR_2 <= THRESHOLD){ go_forward; }else if(SENSOR_2 < THRESHOLD +2){ turn_left; }else{senkai_left;} nOnline=0; } Wait(STEP); } //while(<saidai)文終わり } task main() { SetSensor(SENSOR_3,SENSOR_TOUCH); SetSensor(SENSOR_2,SENSOR_LIGHT); int nCross=0; ClearTimer(0); while(nCross<6){ if(nCross==0){ while(FastTimer(0)<2350){ //2350ミリで第一交差点に到着する line_race(); akikan_1(); } //while(line_race)文終わり if(FastTimer(0)>=2350){ //第一交差点を渡る before_cross_line(); cross_line(30,0); } //if(cross_line)文終わり PlaySound(SOUND_DOWN); //声を出す ClearTimer(0); nCross++; } //nCross0終わり else if(nCross==1){ while(FastTimer(0)<830){ //第二交差点到着する line_race(); } //while(line_race)文終わり if(FastTimer(1)>=830){ //交差点を渡る before_cross_line(); cross_line(0,0); } //while(cross_line)文終わり PlaySound(SOUND_DOWN); ClearTimer(0); //タイマーをゼロになる nCross++; } //nCross1終わり else if(nCross==2){ while(FastTimer(0)<100){ //第三交差点 line_race(); } //while(line_race)文終わり if(FastTimer(0)>=100){ //交差点を渡す before_cross_line(); cross_line(0,0); } //while(cross_line)文終わり PlaySound(SOUND_DOWN); ClearTimer(0); //タイマーをゼロになる nCross++; } //nCross2終わり else if(nCross==3){ while(FastTimer(0)<1070){ //第四交差点」 line_race(); } //while(line_race)文終わり if(FastTimer(1)>=1070){ //交差点を渡す before_cross_line(); cross_line(0,60); } //if(cross_line)文終わり PlaySound(SOUND_DOWN); //声を出す ClearTimer(0); //タイマーをゼロになる nCross++; } //nCross3終わり else if(nCross==4){ while(FastTimer(0)<1650){ //出発点に到着 line_race(); akikan_2(); } //while(line_race)文終わり if(FastTimer(0)>=1650){ before_cross_line(); } //if(ゴール前)文終わり PlaySound(SOUND_UP); nCross++; } //nCross4終わり else{ GOOL; nCross++; } //ゴール } }