今回の課題は下の図のB地点から出発し、P地点(右折)→Q地点(右折)→P地点(左折)→Q地点(左折)→Q地点(直進)→P地点(直進)→A地点と進むものである
説明書に掲載されていたものをそのまま使用している。 B,Cの端子に接続したモーターでタイヤを動かし(Bが右輪、Cが左輪)、3の端子に接続した光センサーを本体の前部に取り付け、センサーの示す値によってライン上か否かを判定している。
defineでの定義
変数
製作したプログラム
#define pow 25 #define ikiti_bb 30 #define ikiti_b 38 #define ikiti_w 52 #define ikiti_ww 60 #define tLim 350 #define migi_t OnRev(OUT_B,pow);OnFwd(OUT_C,pow); #define migi Off(OUT_B);OnFwd(OUT_C,pow); #define mae OnFwd(OUT_BC,pow); #define hidari OnFwd(OUT_B,pow);Off(OUT_C); #define hidari_t OnFwd(OUT_B,pow);OnRev(OUT_C,pow); task main() { SetSensorLight(S3); int X = 0; long tt = CurrentTick(); long t0 = CurrentTick(); while (true){ while ((CurrentTick() - t0 <= 16000)||(CurrentTick() - t0 >= 40000)&(CurrentTick() - t0 <= 70000)){ // プログラム起動〜16秒、40秒〜70秒 // ラインの左側をたどる処理 if (SENSOR_3 < ikiti_bb) { hidari_t; } else if (SENSOR_3 < ikiti_b) { hidari; } else if (SENSOR_3 < ikiti_w) { mae; tt = CurrentTick(); } else if (SENSOR_3 < ikiti_ww) { migi; tt = CurrentTick(); } else { migi_t; tt = CurrentTick(); } Wait(1); // 一定時間以上左に曲がるか旋回していれば交差点と認識 if (CurrentTick() - tt >= tLim) { if(X == 0) { // P地点を右折(右に旋回後、直進してラインから外れる) Off(OUT_BC); Wait(1000); tt = CurrentTick(); migi_t; Wait(500); OnFwd(OUT_BC,pow); Wait(500); X = X + 1; } else if(X == 1) { // Q地点を右折(直進してラインから外れ、右に旋回してラインに近づける) Off(OUT_BC); Wait(1000); tt = CurrentTick(); OnFwd(OUT_BC,pow); Wait(800); migi_t; Wait(500); X = X + 1; } else if(X == 3) { // Q地点を左折(1度ラインを外れてからさらにラインを跨ぐまで左に旋回) Off(OUT_BC); Wait(1000); hidari_t; until(SENSOR_3 > ikiti_w); until(SENSOR_3 < ikiti_b); until(SENSOR_3 > ikiti_w); tt = CurrentTick(); X = X + 1; } else { // P、Q地点を直進(直進して交差点を通過する) Off(OUT_BC); Wait(1000); tt = CurrentTick(); OnFwd(OUT_BC,pow); Wait(500); X = X + 1; } } } // ラインの左から右に移る処理 migi_t; until(SENSOR_3 < ikiti_b); Wait(200); while ((CurrentTick() - t0 >= 16000)&(CurrentTick() - t0 <= 35000)||(CurrentTick() - t0 >= 70000)){ // 16秒〜35秒、70秒〜(A地点到着まで) // ラインの右側をたどる処理 ただし交差点は認識しない if (SENSOR_3 < ikiti_bb) { migi_t; } else if (SENSOR_3 < ikiti_b) { migi; } else if (SENSOR_3 < ikiti_w) { mae; tt = CurrentTick(); } else if (SENSOR_3 < ikiti_ww) { hidari; tt = CurrentTick(); } else { hidari_t; tt = CurrentTick(); } Wait(1); } while ((CurrentTick() - t0 >= 35000)&(CurrentTick() - t0 <= 40000)){ // 35秒〜40秒 // ラインの右側をたどる処理 if (SENSOR_3 < ikiti_bb) { migi_t; } else if (SENSOR_3 < ikiti_b) { migi; } else if (SENSOR_3 < ikiti_w) { mae; tt = CurrentTick(); } else if (SENSOR_3 < ikiti_ww) { hidari; tt = CurrentTick(); } else { hidari_t; tt = CurrentTick(); } Wait(1); // 一定時間右に曲がるか旋回していれば交差点と認識 if (CurrentTick() - tt >= tLim) { // P地点を左折する処理(左に旋回後、直進してラインから外れる) Off(OUT_BC); Wait(1000); tt = CurrentTick(); hidari_t; Wait(500); OnFwd(OUT_BC,pow); Wait(500); X = X + 1; } } // ラインの右から左に移る処理 hidari_t; until(SENSOR_3 < ikiti_b); Wait(200); } }
凹凸や周りの人の影などの紙面の状況によって交差点を認識するタイミングが変わってしまい、そのせいで上手く曲がることができないことが多かった。
閾値の設定を変えたり曲がる処理の部分でモーターを動かす時間を変えたりといった方法はあったはずだが、製作時間が足りなくなってしまい十分な調整ができなかった。