[[2016a/Member]] 目次 *はじめに [#p359eff2] 今回の課題は、ロボットに光センサーを取り付け、紙に書いた線のうちの決められたコースをロボットが走れるようにする、というものだった。 ただライントレースをさせるだけでなく、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止することが課題となってくる。 僕はBコースを担当した。 *ロボット本体の説明 [#g5c2c820] *プログラムの説明 [#r352a901] 定義 #define THRESHOLD 53 #define SPEED_H 40 // 直線用のスピード #define SPEED_L 20 // カーブのスピード #define OnRL(speedR,speedL) \ OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); // 直進 #define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回 #define turn_left0 OnRL(SPEED_L,0); // 左折 #define turn_right0 OnRL(0,SPEED_L); // 右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回 #define STEP 1 // 1回の判断で動く時間 #define nMAX 260 // 通常のカーブとして許容できる繰り返しの最大値 (調整する) #define short_break Off(OUT_BC); Wait(1000); // 小休止 #define CROSS_TIME 400 // 交差点通過にかかる時間 /* 交差点を渡る */ #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; メイン task main() { SetSensorLight(S1); Long t0 = CurrentTick(); int nOnline=0; // 続けて黒になった回数 (カウンタ) while (CurrentTick()-t0 <= 1000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_right1; nOnline=0; //カウンタをリセット } while (CurrentTick()-t0 <= 20000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_left1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る nOnline=0; //カウンタをリセット while (CurrentTick()-t0 <= 55000) { while (nOnline < nMAX) { if (SENSOR_1 < THRESHOLD-15) { turn_right1; nOnline++; // カウンタを増やす } else { if (SENSOR_1 < THRESHOLD-10) { turn_right0; } else if (SENSOR_1 < THRESHOLD) { go_forward; } else if (SENSOR_1 < THRESHOLD+6) { turn_left0; } else { turn_left1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 PlaySound(SOUND_UP); turn_right1; nOnline=0; //カウンタをリセット } turn_left1; Wait(500); go_foward; Wait(1400) Off(OUT_BC); } *苦労した点 [#j0325639] *感想 [#x58ca83b]