今回作ったロボットは、写真のような自作のコースの黒線に沿って走るロボットです。
こちらがロボットの全体像です。
こちらはドライブベースになります。 車輪は2つにしました。 前に少し出ている部分に光センサーを取り付けます。
#define THRESHOLD 42 #define MOVE_TIME1 1385 //1番目の交差点に到着する時間 #define MOVE_TIME2 905 //2番目の交差点に到着する時間 #define MOVE_TIME3 190 //3番目の交差点に到着する時間 #define MOVE_TIME4 973 //4番目の交差点に到着する時間 #define HIPOWER 7 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward 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 //1回の判断で動作させる時間 #define nMAX 250 //通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_AC);Wait(100); //小休止 #define CROSS_TIME 45 //交差点通過にかかる時間 /*交差点を渡る*/ #define cross_line set_power_L;OnFwd(OUT_AC);Wait(CROSS_TIME);short_break; task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; //続けて黒になった回数 ClearTimer(0); //0番目のタイマーをリセット /*1番目の交差点に到着するまで、通常のライントレースをする*/ while(FastTimer(0)<=MOVE_TIME1){ if(SENSOR_2<THRESHOLD-5){ turn_left1; }else if(SENSOR_2<THRESHOLD-3){ turn_left0; }else if(SENSOR_2<THRESHOLD+3){ go_forward; }else if(SENSOR_2<THRESHOLD+8){ turn_right0; }else{ turn_right1; } Wait(STEP); } short_break; //小休止 turn_right1;Wait(30); //進行方向修正 cross_line; //交差点を渡る nOnline=0; //カウンタをリセット ClearTimer(0); //0番目のタイマーをリセット /*2番目の交差点に到着するまで、通常のライントレースをする*/ while(FastTimer(0)<=MOVE_TIME2){ if(SENSOR_2<THRESHOLD-5){ turn_left1; }else if(SENSOR_2<THRESHOLD-3){ turn_left0; }else if(SENSOR_2<THRESHOLD+3){ go_forward; }else if(SENSOR_2<THRESHOLD+8){ turn_right0; }else{ turn_right1; } Wait(STEP); } short_break; turn_right1;Wait(30); cross_line; nOnline=0; ClearTimer(0); //0番目のタイマーをリセット /*3番目の交差点に到着するまで、通常のライントレースをする*/ while(FastTimer(0)<=MOVE_TIME3){ if(SENSOR_2<THRESHOLD-5){ turn_left1; }else if(SENSOR_2<THRESHOLD-3){ turn_left0; }else if(SENSOR_2<THRESHOLD+3){ go_forward; }else if(SENSOR_2<THRESHOLD+8){ turn_right0; }else{ turn_right1; } Wait(STEP); } short_break; turn_right1;Wait(30); cross_line; nOnline=0; ClearTimer(0); //0番目のタイマーをリセット /*4番目の交差点に到着するまで、通常のライントレースをする*/ while(FastTimer(0)<=MOVE_TIME4){ if(SENSOR_2<THRESHOLD-5){ turn_left1; }else if(SENSOR_2<THRESHOLD-3){ turn_left0; }else if(SENSOR_2<THRESHOLD+3){ go_forward; }else if(SENSOR_2<THRESHOLD+8){ turn_right0; }else{ turn_right1; } Wait(STEP); } short_break; turn_right1;Wait(30); cross_line; nOnline=0; /*ゴールまで、通常のライントレースをする*/ while(true){ while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-5){ turn_left1; }else if(SENSOR_2<THRESHOLD-3){ turn_left0; }else if(SENSOR_2<THRESHOLD+3){ go_forward; }else if(SENSOR_2<THRESHOLD+8){ turn_right0; }else{ turn_right1; } Wait(STEP); } } }
コースを一周させるのに苦労し、空き缶を動かすプログラムを作る時間がほとんどない状態になってしまいました。一周させるのに精一杯でした。