*目次 [#uc7ba6f6]
1.課題について~
2.ロボットについて~
3.プログラミングについて~
4.感想

*課題について [#p919c14b]
*1.課題について [#p919c14b]
○今回の課題

・下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。

○コース
#ref(2019a/Member/ryotaro/Mission2/Screenshot_20190719-131723.png,50%,Screenshot_20190719-131723.png)

○ミッション

・A地点を出発し、次の経路を黒い線にそって動くロボットを作成する。~
 
 A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)

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

*ロボットについて [#k42ba4cc]
*2.ロボットについて [#k42ba4cc]

今回作ったロボット~
#ref(2019a/Member/ryotaro/Mission2/DSC_0129.JPG,50%,DSC_0129.JPG)

土台は三輪構造にし、スタート地点である20cm×19.4cmの四角形にロボット全体が収まる必要があったので、できるだけ部品を少なくかつシンプルなものにした。また。光センサーも正確に色を測定するために、地面に近づけるぎりぎりまで下げて設置した。
#ref(2019a/Member/ryotaro/Mission2/DSC_0132.JPG,50%,DSC_0132.JPG)

また、ボールを保持するアームはかご型にした。はさむような型も考えたが、こちらの方がより確実にボールを確保できると思い、この形にした。
#ref(2019a/Member/ryotaro/Mission2/DSC_0130.JPG,50%,DSC_0130.JPG)

*プログラミングについて [#b5b7d609]
*3.プログラミングについて [#b5b7d609]

#define BLACK 30                       //色の定義(黒 
#define B_GLAY 38                             黒と灰色の中間
#define GLAY 45                                                     灰色(しきい値)
#define W_GLAY 53                             白と灰色の中間
#define WHITE 63                               白)
#define r_right OnFwd(OUT_C,50);Off(OUT_B);                   //右旋回
#define t_right OnFwd(OUT_C,75);OnFwd(OUT_B,10);              //右折
#define go OnFwd(OUT_BC,40);                                  //直進
#define t_left OnFwd(OUT_B,75);OnFwd(OUT_C,10);               //左折
#define r_left OnFwd(OUT_B,20);Off(OUT_C);                    //左旋回
#define MOVE_TIME 500
#define up OnRev(OUT_A,50);Wait(500);b                        //アームを上げる
#define down OnFwd(OUT_A,50);Wait(500);                 下げる
#define u_turn OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(1000);    //Uターン
#define short_break Off(OUT_BC);Wait(100);                    //一時停止
sub follow_line()                      //交差点を認識するまで黒線に沿って進むプログラム
{
    SetSensorLight(S3);

    long t0 = CurrentTick();
    
    while(CurrentTick()-t0 <= MOVE_TIME){
        if (SENSOR_1 < BLACK){      //黒の時だけタイマーをリセットしない→交差点を判別する
            r_left;
        } else if (SENSOR_3 < B_GLAY){ t0=CurrentTick();
            t_left;
        } else if (SENSOR_3 < GLAY){ t0=CurrentTick();
            go;
        } else if (SENSOR_3 < W_GLAY){ t0=CurrentTick();
            t_right;
        } else if (SENSOR_3 > WHITE){ t0=CurrentTick();
            r_right;
        } else {go;}
     }
    Off(OUT_BC);            //黒の時間がMOVE TIMEを超えて交差点とわかれば止まる
}
sub cross_line(){           //交差点を渡るプログラム
    SetSensorLight(S3);

    go;               //白を認識するまで進む
    until (SENSOR_3 > WHITE);    →follow_line()を後に続けることで交差点を渡る
}

task main()
{
    follow_line();
    short_break;                     //Kで一時停止
    OnRev(OUT_B,50);Off(OUT_C);      //車体を黒線と平行に戻す
    Wait(100);
    go;
    Wait(2000);
    down;                            //
    down;                            //アームを下げてボールを確保
    u_turn;
    follow_line();                   //
    follow_line();                   
    cross_line();
    follow_line();          //K地点の交差点通過
    short_break;                     //J地点の交差点で一時停止
    cross_line();                    //交差点を通過
    follow_line();
    short_break;
    cross_line();
    cross_line();                    //I地点の交差点を通過
    follow_line();
    cross_line();
    cross_line();                    //H地点の交差点を通過
    follow_line();              //G地点の交差点を認識
    follow_line();                   //cross_lineだと曲がれないのでfollow_lineで通過
    follow_line();                   //上記と同じ(F地点)
    follow_line();                   //上記と同じ(E地点)
    cross_line();                    //D地点の交差点を通過
    follow_line();
    cross_line();
    cross_line();                    //C地点の交差点を通過
    follow_line();
    follow_line();
    follow_line();
    follow_line();
    cross_line();
    follow_line();
    cross_line();
    follow_line();
    OnRev(OUT_B,50);Off(OUT_C);
    OnRev(OUT_B,50);Off(OUT_C);      //車体を黒線と平行に戻す
    Wait(100);
    short_break;
    up;
    OnFwd(OUT_BC,75);
    up;                              //アームを上げる
    OnFwd(OUT_BC,75);                //シュート
    Wait(100);
    go;
    go;                              //A地点に入る
    Wait(1000);
}

*4.感想 [#w569a3a5]




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