[[2019a/Member]]

目次
#contents



*課題について [#n09c5be2]
次のようなコースを作成し、ライントレースをします。

#ref(2019a-mission2.png)


進む順番

A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)

交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止します。





*ロボットの本体の説明 [#qee10873]









*プログラムの説明 [#nf96d142]

 #define zenshin OnFwd(OUT_BC,50); //前進
 #define koushin OnFwd(OUT_BC,-50); //後進
 #define migikaiten OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 
 #define hidarikaiten OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転
 #define mi OnFwd(OUT_C,40);Off(OUT_B);//右に進む
 #define hi OnFwd(OUT_B,40);Off(OUT_C); //左に進む
 #define smi OnFwd(OUT_C,30);Off(OUT_B);//s右に進む
 #define shi OnFwd(OUT_B,30);Off(OUT_C); //s左に進む
 #define tomaru Off(OUT_BC); //ストップ
 long A=0;//コーナーで止まる時間を計測する変数
 long B=0;//ライントレースしている時間を計測する変数
 
 void stop_corner(){
    SetSensorLight(S1);
    while(A<400){
        if(SENSOR_1<40){
            hi;
            A=A+1;
            B=B+1;
                       }else{
                                mi;
                                B=B+1;
                                A=0;
                                 }
                   }
    tomaru;
    Wait(1000);
    B=0;
                   }//コーナーで止まるライントレース(ラインの左側を進む)
 
 void cross_line(){
    SetSensorLight(S1);
 
        if(SENSOR_1<40){
            hi;
            B=B+1;
                       }else{
                                mi;
                                B=B+1;
                                 }
                           }//コーナーを直進するライントレース(ラインの左側を進む)
  
 void re_stop_corner(){
    SetSensorLight(S1);
    while(A<400){
        if(SENSOR_1>40){
            hi;
            A=0;         
            B=B+1;
                       }else{
                                mi;
                                A=A+1;
                                B=B+1;
                               
                                 }
                   }
    tomaru;
    Wait(1000);
    B=0;
                   }//コーナーで止まるライントレース(ラインの右側を進む)
 
 void re_cross_line(){
    SetSensorLight(S1);
 
        if(SENSOR_1>40){
            hi;
            B=B+1;
                       }else{
                                mi;
                                B=B+1;
                                 }
                           }//コーナーを直進するライントレース(ラインの右側を進む)
 
 void stop_ball(){
    SetSensorLight(S1);
    while(A<800){
        if(SENSOR_1<40){
            hi;
            A=0;
            B=B+1;
                       }else{
                                mi;
                                B=B+1;
                                A=A+1;
                                 }
                   }
    tomaru;
    Wait(1000);
    B=0;
                   }//コーナーで止まるライントレース(ラインの左側を進む)
 
 void stop_corner1(){
    SetSensorLight(S1);
    while(A<400){
        if(SENSOR_1<40){
            hi;
            A=A+1;
            B=B+1;
                       }else{
                                mi;
                                B=B+1;
                                A=0;
                                 }
                   }
    tomaru;
    Wait(1000);
    B=5000;
                   }//コーナーで止まるライントレース(ラインの左側を進む)
 
 task main()
 {
    while(B<4000){
        cross_line();
                    }
 
    while(B>=4000){
        stop_corner();
                     }//Dの交差点で一時停止する。
 
    mi;
    Wait(100);
    tomaru;
    Wait(200);//交差点で止まったとき、機体の向きを調整する動作
  
    while(B<5000){
        cross_line();
                    }
 
    while(B>=5000){
        stop_corner();
                     }
 
    migi;
    Wait(300);
    tomaru;
    Wait(100);
    zenshin;
    Wait(200);
    tomaru;
    Wait(100);//円の部分での、ライン上にのるための動作
  
    while(B<3000){
        cross_line();
                    }
 
    while(B>=3000){
        stop_corner();
                     }//円の終わり    
    zenshin;
    Wait(900);
    tomaru;
    Wait(100);//円の終わりでの機体の向きの調整

    while(B<4000){
        stop_corner1();
                    }
    B=0;

    hidari;
    Wait(200);
    tomaru;
    Wait(100);//ロボットの向きの調整
      
 while(B<2000){
        re_cross_line();
                    } 
   
    while(B>=2000){
        stop_ball();
                    } //ボールのところ 白が続くと止まるのを作る
    B=0;
    OnFwd(OUT_A,-50);//ボールを取る
    Wait(600);
    Off(OUT_A);
    Wait(100);
     
    hidari;
    Wait(1000);
    tomaru;
    Wait(100);
    zenshin;
    Wait(400);
    tomaru;
    Wait(100);//ボールをとった後、ライン上に復帰する動作
 
    while(B<10000){
        re_cross_line();//ラインの右側をトレースする。
                    }
    
    while(B>=10000){
        re_stop_corner();
                     }//ラインの右側をトレースし、ゴールの前で泊まる。
      
    OnFwd(OUT_A,50);
    Wait(600);//ボールを下ろす
    Off(OUT_A);
    Wait(100);
    zenshin;
    Wait(100);
    tomaru;
    Wait(100);//シュートする
 }

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