目次
#contents

*はじめに [#r93b86ad]
今回ロボットに決められた道を走らせて、ピンポン球をキャッチ・シュートさせる課題に取り組んだ。
*課題 [#rcde0c55]
**ルール [#ada881be]
定められたコース上をライントレースし、道中でピンポン玉をキャッチしてゴールへシュートする。ただし、交差点では一秒間静止する。
**コース [#kc19d71d]
#refhttp://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2016b%2FMission2&src=2016b-mission2.png

Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート
*機体 [#f43abe0a]
より正確な動きをするために、できるだけコンパクトな機体を作成した。

しかしピンポン玉をキャッチ・シュートするためのモーターがモニターに近かったため、操作がしづらくなってしまった。

光センサーの位置が高かったので、正しい値がとれない場合がありラインから外れてしまうときがあった。

ピンポン玉の検知のために、超音波センサーを用いた。
*プログラム [#j751c4c6]
**定義 [#e3a1ddc5]
    #define GO OnFwdSync(OUT_BC.30.0);//直進
    #define LEFT OnFwd(OUT_B.45);OnRev(OUT_C.20);//左折
    #define RIGHT OnFwd(OUT_C.35);OnRev(OUT_B.5);//右折
    #define R_SENKAI OnFwd(OUT_C.50);OnRev(OUT_B.25);//右に旋回

    #define GO_CROSS OnFwdSync(OUT_BC,50,0);Wait(400);//交差点直進
    #define STOP_CROSS Off(OUT_BC);Wait(1000);OnRevSync(OUT_BC,50,100);Wait(600);Off
    (OUT_ABC);Wait(300);//交差点一時停止
    #define L_CROSS RotateMotorEx(OUT_BC,40,220,-100,true,true);//交差点左折
    #define R_CROSS OnFwdSync(OUT_BC,40,0);Wait(300);RotateMotorEx
    (OUT_BC,40,180,100,true,true);//交差点右折

    #define THRESHOLD_W 50//しきい値白
    #define THRESHOLD_C 45//しきい値中間
    #define THRESHOLD_B 40//しきい値黒
    
ピンポン玉をキャッチするための定義
    #define PINPON Off(OUT_BC);Wait(500);OnFwd(OUT_A,40);Wait(600);

**サブルーチン [#o70d339b]
サブルーチンはライントレースの他に、ピンポン玉をキャッチ・シュートするときにも用いる。
    sub LINE_TRACE(){
    long n=CurrentTick();                  
    while(CurrentTick()-n<600){           
        if(SENSOR_1>THRESHOLD_W){         
            R_SENKAI;
            n=CurrentTick();               
        } else if(SENSOR_1>THRESHOLD_C){   
            RIGHT;
            n=CurrentTick();               
        } else if(SENSOR_1>THRESHOLD_B){   
            GO;
            n=CurrentTick();               
        } else {                           
            LEFT;
         }
        if(x==0){                          
            if(SensorUS(S2)>17){
                PINPON;
                OnFwdSync(OUT_BC,30,-100);
                Wait(300);
                x=x+1;
                n=CurrentTick();
            }
        }
    }
    }
2回以上キャッチの動きをしないために変数xを用いた。
    int x; 
シュートのサブルーチン
    sub SHOOT()
    {
        OnRevSync(OUT_BC,40,0);   
        Wait(1000);
        Off(OUT_BC);    
        Wait(400);
        RotateMotor(OUT_A,70,-60);   
    }
**本文 [#fcf3e57b]
    task main()
    {
        SetSensorLight(S1);      
        SetSensorLowspeed(S2);   
        int m=0;                 //渡った交差点数の変数を定義
        while(true){             
        LINE_TRACE();
        STOP_CROSS;
        PlayTone(440,250);
        Wait(300);
        m = m +1;
        if(m>7){ 
            SHOOT();
        } else if(m==7){
            L_CROSS;
        } else if(m==5){
            R_CROSS;
        } else if(m==2){
            R_CROSS;
        } else {
            GO_CROSS;
        }
    }
   
*反省 [#m716be9c]
キャッチ・シュートの精度が良くなかったので、プログラム、機体の構造ともにもう少し改良できた。本番ではライントレースの失敗もあったので、次からは気を抜かずに細かい所まで改良を加えていこうと思った。

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