*マクロ [#sffee7f4]

定義は次のようにしました。(t:秒数)

    #define THRESHOLD 46
    #define go_forward ; OnRev(OUT_AC);//直進
    #define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);//右旋回
    #define turn_right0 OnFwd(OUT_A);Off(OUT_A);//右回り
    #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A);//右旋回(秒数あり)
    #define turn_left0 OnFwd(OUT_C);Off(OUT_C);//左回り
    #define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);//左旋回
    #define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_C);//左旋回(秒数あり)
    #define go(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//直進(秒数あり)
    #define back(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//後退(秒数あり)
    #define cross_stop Off(OUT_AC);Wait(100);//交差点判断後停止
    #define close SetPower(OUT_B,0);OnFwd(OUT_B);Wait(70);Off(OUT_B);//はさむ部分閉じ
    #define open SetPower(OUT_B,0);OnRev(OUT_B);Wait(70);Off(OUT_B);//はさむ部分開け
    #define STEP 1

*サブルーチン [#v402a498]

ライントレースするためのプログラムを作りました。

    sub Line()
    {
        ClearTimer(0);
        while(FastTimer(0)<20){
            if(SENSOR_2>THRESHOLD +6) {
                 turn_right1;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD +3) {
                 turn_right0;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD ) {
                 go_forward;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD -4) {
                 turn_left0;
                 ClearTimer(0); 
             } else {
                 turn_left1;
              }
        Wait(STEP);
         }
        Off(OUT_AC);
    }
sub LineFSPQ()
{
    ClearTimer(0);
    while(FastTimer(0)<17){
        if(SENSOR_2>THRESHOLD +6) {
             turn_right1;
             ClearTimer(0);
         } else if (SENSOR_2>THRESHOLD +3) {
             turn_right0;
             ClearTimer(0);
         } else if (SENSOR_2>THRESHOLD ) {
             go_forward;
             ClearTimer(0);
         } else if (SENSOR_2>THRESHOLD -4) {
             turn_left0;
             ClearTimer(0); 
         } else {
             turn_left1;
          }
    Wait(STEP);
     }
    Off(OUT_AC);
}
task main ()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   Line();
   cross_stop;
   go(20);
   turn_right(20);
   Line();
   turn_left(25);//CB
   go(13);
   Line();
   cross_stop;
   turn_left(25);
   go(30);//BP
   LineFSPQ();
   go(30);
   turn_right(50);//PQ
   Line();
   turn_left(10);//QR
   go(15);
   Line();
   cross_stop;
   turn_left(10);//RE
   Line();
   cross_stop;
   turn_left(18);
   go(8);
   Line();
   Line();
   Line();
   Line();
   turn_left(20);//EF
   go(10);
   LineFSPQ();
   cross_stop;
   go(30);
   turn_right(60);//FS
   go(50);
   close;
   back(40);
   turn_left(60);
   Line();
   cross_stop;
   go(30);//S_roll
   turn_right(20);
   LineFSPQ();
   cross_stop;
   turn_left(25);
   go(20);
   LineFSPQ();
   cross_stop;
   go(30);
   turn_right(105);
   go(23);
   open;
   back(25);
   turn_left(90);
   Line();
   Line();
   cross_stop;
   turn_left(50);
   go(10);
   Line();
   go(20);
}

またFSPQは交差点判断がうまくいかなかったのでLine()とは違うプログラムを作った。変更した点は、Timerを20から17に変えた。

    sub LineFSPQ()
    {
        ClearTimer(0);
        while(FastTimer(0)<17){
            if(SENSOR_2>THRESHOLD +6) {
                 turn_right1;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD +3) {
                 turn_right0;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD ) {
                 go_forward;
                 ClearTimer(0);
             } else if (SENSOR_2>THRESHOLD -4) {
                 turn_left0;
                 ClearTimer(0); 
             } else {
                 turn_left1;
              }
        Wait(STEP);
         }
        Off(OUT_AC);
    }

*プログラム [#ef6181f2]

工夫した点はLine()が4つあるところで、一度止まってもトレースするようにした。

    task main ()
    {
       SetSensor(SENSOR_2,SENSOR_LIGHT);
       Line();
       cross_stop;
       go(20);
       turn_right(20);
       Line();
       turn_left(25);//CB間
       go(13);
       Line();
       cross_stop;
       turn_left(25);
       go(30);//BP間
       LineFSPQ();
       go(30);
       turn_right(50);//PQ間
       Line();
       turn_left(10);//QR間
       go(15);
       Line();
       cross_stop;
       turn_left(10);//RE間
       Line();
       cross_stop;
       turn_left(18);
       go(8);
       Line();
       Line();
       Line();
       Line();
       turn_left(20);//EF間
       go(10);
       LineFSPQ();
       cross_stop;
       go(30);
       turn_right(60);//FS間
       go(50);
       close;
       back(40);
       turn_left(60);
       Line();
       cross_stop;
       go(30);//S回る
       turn_right(20);
       LineFSPQ();
       cross_stop;//QR間
       turn_left(25);
       go(20);
       LineFSPQ();
       cross_stop;//RP間
       go(30);
       turn_right(105);
       go(23);
       open;
       back(25);
       turn_left(90);
       Line();
       Line();
       cross_stop;
       turn_left(50);
       go(10);
       Line();
       go(20);//ゴール
    }

*感想 [#w94ff731]

今回の課題では本番失敗してしまった。つまずいたところは多々ある。

まず最初の交差点。ガガガという音を立て、その場で後退した。この現象は、プログラムのミスであるらしい。

2つ以上のプログラムが決行されていたらしい。いまだにどの点が悪かったのかわからない。ここは反省すべき点である。

次の課題ではもっとプログラミングをしっかりしたい。


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