[[2015a/Member]]
#contents
*はじめに [#k5824273]
**課題 [#ac0fdc2b]
+ロボットの作製
+ロボットにライントレースさせボールをゴールまで運ぶ。私はA〜Bのコースを選択した。
#ref(2015a-mission2.png)

*ロボット [#ra6a7964]
ロボットの外観はこうなっている。
#ref(image1 (2).JPG)
アームを上下させて、ボールを掴む。
#ref(image2 (1).JPG)
#ref(image3 (1).JPG)

*プログラムと説明・工夫点 [#t114a30d]
**定義 [#qed9a236]
 #define speed1 50
 #define speed2 25
 #define onRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); 
 #define forward  onRL(speed1,speed1); 
 #define back OnRev(OUT_B,speed2);OnRev(OUT_C,speed1);
 #define turnleft1 onRL(speed2,-speed2);   
 #define turnleft2 onRL(speed2,0);          
 #define turnright1 onRL(0,speed2);          
 #define turnright2 onRL(-speed2,speed2);  
 #define step 1  
 #define max1 120
 #define max2 250
 #define max3 240
 #define breaktime Off(OUT_BC);Wait(2000); 
 #define take Off(OUT_BC);Wait(1000);OnFwd(OUT_A,30);Wait(700);Off(OUT_A);Off(OUT_BC);Wait (1000);
 #define shoot Off(OUT_BC);Wait(1000);back;Wait(700);Off(OUT_BC);Wait(200);OnRev(OUT_A,60);Wait(220);Off(OUT_A);onRL(70,70);Wait(800);

**プログラム [#se2bdbac]
 task main()
 {
 SetSensorLight(S4);
 int online=0;
 int count=0;

一つ目の交差点を通過するまでのプログラム
 do {  
    while(online<max1)    {  //max1の値を超えたとき交差点と判断
        if(SENSOR_4<40)   {  //黒が濃いとき
        turnleft1;  //左旋回
        online++;  //onlineの値を増やす
        }    else    {
        if(SENSOR_4<45)    {  //黒が少し濃いとき
        turnleft2;  //左折
        }    else if(SENSOR_4<52)    {  //黒いとき
        forward;  //直進
        }    else if (SENSOR_4<57)    {  //黒が薄いとき
        turnright2;  //左折
        }    else    {  //白いとき
        turnright1;  //左旋回
        }
        online=0;
        }
        Wait(step);
     }
    breaktime;//交差点と判断、2秒間停止
    take;//ボールをキャッチ
    onRL(-28,10);Wait(680);Off(OUT_B);onRL(25,-13);until(SENSOR_4<=57);  //方向を調整しつつ交差点を通過
    count++;  //一つ目の交差点を通過、countの値を増やす
 }while(count<1);  //countの値が1を超えるまで、つまり、一つ目の交差点を通過するまではラインの左側をトレースし続ける

一つ目の交差点を通過後、二つ目の交差点を通過するまでのプログラム
 do {  
    while(online<max2){  //max2の値を超えたとき交差点と判断
        if(SENSOR_4<40)    {  //黒が濃いとき
        turnright1;  //右旋回
        online++;  //onlineの値を増やす
        }    else    {
        if(SENSOR_4<45)    {  //黒が少し濃いとき
        turnright2;  //右折
        }    else if (SENSOR_4<50)    {  //黒いとき
        forward;  //直進
        }    else if (SENSOR_4<57)    {  //黒が薄いとき
        turnleft2;  //左折
        }    else    {  //白いとき
        turnleft1;  //左旋回
        }
        online=0;
        }
        Wait(step);
     }
    breaktime;  //交差点と判断、2秒間停止
    onRL(30,-20);Wait(800);Off(OUT_B);turnright2;until(SENSOR_4<=55);  //方向を調整
    count++;  //二つ目の交差点を通過、countの値を増やす
 }while(count<2); //countの値が2を超えるまで、つまり、二つ目の交差点を通過するまではラインの右側のトレースし続ける

二つ目の交差点を通過後、最後ボールを転がすまでのプログラム
 do {  
    while(online<max3){  //max3の値を超えたときゴールと判断
        if(SENSOR_4<40){  //黒が濃いとき
        turnleft1;  //左旋回
        online++;
        }    else    {
        if(SENSOR_4<45)    {  //黒が少し濃いとき
        turnleft2;  //左折
        }    else if (SENSOR_4<50)    {  //黒いとき
        forward;  //直進
        }    else if (SENSOR_4<57){  //黒が薄いとき
        turnright2;    //右折
        }    else    {  //白いとき
        turnright1;  //右旋回
        }
        online=0;
        } 
        Wait(step);
        }
    count++;    //ゴールに到着、countの値を増やす
 }    while(count<3);countの値が3を超えるまで、つまり、ゴールに到着するまでラインの左側をトレースし続ける
    shoot;  //ボールを転がす
 }

**説明・工夫点 [#d905c6d0]
黒い部分が連続すると交差点と判断する。
一つ目の交差点の後の急なカーブをスムーズに通過できるように、そして、二つ目の交差点を認識できるように、一つ目の交差点まではラインの左側をトレース、二つ目の交差点まではラインの右側をトレース、その後ゴールまではラインの右側をトレースするようになっている。黒い部分が連続する場所(交差点とゴール付近の枠)に到着する度に判定、そして、ある変数(ここではcount)の値を増やしていくことによって場所によって動きを変えるようになっている。
一つ目の交差点の後の急なカーブをスムーズに通過できるように、そして、二つ目の交差点を認識できるように、一つ目の交差点まではラインの左側をトレース、二つ目の交差点まではラインの右側をトレース、その後ゴールまでは再びラインの左側をトレースするようになっている。黒い部分が連続する場所(交差点とゴール付近の枠)に到着する度に判定、そして、ある変数(ここではcount)の値を増やしていくことによって場所によって動きを変えるようになっている。

*まとめ・感想 [#ye6319aa]
ライントレースしてゴール、ボールを転がすというプログラムをタイマーを使って無理矢理制御することができた。そのため、電池など回りの影響を比較的受けにくく再現性が高いものになったのではないかと思う。

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