Welcome! *課題 [#n26bc92f] 所定のコースを一周する。但し、道中に置かれた缶は元あった場所に戻さなければならない。 私は時計回りを担当。缶は直角コーナーに配置。 *ロボットの説明 [#aaf182c5] ・小回りが利くように車幅を限界まで狭め、ライトセンサも極力車体に近づけた。 ・タッチセンサは鈍感なので、ライトセンサで缶の有無を判別するようにした。 *プログラム [#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_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 #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); #define U_turn2 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A);\ Wait(160); #define U_turn3 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A);\ Wait(80); #define go_back OnRev(OUT_AC); Wait(160); sub line_trace() // ライントレース用プログラム { if (SENSOR_1 < THERESHOLD -4) { turn_right1; } else { if (SENSOR_1 < THERESHOLD -2) { turn_right0; } else if (SENSOR_1 < THERESHOLD +2) { go_forward; } else if (SENSOR_1 < THERESHOLD +4) { turn_left0; } else { turn_left1; } } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(1); while (FastTimer(1) <= 1600) { line_trace(); Wait(STEP); } if (SENSOR_3 > 45) { PlaySound(SOUND_CLICK); go_forward1; U_turn1; go_forward2; U_turn2; go_back; U_turn3; } } ClearTimer(0); ClearTimer(1); while (FastTimer(1) <= 3200) { while (FastTimer(0) < nMAX) { // 黒を続けてnMAX秒認識しない場合、 通常のライントレースを行う line_trace(); ClearTimer(0); } Wait(STEP); } turn_left1; Wait(nMAX); // 進行方向修正 cross_line; // 交差点通過 ClearTimer(0); // タイマーをリセット } ClearTimer(0); ClearTimer(1); while (true) { line_trace(); Wait(STEP); } } } } *反省 [#s7f7c576] 正確に線を辿ることが出来るに至ったものの、ターンの円滑さに欠けていたので、 よりスムースにカーブを曲がるようにプログラムを改良する必要があると思った。