[[2017a/Member]]

目次
#contents
*課題について [#c3a9ed2f]
詳しくは課題([[2017a/Mission2]])を参照。私はE地点右折コースでこの課題に取り組んだ。
*ロボット本体 [#p69d1362]
ロボット本体よりもセンサーを前方に取り付けることによりロボット本体の影によるセンサーで読み取る値のブレを軽減した。
*プログラム [#q9a9ed6a]
まず、今回のプログラムの中で使う頻度の高そうなものを先に定義した。
 #define THRESHOLD 53 //しきい値を53に設定
 #define SPEED 20 //速さは20%
 #define turn_left OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); //左旋回
 #define turn_right OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //右旋回
 #define go_forward OnFwd(OUT_BC,SPEED) //直進
 #define STEP 1 ////一回の判定で進む時間
 #define cross_line go_forward;Wait(450); //交差点を直進

まず初めに線の右側をライントレースするプログラムを作成した。タイマーを使って、センサーが一定の時間以上“黒”に反応すると停止するプログラムである。
 sub line_trace1()
 {
  SetSensorLight(S1);
  long t0 = CurrentTick();
  while (CurrentTick()-t0 < 200) {
    if (SENSOR_1 < THRESHOLD -12) {
      turn_right;
    } else if (SENSOR_1 > THRESHOLD +5) {
      turn_left;
      t0 = CurrentTick()
    } else {
      go_forward;
      t0 = CurrentTick()
     }
    Wait(STEP);
  }
 }

次に線の左側をライントレースするプログラムを作成した。タイマーを使って、センサーが一定の時間以上“白”に反応すると停止するプログラムである。line_trace1ではCurrentTick()-t0 < 200となっていたが左側をトレースする際には200の値を150にするほうが上手くいったので少しline_trace1とは違う
 sub line_trace2()
 {
  SetSensorLight(S1);
  long t0 = CurrentTick();
  while (CurrentTick()-t0 < 150) {
    if (SENSOR_1 < THRESHOLD -12) {
      turn_left;
    } else if (SENSOR_1 > THRESHOLD +5) {
      turn_right;
      t0 = CurrentTick()
    } else {
      go_forward;
      t0 = CurrentTick()
     }
    Wait(STEP);
  }
 }

このline_trace3は基本的にはline_trace1と同じではあるが、点FにおいてCurrentTick()-t0 < 200では反応を示さなかったため200の値を100に下げ、QF間専用のライントレースのサブルーチンを作った。

 sub line_trace3()
 {
  SetSensorLight(S1);
  long t0 = CurrentTick();
  while (CurrentTick()-t0 < 100) {
    if (SENSOR_1 < THRESHOLD -12) {
      turn_right;
    } else if (SENSOR_1 > THRESHOLD +5) {
      turn_left;
      t0 = CurrentTick()
    } else {
      go_forward;
      t0 = CurrentTick()
     }
    Wait(STEP);
  }
 }

line_trace4も基本的にはline_trace2と同じであるが、これが作られた理由はline_trace3が作られた理由と同じである。なおこのサブルーチンはQR間とPR2間専用のサブルーチンである。(このコースでは2回PRを通ることになるため二回目のPRをPR2とする)

 sub line_trace4()
 {
  SetSensorLight(S1);
  long t0 = CurrentTick();
  while (CurrentTick()-t0 < 100) {
    if (SENSOR_1 < THRESHOLD -12) {
      turn_left;
    } else if (SENSOR_1 > THRESHOLD +5) {
      turn_right;
      t0 = CurrentTick()
    } else {
      go_forward;
      t0 = CurrentTick()
     }
    Wait(STEP);
  }
 }

ここからはコースを13分割して細かくプログラミングしていくことで最後のtask mainをすっきりさせた。

 sub AE()
 {
    line_trace1();
    PlaySound(SOUND_UP); 
    turn_right;
    Wait(300);
    Off(OUT_BC);    
 }
    
 sub EP()
 {
    line_trace1(); 
    Off(OUT_BC);
    PlaySound(SOUND_DOWN);
    Wait(200);
    go_forward;
    Wait(100);
    turn_left;
    Wait(900);
    Off(OUT_BC);
 }

 sub PQ()
 {
    line_trace2();
    cross_line;
    Off(OUT_BC);
 }

 sub QR()
 {
    PlaySound(SOUND_UP);
    line_trace4();
    PlaySound(SOUND_UP);
 }

 sub RT()
 {
    turn_left;
    Wait(200);
    line_trace2();
    Off(OUT_BC);
    PlaySound(SOUND_DOWN);
    Wait(200);
    Off(OUT_BC);
    turn_right;
    Wait(500);
    cross_line;
    Off(OUT_BC);
 }

 sub TT()
 {
    line_trace1();
    Off(OUT_BC);
    PlaySound(SOUND_DOWN);
    Wait(200);
    Off(OUT_BC);
    cross_line;
    Off(OUT_BC);
 }

 sub TH()
 {
    line_trace1();
    PlaySound(SOUND_UP);
 }

 sub HG()
 {
    line_trace1();
    turn_right;
    Wait(1500);
    line_trace1();
    PlaySound(SOUND_UP);
    turn_right;
    Wait(300);
 }

 sub GS()
 {
    line_trace1();
    PlaySound(SOUND_DOWN);
    Wait(200);
    turn_left;
    Wait(1500);
    cross_line;
    Off(OUT_BC);
 }

 sub SP()
 {
    line_trace2();
    cross_line;
    Off(OUT_BC);
 }

 sub PQ2()
 {
    PlaySound(SOUND_UP);
    line_trace4();
    cross_line;
    Off(OUT_BC);
 }
    
 sub QF()
 {    
    PlaySound(SOUND_UP);
    line_trace3();
    PlaySound(SOUND_UP);
 }

 sub FA()
 {    
    line_trace1();    
    PlaySound(SOUND_DOWN);
 }


 task main()
 {
     AE();
     EP();
     PQ();
     QR();
     RT();
     TT();
     TH();
     HG();
     GS();
     SP();
     PQ2();
     QF();
     FA();
 }

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS