*課題 [#n26bc92f] 所定のコースを一周する。但し、道中に置かれた缶は元あった場所に戻さなければならない。 私は時計回りを担当。缶は直角コーナーに配置。 *ロボットの説明 [#aaf182c5] &ref(AAA.jpg); ・小回りが利くように車幅を限界まで狭め、ライトセンサも極力車体に近づけた。 ・タッチセンサは鈍感なので、ライトセンサで缶の有無を判別するようにした。 *プログラム [#c8a26b8b] #define THERESHOLD 47 // 閾値 #define HIGHESTPOWER 7 // 缶移動用パワー #define HIPOWER 2 // 直進用パワー #define LOWPOWER 0 // ターン用パワー #define set_power_HE SetPower(OUT_AC,HIGHESTPOWER); #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_A); OnRev(OUT_C); // 左旋回 #define turn_left0 set_power_L; OnFwd(OUT_A); Off(OUT_C); // 左折 #define turn_right0 set_power_L; OnFwd(OUT_C); Off(OUT_A); // 右折 #define turn_right1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); // 右旋回 #define STEP 1 #define nMAX 35 // 通常のカーブとみなす時間の最大値 #define short_break Off(OUT_AC); Wait(100); // 小休止 #define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過 #define go_forward1 OnFwd(OUT_AC); Wait(120); #define go_forward2 OnFwd(OUT_AC); Wait(160); #define U_turn1 set_power_HE; OnRev(OUT_A);OnFwd(OUT_C); Wait(80); // 右旋回(1/4回転) #define U_turn2 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A); Wait(160); // 左旋回(1/2回転) #define U_turn3 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A); Wait(80); // 左旋回(1/4回転) #define go_back OnRev(OUT_AC); Wait(160); sub line_trace() // ライントレース用プログラム { if (SENSOR_1 < THERESHOLD -4) { turn_left1; } else { if (SENSOR_1 < THERESHOLD -2) { turn_left0; } else if (SENSOR_1 < THERESHOLD +2) { go_forward; } else if (SENSOR_1 < THERESHOLD +4) { turn_right0; } else { turn_right1; } } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(1); while (FastTimer(1) <= 1600) { // 16秒以内に缶の位置を通過 line_trace(); Wait(STEP); if (SENSOR_3 > 45) { // 缶を発見 PlaySound(SOUND_CLICK); // 確認音 go_forward1; // 直角コーナー上まで進む U_turn1; // 缶を持ったまま右に1/4回転 go_forward2; // 次の1/2回転で缶が元の場所に戻るように少し直進 U_turn2; // 缶を持ったまま1/2回転 go_back; // 缶を置いて少し後退 U_turn3; // 次のカーブに入れるように1/2回転して向きを調整 } } ClearTimer(0); ClearTimer(1); 交差点の判別には、黒を連続で認識する時間の上限を設定し、それを超えたらロボットの向きを直し、そのまま直進させる方法を用いる。 while (FastTimer(1) <= 3200) { // 直角コーナーを通過してから、最後の交差点を通過するまでに約32秒かかる。 while (FastTimer(0) < nMAX) { // 黒を続けてnMAX秒認識しない場合、通常のライントレースを行う。 line_trace(); ClearTimer(0); } turn_right1; Wait(nMAX); // 進行方向修正 cross_line; // 交差点通過 ClearTimer(0); // タイマーをリセット } ClearTimer(0); ClearTimer(1); 全ての交差点を通過し終えたら、最後のT字路を曲がる為に交差点を判別させなくする。 while (true) { line_trace(); } } *反省点 [#ma9b01b9] ライントレースのプログラムはどの部分でもうまく進めるように組めたが、全体的にスピードは遅いので、 要所要所時間を測ってそれぞれに合ったプログラムを組めたら良かったと思った。