[[2014a/Member]]

#contents
* メンバー紹介 [#i40bd30e]

・totakeke(自分)
-totakeke(自分)

・arara(相方)
-arara(相方)

*  課題の内容 [#v7965bd0]

・スタート地点から出発し、途中に置かれているピンポン玉を掴んでからゴール地点に行きシュートをきめる。
-スタート地点から出発し、途中に置かれているピンポン玉を掴んでからゴール地点に行きシュートをきめる。

#ref(2014a/Member/totakeke/Mission1/2014a-mission1.2.png,100%,課題コース)

*  ロボット紹介 [#bfdd3264]

**シュートとドリブル [#v13bdb60]

・まずはボールをどのように掴んでシュートするのかというと始めは上がってる状態にある囲いをボールの上でおろし、ゴールの近くになると囲いをあげ上から押さえつけていたおもりで押し出してシュートする。
-まずはボールをどのように掴んでシュートするのかというと始めは上がってる状態にある囲いをボールの上でおろし、ゴールの近くになると囲いをあげ上から押さえつけていたおもりで押し出してシュートする。

&ref(2014a/Member/totakeke/Mission1/image1.jpeg,70%,アーム1);
&ref(2014a/Member/totakeke/Mission1/image2.jpeg,70%,アーム2);
&ref(2014a/Member/totakeke/Mission1/image3.jpeg,70%,アーム3);

**光センサー [#wb1a1964]

・少し影になってしまうが、タイヤと同じ場所に置くことですぐに反応できるようにした。
-少し影になってしまうが、タイヤと同じ場所に置くことですぐに反応できるようにした。

#ref(2014a/Member/totakeke/Mission1/image4.jpeg,70%,光センサー)

**全体図 [#r103d307]

・タイヤを一組にすることで小回りをよくしている。
-タイヤを一組にすることで小回りをよくしている。

#ref(2014a/Member/totakeke/Mission1/image5.jpeg,70%,全体図)

*プログラム説明 [#cecc5183]

#ref(2014a/Member/totakeke/Mission1/2014a-mission1.png,100%,プログラム用課題コース)
・ロボットはラインの左側をトレースするようにプログラムされている。
-ロボットはラインの左側をトレースするようにプログラムされている。

・A-B間B-C間は急カーブと認識した回数を数えそれぞれの回数の時BとCの場所でアームを動かす。
-A-B間B-C間は急カーブと認識した回数を数えそれぞれの回数の時BとCの場所でアームを動かす。

・カウンターを用いて濃い黒を5回連続で感知するとロボットは直角と識別し、直進する。
-カウンターを用いて濃い黒を5回連続で感知するとロボットは直角と識別し、直進する。

 #define THRESHOLD 44    //しきい値
 #define LOWPOWER 1       //早すぎるため全て遅くする
 #define set_power_L SetPower(OUT_AC,LOWPOWER);    //力
 #define go_forward set_power_L; OnFwd(OUT_AC);                 //直進
 #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C);    //左旋回
 #define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C);      //左折
 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);     //右折
 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C);   //右旋回
 #define STEP 1        //1回の判断で動作させる時間(これは1/100秒)
 #define n0MAX 15      //通常のカーブとして許容できる繰り返しの最大値
 #define n1AMAX 2      //コース前半の急なカーブと判断される回数
 #define n1BMAX 4      //コース後半の急なカーブと判断される回数 
 #define short_break Off(OUT_AC); Wait(100);                    //小休止
 #define CROSS_TIME 20                                          //交差点を渡る時間
 #define first_time 400                                         //交差点を認識する時間
 #define dribble set_power_L; OnFwd(OUT_B); Wait(47);           //ボールをつかむ
 #define shoot set_power_L; OnRev(OUT_B); Wait(47);             //ボールをシュート  
 task main()
    {
    SetSensor(SENSOR_2, SENSOR_LIGHT);  //光センサーをセット
    int n0nline=0;                      //続けて黒になった回数(カウンタ)
    int n1nline=0;                      //急カーブの回数
        while(n1nline < n1AMAX)         //急なカーブが2回あるまで{}の中を繰り返す(n1AMAXは2なので)
        {
 	    while(n0nline < n0MAX)//急なカーブがあるまで繰り返す
            {
 	    if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++;} //より暗いとき左旋回してカウンタを1増やす
 	    else if (SENSOR_2 < THRESHOLD -4){ turn_left0; }      //暗いとき左折
 	    else if (SENSOR_2 < THRESHOLD +1){ go_forward; }      //中間のとき直進
 	    else if (SENSOR_2 < THRESHOLD +12){ turn_right0; }    //明るいとき右折
 	    else { turn_right1; }                                 //より明るいとき右旋回
 	    Wait(STEP);
            }
        PlaySound(SOUND_UP);  //急なカーブの度に高い音を1回鳴らす 
	n0nline=0;            //カウンタをリセット 
	n1nline++;            //急なカーブの数をカウント
        }
    n1nline=0;
    ClearTimer(0);                        //タイマーをリセットして開始
        while(FastTimer(0) <= first_time) //交差点を渡りきるまで繰り返す
        {
 	    while(n0nline < n0MAX)
            {
 	    if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++; }
            else if (SENSOR_2 < THRESHOLD -4){ turn_left0; }
 	    else if (SENSOR_2 < THRESHOLD +1){ go_forward; }
 	    else if (SENSOR_2 < THRESHOLD +12){ turn_right0; }
 	    else { turn_right1; }
 	    Wait(STEP);
 	    }
        short_break;          //小休止
 	turn_right1; Wait(n0MAX*STEP); //進行方向修正
 	cross_line;                    //交差点を渡る
 	n0nline=0;                     //カウンタをリセット
        }
    n0nline=0;
        while((FastTimer(0) > first_time)&&(n1nline <n1BMAX)) //急なカーブが4回あるまで(最後のT字路を含む)繰り返す
        {
 	    while(n0nline < n0MAX)
            {
 	    if (SENSOR_2 < THRESHOLD -8){ turn_left1; n0nline++; }
 	    else if (SENSOR_2 < THRESHOLD -4){ turn_left0; }
 	    else if (SENSOR_2 < THRESHOLD +1){ go_forward; }
 	    else if (SENSOR_2 < THRESHOLD +12){ turn_right0; }
 	    else { turn_right1; }
 	    Wait(STEP);
 	    }
 	 n1nline++;
 	 n0nline=0;
 	 PlaySound(SOUND_DOWN);  //急なカーブがある度に低い音を鳴らす
        }
     }

*感想と反省 [#s0379e6f]
ロボット本体の小回りやアームなどを考えるのに時間がかかりすぎた、またプログラムではアームのおろすタイミングなどが難しく苦戦した。

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