[[2019a/Member]] *課題2について [#dacdc656] *プログラムについて [#g414466b] まずはプログラム中で何度も行う動きのプログラムを定義する。 int black_time=30; \\交差点の判断のときに使う、黒色と判断している時間の上限を設定するもの。 #define migisenkai OnFwd(OUT_A); OnFwd(OUT_C); /機体を右旋回させる動作。 #define usetsu OnFwd(OUT_A); Off(OUT_C); /機体を右折させる動作。 #define chokushin OnFwd(OUT_A); OnRev(OUT_C); /機体を直進させる動作。 #define sasetsu Off(OUT_A); OnRev(OUT_C); /機体を左折させる動作。 #define hidarisenkai OnRev(OUT_A); OnRev(OUT_C); /機体を左旋回させる動作。 #define koutai OnRev(OUT_A); OnFwd(OUT_C); /機体を後退させる動作。 次に主にライントレースのときに使うサブルーチンを設定する。 sub follow_line() /左側の線のふちをライントレースするサブルーチンである. { SetSensor(SENSOR_2,SENSOR_LIGHT); /センサーを設定する。 while(FastTimer(0)<black_time){ /while関数を使い、連続して黒と判定した時間がblacktime以下の場合カッコの中の動作を繰り返す。 if(SENSOR_2>=47){ /センサーが読み取る値が47以上の時右旋回をする. migisenkai ClearTimer(0); }else if((SENSOR_2>=43)&&(SENSOR_2<47)){ /センサーが読み取る値が43以上,47未満の時右折をする. usetsu ClearTimer(0); }else if((SENSOR_2>=39)&&(SENSOR_2<43)){ /センサーが読み取る値が39以上43未満の時,直進をする. chokushin ClearTimer(0); }else if((SENSOR_2>=36)&&(SENSOR_2<39)){ /センサーが読み取る値が36以上39未満の時,左折をする. sasetsu ClearTimer(0); }else if(SENSOR_2<36){ /センサーが読み取る値が36未満の時,左旋回をする. hidarisenkai } } Off(OUT_AC); Wait(100); /動作をスムーズにするために入れた. ClearTimer(0); } sub follow_line2() /右側の線のふちをライントレースするサブルーチンである.sub follow lineの黒と白,黒灰と白灰の動作を逆にしただけなのでせつめいは省略する. { SetSensor(SENSOR_2,SENSOR_LIGHT); while(FastTimer(0)<black_time){ if(SENSOR_2<36){ migisenkai }else if((SENSOR_2>=36)&&(SENSOR_2<39)){ usetsu ClearTimer(0); }else if((SENSOR_2>=39)&&(SENSOR_2<43)){ chokushin ClearTimer(0); }else if((SENSOR_2>=43)&&(SENSOR_2<47)){ sasetsu ClearTimer(0); }else if(SENSOR_2>=47){ hidarisenkai ClearTimer(0); } } Off(OUT_AC); Wait(100); ClearTimer(0); } sub cross_line() /交差点をまっすぐ進むためのサブルーチンである. { SetSensor(SENSOR_2,SENSOR_LIGHT); while(SENSOR_2<47){ /センサーが読み取る値が47未満の場合直進する. chokushin } while(SENSOR_2>36){ /センサーが読み取る値が36より大きい場合右折をする. usetsu } Off(OUT_AC); Wait(100); ClearTimer(0); } task main(){ SetPower(OUT_B,1); cross_line(); follow_line(); cross_line(); OnRev(OUT_C); Wait(60); Off(OUT_C); Wait(100); OnFwd(OUT_B); Wait(20);Off(OUT_B); Wait(100); koutai Wait(150); Off(OUT_AC); Wait(100); cross_line(); follow_line(); follow_line(); black_time=20;follow_line(); cross_line(); black_time=20;follow_line(); cross_line(); follow_line(); chokushin Wait(40); Off(OUT_AC); Wait(100); follow_line2(); follow_line2(); OnRev(OUT_B) Wait(20) Off(OUT_B); hidarisenkai Wait(30) Off(OUT_AC); }