[[2016a/Member]]

#contents
*はじめに [#he0260dc]
今回の課題は、決められたコースを線に沿って走るロボットを作ることだ。
これがコースの全体像だ。
#ref(2016a/Member/ta/Mission2/2016a-mission2.png,75%,コース全体)
私が選んだルートは
C地点からA地点へ
『C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点』
です。
*ロボットの説明 [#e4ebc16a]
今回のロボットは小回りがきくように左右のタイヤの幅をできるだけ小さくした。
#ref(2016a/Member/ta/Mission2/image1(2).JPG,120%,ロボット本体)
また、光センサーの位置をタイヤと近くし、センサーの左右への振り幅を小さくした。
#ref(2016a/Member/ta/Mission2/image3.JPG,120%,光センサーの位置)
*プログラムの説明 [#n1a2408b]
今回は『task main』をシンプルにするためにサブルーチンを用いた。

まずは細かい定義を
 #define THRESHOLD 45
 #define BLACK 42 // これ以下は黒
 #define WHITE 50 // これ以上は白
 #define Go OnFwd(OUT_AC);
 #define L Off(OUT_A); OnFwd(OUT_C);
 #define R OnFwd(OUT_A); Off(OUT_C);
 #define L_senkai OnFwd(OUT_A); OnRev(OUT_C);
 #define R_senkai OnFwd(OUT_C); OnRev(OUT_A);
 #define STEP 1
 #define NOTINTERSECTION FastTimer(0) <= 22 || FastTimer(1) <= 300

これが線の左側に沿ってライントレースするサブルーチンである。
 sub Trace()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
 
   while (true) {
     if (SENSOR_2 < THRESHOLD){
       L;
     } else {
       R;
     }
     Wait(STEP);
   }
 }

これが曲線を走るサブルーチンである。
 sub Curve()
 {
    SetSensor(SENSOR_2,  SENSOR_LIGHT);
  
    while(true) {
     if (SENSOR_2 < BLACK){
      R_senkai;
     }else if(SENSOR_2 > THRESHOLD){
       L_senkai;
       }else if (SENSOR_2 < THRESHOLD){
      L;
      }else{
       R;
     }
  Wait(STEP);
     }
 }

こせが交差点で停止するサブルーチンである。
 sub IntersectionFreeze()
 {
     SetSensor(SENSOR_2, SENSOR_LIGHT);
     ClearTimer(0);
     while (true) {
      while (FastTimer(0) <= 30) {
       if (SENSOR_2 < BLACK) {
         R;
        } else if (SENSOR_2 < WHITE) {
          Go;
          ClearTimer(0);
        } else {
           R;
           ClearTimer(0);
         }
        Wait(STEP);
         }
     Off(OUT_AC);
 }}

これが交差点を左折するサブルーチンである。
 sub IntersectionL()
 {
     ClearTimer(0);
 }

これが交差点を右折するサブルーチンである。
 sub IntersectionR()
 {
     ClearTimer(0);
     while(NOTINTERSECTION){
           if(FastTimer(1) >= 300){
                   ClearTimer(0);
                   ClearTimer(1);
                   break;
            }
           if(SENSOR_2 >= WHITE){
                     L;
           }else if(SENSOR_2 >= BLACK){
                     R;
            }
     }
     L;
     Wait(10);
     Off(OUT_AC);
     ClearTimer(0);
     ClearTimer(1);
 }

これが交差点を直進するサブルーチンである。
 sub IntersectionGo()
 {
     Go;
     Wait(20);
     Off(OUT_AC);
 }

そして、『task main』がこれだ。
 task main()
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
 
     ClearTimer(0);
 
     Trace();
 
     IntersectionL(); // Sを左折
 
     Trace();
 
     IntersectionL(); // Pを左折
 
     Trace();
 
     IntersectionGo(); // Qを直進
 
     Trace();
 
     IntersectionGo(); // Qを直進
 
     Trace();
 
     Curve(); // r=5のカーブ上を
 
     Trace();
 
     IntersectionR(); // Rを右折
 
     Trace();
 
     Curve();
 
     Trace();
 
     IntersectionL(); // Pを左折
 
     Trace();
 
     Curve();
 
     Trace();
 
     IntersectionFreeze();
 
     IntersectionGo();
 }
*まとめ [#b12030da]

ロボットを前回の似顔絵ロボットから大幅に形を変えたことによって小回りがきき、ライントレースに適した形にできてよかった。
ただ、プログラムを書くのに時間をかけすぎて、コース上を全て通しでスタートからゴールまで走らせることはできなかった。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS