目次
#contents
* 課題2 [#nd86a976]
#ref(./2016b-mission2.png,75%,コース)
図のようなコースを作り、次の経路を黒い線に沿って進むロボットを作る。
Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート
* ロボットの説明 [#f1c42aa3]
#ref(./_20161222_163051.JPG,75%,全体図)
#ref(./_20161222_170651.JPG,75%,アーム)
#ref(./_20161222_170750.JPG,75%,駆動部)
* プログラム [#d16edb76]
 #define power 30  //モーターのパワー
 #define nMax 1500  //この数値よりも黒と判断される回数が大きいと交差点と判断する
 #define LET_TIME 850  //交差点を直進するときにロボットを引き戻す際に使う時間
 #define CATCH_TIME 500  //ボールを取るためにアームを動かす時間
 #define SHOOT_TIME 500  //シュートするときにロボットを動作させる時間
 #define go_foward OnFwd(OUT_AC,power);  //前進
 #define go_back OnRev(OUT_AC,power);  //後退
 #define turn_right OnFwd(OUT_A,power);  //右折
 #define turn_left OnFwd(OUT_C,power);  //左折
 #define circle_right OnFwd(OUT_A,power); OnRev(OUT_C,power);  //方向転換(右)
 #define circle_left OnFwd(OUT_C,power); OnRev(OUT_A,power);  //方向転換(左)
 #define CROSS_LINE_TIME 800  //交差点を直進するときに動作させる時間
 #define CROSS_TURN_RIGHT_TIME 2750  //右に90度旋回させるために動作させる時間
 #define cross_line circle_left; Wait(LET_TIME); go_foward; Wait(CROSS_LINE_TIME);Off(OUT_AC);   //交差点を直進
 #define cross_turn_right circle_right Wait(CROSS_TURN_RIGHT_TIME-nMax);Off(OUT_AC);  //交差点を右折
 #define white 60  //白
 #define pale_gray 50  //白よりの灰
 #define deep_gray 40  //黒よりの灰
 #define black 34  //黒
 #define ball_catch OnFwd(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); //ボールを取る
 #define ball_shoot circle_left; Wait(nMax); OnRev(OUT_B,power); Wait(CATCH_TIME); Off(OUT_B); go_back; Wait(SHOOT_TIME); go_foward; Wait(SHOOT_TIME+300); //ボールをシュートする
 sub line_trace()  //ボールを取るまでの間、ライントレースする
 {
     if (SENSOR_1 > white){
         circle_left;
      }
     else if (SENSOR_1 > pale_gray){
         turn_left;
      }
     else if (SENSOR_1 > deep_gray){
         go_foward;
      }
     else if (SENSOR_1 > black){
         turn_right;
      }
     else{
         circle_right;
      }
 }
 
 task main()
 {
     SetSensorLight(S1);
     SetSensorLowspeed(S2);
     int nOnline=0; //黒い線の上にいた回数  
     int n=0;   //交差点に着いた回数
  
     while(1){
        while(1){
           n++;
           nOnline=0;
           while(nOnline < nMax){
             if (SENSOR_1 > white){
                circle_left;
                nOnline=0;
               }
             else if (SENSOR_1 > pale_gray){
                 turn_left;
                 nOnline=0;
               }
             else if (SENSOR_1 > deep_gray){
                 go_foward;
                 nOnline=0;
               }
             else if (SENSOR_1 > black){
                 turn_right;
                 nOnline=0;
               }
             else{
                  circle_right;
                  nOnline++;
               }
             }
 //交差点に差し掛かるまでの間ライントレースする
          Off(OUT_AC);
          Wait(1000);
 
          if(n==1){
            PlaySound(SOUND_FAST_UP);
            cross_line;
            break;
          }
 //最初の交差点を横断する
          else if(n==2){
           PlaySound(SOUND_FAST_UP);
           cross_turn_right;
           break;
          }
 //二回目のの交差点を右折する
          else if(n==3){
           PlaySound(SOUND_FAST_UP);
           cross_line;
           while(SensorUS(S2) > 10){
           line_trace();
           }
           ball_catch;
           break;
          }
 //三回目の交差点を横断して、ボールを認識したところでキャッチする
          else if(n==4){
            PlaySound(SOUND_FAST_UP);
            cross_line;
            break;
          }
 //四回目の交差点を横断する
          else if(n==5){
            PlaySound(SOUND_FAST_UP);
        cross_turn_right;
            go_foward;
            Wait(1000);
            break;
          }
 //ヘアピンカーブの入り口を交差点と判断して曲がる
         else if(n==6){
            PlaySound(SOUND_FAST_UP);
            cross_turn_right;
            go_foward;
            Wait(500);
            Off(OUT_AC);
            break;
          }
 //ヘアピンカーブの出口付近を交差点と判断して曲がる
         else if(n==7){
            PlaySound(SOUND_FAST_UP);
            cross_turn_right;
            break;
          }
 //五回目の交差点を右折する
     else if(n==8){
            PlaySound(SOUND_FAST_UP);
            cross_line;
            break;
          }
 //六回目の交差点を直進する
          else if(n==9){
            PlaySound(SOUND_FAST_UP);
            cross_turn_right;
            break;
          }
 //七回目の交差点を右折する
          else{
            PlaySound(SOUND_FAST_UP);
            cross_line;
            ball_shoot;
          }
 //ゴールにボールをシュートする
         }
     }
 }
* まとめ [#j096b03d]


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