今回のロボットは、シンプルな作りにして車体をコンパクトにした。
今回走るコースには、急カーブや直角に曲がる箇所があるため、小回りが効くように車体をコンパクトにした。コンパクトにしたことで、紙からはみださず曲がることができた。
光センサーも高さや幅の調節がしやすいよう、簡単な作りに仕上げた。
#define THRESHOLD 45 //閾値は45 #define migi OnFwd(OUT_A);Off(OUT_C); //右カーブ #define hidari OnFwd(OUT_C);Off(OUT_A); //左カーブ #define mae OnFwd(OUT_A+OUT_C); //前身 #define tomaru Off(OUT_A+OUT_C); //停止 #define migi2 OnFwd(OUT_A);OnRev(OUT_C); //右急カーブ #define hidari2 OnFwd(OUT_C);OnRev(OUT_A); //左急カーブ #define fal PlayTone(698,5) ; //ファ #define sol PlayTone(784,5) ; //ソ #define lal PlayTone(880,5) ; //ラ task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=300) //スタート時 { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) <= 1350) //急カーブ { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {mae;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari2;} } while(FastTimer(0) <= 1650) //ロータリー侵入 { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {hidari;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) <= 2100) //ロータリー内に留まる { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi2;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) <= 3000) ロータリー外へ { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {hidari;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari2;} } while(FastTimer(0) <= 3300) //点線をスルーし、直角カーブ〜ロータリー { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) <= 3600) //ロータリー内 { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {hidari;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) <= 4900) //ロータリー脱出〜十字路 { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {mae;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {hidari;} } while(FastTimer(0) > 4900) //ゴール!!停止 { if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {mae;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {tomaru;} if( (SENSOR_1 > THRESHOLD)&& (SENSOR_3 < THRESHOLD)) {migi;} if( (SENSOR_1 < THRESHOLD)&& (SENSOR_3 > THRESHOLD)) {tomaru; //ファンファーレ lal;Wait(15); lal;Wait(15); lal;Wait(15); lal;Wait(45); fal;Wait(45); sol;Wait(45); lal;Wait(30); sol;Wait(15); PlayTone(880,90) ;Wait(200);} } }
今回のプログラムは2個のセンサー(センサー1、センサー3)を使い、
(黒,黒)…直進、T字路で右折または左折
(黒,白)…左に微調整
(白,黒)…右に微調整
(白,白)…直進
の四つでコースを走らせた。(黒,黒)のみロータリーで特定の方向に曲がるようプログラムした。また、急カーブが曲がりきれないことがあったため、(黒,白)で今までより大きく左に調整するようにした。その他は変えていない。
#define THRESHOLD 40 //閾値を40に設定 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサー1を点ける SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサー3を点ける PlaySound(SOUND_DOWN); //効果音 //スタート〜ロータリーまで ClearTimer(0); while (FastTimer(0)<=1280) //約13秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) //両方ともライン の外のとき {OnFwd(OUT_A+OUT_C);} //直進 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //3のみライン上のとき {OnFwd(OUT_A); Off(OUT_C);} //右に微調整 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) //1のみライン上のとき {OnFwd(OUT_C);Off(OUT_A);} //左に微調整 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //交差点上のとき {OnFwd(OUT_A+OUT_C);} //直進 } //ロータリーを走る(1/4) ClearTimer(1); while (FastTimer(1)<=100) //1秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //ロータリーのT字上のとき {OnFwd(OUT_A); OnRev(OUT_C);} //右に向きを変える } //ロータリーを走る(2/4) ClearTimer(2); while (FastTimer(2)<=250) //2.5秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //ロータリーのT字上のとき {OnFwd(OUT_C); OnRev(OUT_A);} //左に向きを変える } //ロータリーを走る(2.5/4) ClearTimer(1); while (FastTimer(1)<=300) //3秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //ロータリーのT字上のとき {OnFwd(OUT_A); OnRev(OUT_C);} //右に向きを変える } //ロータリー〜点線まで ClearTimer(1); while (FastTimer(1)<=60) //0.6秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); OnRev(OUT_C);} } //実線から点線へ(ショートカット) OnFwd(OUT_A); OnRev(OUT_C); Wait(90); //90度右に回る Off(OUT_A+OUT_C); //点線上を走る ClearTimer(3); while (FastTimer(3)<=222) //約2秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A+OUT_C);} } //点線から実線へ(ショートカット終わり) OnFwd(OUT_A); OnRev(OUT_C); Wait(90); //90度右に回る Off(OUT_A+OUT_C); //点線(終点)〜ロータリーまで ClearTimer(1); while (FastTimer(1)<=380) //3.8秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A+OUT_C);} } //実線からロータリーへ OnFwd(OUT_A); OnRev(OUT_C); Wait(60); //60度右に回る Off(OUT_A+OUT_C); //ロータリーを走る(3/4) ClearTimer(1); while (FastTimer(1)<=280) //2.8秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //ロータリーのT字上のとき {OnFwd(OUT_C); OnRev(OUT_A);} //左に向きを変える } //ロータリーを走る(4/4) ClearTimer(1); while (FastTimer(1)<=310) //約3秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); Off(OUT_A);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //ロータリーのT字上のとき {OnFwd(OUT_A); OnRev(OUT_C);} //右に向きを変える } //ロータリー〜ゴールまで(急カーブ) ClearTimer(0); while (FastTimer(0)<=1040) //約10秒間while内を繰り返し { if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_A+OUT_C);} if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_A); Off(OUT_C);} if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)) {OnFwd(OUT_C); OnRev(OUT_A);} //急カーブのため左に大きく調整 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //交差点上のとき {OnFwd(OUT_A+OUT_C);} //直進 } //ゴール!! Off(OUT_A+OUT_C); PlaySound(SOUND_UP); }