[[2019a/Member]]目次
#contents
*課題2 [#ee8817df]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(./2019a-mission2.png,90%,ラインコース)
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)

*ロボットの説明 [#defc7733]
**ロボット本体への工夫 [#va9a5665]
**センター部分への工夫 [#obf992dd]
**ロボット本体 [#va9a5665]
#ref(./tukamu.jpg,30%,全体)

**光センサー [#obf992dd]
#ref(./mae.jpg,40%,ラインコース)

*プログラムについて [#s7843b79]
**マクロプログラム [#a74845ee]
  #define RUN_TIME1 30
  #define RUN_TIME_JIH 170            
  #define RUN_TIME_HGF 380
  #define RUN_TIME_FE 180
  #define RUN_TIME_DB 1000
  #define turn_right OnFwd(OUT_A);OnRev(OUT_C);
  #define turn_left90 OnRev(OUT_A);OnFwd(OUT_C);Wait(100);
  #define turn_left OnRev(OUT_A);OnFwd(OUT_C);Wait(30);
  #define go_straight OnFwd(OUT_AC);
  #define turn180 OnRev(OUT_A);OnFwd(OUT_C);Wait(130);
  #define go_back OnRev(OUT_AC);
**サブルーチンプログラム [#h8048afa]
***交差点で止まるまで動き続けるプログラム [#gab04cab]
  sub line_trace1()    //交差点で止まるまで動き続けるプログラム
    { SetSensor(SENSOR_2,SENSOR_LIGHT);
  
    ClearTimer(0);
    while ( FastTimer(0) <= RUN_TIME1 ) {
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);ClearTimer(0);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら右へ旋回
         }
     }
    Off(OUT_AC);Wait(100);
  }
***JからI、IからHまでのライントレース一定時間内でライントレースし続ける [#r844b152]
  sub line_trace_JIH()
    { SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
        while ( FastTimer(0) <= RUN_TIME_JIH ) {
            if ( 48 < SENSOR_2 ){
                OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
            } else if (45 <SENSOR_2 < 49) {
                Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
            } else {
                OnRev(OUT_A);OnFwd(OUT_C);    //黒なら右へ旋回
             }
        }
    turn_right;Wait(22);OnFwd(OUT_AC);Wait(15);
   }

***HからFまで一定時間内ライントレースし続ける [#ad14dcb9]
  sub line_trace_HGF()
    { SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while ( FastTimer(0) <= RUN_TIME_HGF ) {
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら右へ旋回
         }
     }
  }

***FからEまで一定時間内ライントレースし続ける [#sd63a8eb]
  sub line_trace_FE()
    { SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while ( FastTimer(0) <= RUN_TIME_FE ) {
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら右へ旋回
         }
     }
  }

***DからBまでのライントレース一定時間内ライントレースし続ける [#o92004ea]
  sub line_trace_DB()
    { SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while ( FastTimer(0) <= RUN_TIME_DB ) {
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら右へ旋回
         }
     }
  }
**メインプログラム [#x0a4eba2]
  task main(){
    line_trace1();    //kから出発
    line_trace_JIH();    //JからI
    line_trace_JIH();    //IからH
    line_trace_HGF();    //HからF
    turn_left90;    //Fで左90度旋回
    line_trace_FE();    //FからE
    turn_left;    //Eで左旋回(90度以下)
    line_trace1();    //EからDまでのライントレース後、一時停止
    turn_right;Wait(25);    //Dで左へ傾いた分、右に曲がって位置調整
    line_trace_DB();    //DからB
    turn180;    //180度旋回
    OnRev(OUT_B);    //アーム展開
    power(0);
    Wait(25);
    Off(OUT_B);   
    go_straight;    //ボールから離れる
    Wait(100);
    OnFwd(OUT_B);    //アームを閉じる
    power(0);
    Wait(25);
    go_back;    //後ろに下がって位置調整
    Wait(55);
    OnFwd(OUT_B);   
    Wait(10);    //ボールをアームで弾いてAにシュート
}
*まとめ [#m9f10804]


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