[[2017a/Member]] 目次 #contents *課題2 [#ycd6950f] ・下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 #ref(2017a/Member/sassa/Mission2/2017a-mission2.png,100%); **コース [#wab138fb] 私は今回左回りのプログラムを作った。 ・Aスタート ・E直進 ・F(SOUND_UP) ・Q一時停止(SOUND_DOWN)&左 ・R直進(SOUND_UP) ・S左折(SOUND_UP) ・G(SOUND_UP) ・H(SOUND_UP) ・T一時停止(SOUND_DOWN)&直進 ・T一時停止(SOUND_DOWN)&直進 ・R一時停止(SOUND_DOWN)&左折 ・S直進(SOUND_UP) ・P左折(SOUND_UP) ・E一時停止(SOUND_DOWN)&左折 ・A停止(SOUND_DOWN) *ロボットについて [#ke50a3da] 私たちは基本構造は変えずに少しセンサーの位置をロボットに近づけた。 はじめはタイヤの間に光センサーを取り付けていたが、ロボットの陰で光センサーが黒と判断してしまったため写真のような位置にセンサーを取り付けた。 光センサーの後ろにある2本の棒は光センサーがずれないように支えるものである。 #ref(2017a/Member/sassa/Mission2/line_trace1.jpg,100%); #ref(2017a/Member/sassa/Mission2/line_trace2.jpg,100%); *プログラムについて [#u24efef5] **概要 [#ned5ff3d] ・私は黒線の左側をトレースするようにプログラミングしたため、光センサーが黒と判断した場合は 左に、白と判断した場合は右にそれぞれ曲がり、中間は直進するようにした。 ・交差点では黒が続いたときのみタイマーをリセットせず、ある一定の時間を超えたときに止まるタイマー方式をとった。 ・F,G,E地点の直角カーブとQ,R,S,P地点のカーブとでは黒が続く時間が異なるためサブルーチンを2つ作った。 **プログラム [#bcf86738] ***定義 [#a56a71c2] #define THRESHOLD 53 //しきい値を53に設定 #define speed_F 20//前進するときの速さ #define speed_T 30//回転するときの速さ #define turn_left OnRev(OUT_C,speed_T);OnFwd(OUT_B,speed_T);//左回転 #define turn_right OnRev(OUT_B,speed_T);OnFwd(OUT_C,speed_T);//右回転 #define go_Fwd OnFwd(OUT_BC,speed_F);//前進 #define STEP 1//一回の動作の時間 ***サブルーチン [#tfb353d1] sub line_trace1() //直角カーブ用 { SetSensorLight(S1); long t0 = CurrentTick(); while (CurrentTick()-t0 < 150) { //黒が0.15秒以上続いたとき停止する if (SENSOR_1 < THRESHOLD -12) { //黒に反応 turn_left; } else if (SENSOR_1 > THRESHOLD +5) { //白に反応 turn_right; t0 = CurrentTick() //タイマーリセット } else { //中間 go_Fwd; t0 = CurrentTick() } Wait(STEP); } } sub line_trace2()//緩やかなカーブ用 { SetSensorLight(S1); long t0 = CurrentTick(); while (CurrentTick()-t0 < 100) { //黒が0.1秒以上続くと停止する if (SENSOR_1 < THRESHOLD -12) { turn_left; } else if (SENSOR_1 > THRESHOLD +5) { turn_right; t0 = CurrentTick() } else { go_Fwd; t0 = CurrentTick() } Wait(STEP); } } ***タスクメイン [#h47984b7] task main() { AからFまでのプログラム go_Fwd; Wait(500); line_trace1(); PlaySound(SOUND_UP); go_Fwd; Wait(500); Off(OUT_BC); FからQまでのプログラム line_trace1(); Off(OUT_BC); PlaySound(SOUND_DOWN); go_Fwd; Wait(200); Off(OUT_BC); turn_left; Wait(650); Off(OUT_BC); go_Fwd; Wait(200); QからRまでのプログラム line_trace2(); Off(OUT_BC); PlaySound(SOUND_UP); go_Fwd; Wait(600); RからSまでのプログラム line_trace2(); Off(OUT_BC); PlaySound(SOUND_UP); SからGまでのプログラム line_trace1(); PlaySound(SOUND_UP); Off(OUT_BC); go_Fwd; Wait(300); Off(OUT_BC); turn_left; Wait(100); GからHまでのプログラム line_trace1(); turn_left; Wait(1000); line_trace1(); PlaySound(SOUND_UP); go_Fwd; Wait(500); HからTまでのプログラム line_trace1(); Off(OUT_BC); PlaySound(SOUND_DOWN); go_Fwd; Wait(200); TからTまでのプログラム line_trace1(); Off(OUT_BC); PlaySound(SOUND_DOWN); go_Fwd; Wait(500); TからRまでのプログラム line_trace2(); Off(OUT_BC); PlaySound(SOUND_DOWN); go_Fwd; Wait(200); Off(OUT_BC); turn_left; Wait(600); Off(OUT_BC); go_Fwd; Wait(200); RからSまでのプログラム line_trace2(); Off(OUT_BC); PlaySound(SOUND_UP); go_Fwd; Wait(600); SからPまでのプログラム line_trace2(); PlaySound(SOUND_UP); PからEまでのプログラム line_trace1(); PlaySound(SOUND_UP); go_Fwd; Wait(300); Off(OUT_BC); EからAまでのプログラム line_trace1(); Off(OUT_BC); PlaySound(SOUND_DOWN); go_Fwd; Wait(500); Off(OUT_BC); } *感想 [#ieaecaa5] 今回のプログラミングで苦労したのはR地点の通過とG地点からH地点までのS字カーブだった。 特にS字カーブでは曲がり切る前にセンサーが黒線を超えて白に反応してしまい、うまくいかなかったため、そこを修正することにかなりの時間を要した。 しかしプログラム通りにロボットが動いたので時間をかけてよかった。 また今回はあまり速度を出せなかったがもう少し速度を出すにはどうすればいいか考えてみようと思う。