[[2015b/MemberOnly]]
*ボール打ち出しロボット [#ucbc2881]
**目的 [#gb654b97]
今回は2つのロボットを用いて一つがAから発進しボールをつかみ缶にあてる。もう一つがBから発進しそのボールを回収する、という課題だった。

#ref(2015b/Member/nakamura/Mission3/2015b-mission3.png,50%,コース)
**ロボット本体 [#ib05a45e]
ロボット本体はライントレースができるようにドライブベースを使った。そしてボールをつかむ、なげる動作が必要なのでアームを付けた。
**プログラム [#ye1e08ae]
今回はモーターの配置の関係でモーターA,Cは「OnFwd」と入力すると逆回転してしまった。そこでプログラム上では前進するときは

「OnRev(OUT_AC)」

と入力している。


***数値の定義づけ [#u298e3c4]
 int light_max = 0;     //光の一番大きい数値
 int turn_time = 500;   //光を探すために旋回する時間
 int time_max = 0;      //回り始めてから最大の明るさの値を見つけるまでの時間
 int t = 0;
 int s = 0;


***光の方向に向くサブルーチン [#cd0c2ced]
 sub light(){
   
      /*   センサー1,2を光センサーに設定   */
         SetSensor(SENSOR_1, SENSOR_LIGHT);
         SetSensor(SENSOR_2, SENSOR_LIGHT);
   
      /*   時間をはかりながら旋回   */
         ClearTimer(0);
         OnFwd(OUT_A);OnRev(OUT_C);
   
      /*   光センサーが最も明るい値を示した時の旋回した時間を求める   */
         while(FastTimer(0) < turn_time){
             if(SENSOR_2 > light_max){
                 light_max = SENSOR_2;
                 time_max = FastTimer(0);
             }
          }
          Off(OUT_AC);Wait(100);
   
      /*   光のほうへむける   */
          OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time - time_max);
          Off(OUT_AC);Wait(100);
 }


***メインプログラム [#j887c224]
まずは1つ目のボールについてのプログラム
 task main(){
          SetSensor(SENSOR_2,SENSOR_LIGHT);
          SetSensor(SENSOR_1,SENSOR_LIGHT);
      
   
          SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);    //アームの持ち上げ
   
      /*   1つ目のボールをつかみに行く   */
          OnRev(OUT_AC);Wait(200);
          OnRev(OUT_A);OnFwd(OUT_C);Wait(100);
          OnRev(OUT_AC);Wait(200);
          Off(OUT_AC);Wait(100);
   
          SetPower(OUT_B, 1);OnRev(OUT_B);Wait(100); 
   
          OnRev(OUT_C);OnFwd(OUT_A);Wait(150);
          OnRev(OUT_AC);Wait(300);
   
      /*   光の最大値が65以上になるまで光源に近づく   */
          while(light_max < 65){
               
                     OnRev(OUT_AC);Wait(50);Off(OUT_AC);
                     light();
          }
   
          PlaySound(SOUND_CLICK);
          light();                                    //最後にもう1回光の方向を確認する
   
          SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);    //ボールを投げる

 
次に2つ目のボールについてのプログラム

      /*   2つ目のボールをつかみに行く   */
          OnFwd(OUT_C);OnRev(OUT_A);Wait(150);
          Off(OUT_AC);Wait(100);
   
          OnRev(OUT_AC);Wait(200);
          OnRev(OUT_AC);until(SENSOR_1 < 41);
          Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100);    //黒線まで進む
   
      /*   角を認識してボールへ近づく   */
          ClearTimer(1);
   
          while(FastTimer(1) < 50){
             if(SENSOR_1 > 49){
                 OnRev(OUT_A);OnFwd(OUT_C);
   
             } else if(SENSOR_1 > 46){
                 OnRev(OUT_A);Off(OUT_C);
   
             } else if(SENSOR_1 > 40){
                 OnRev(OUT_AC);ClearTimer(1);
   
             } else if(SENSOR_1 > 37){
                 OnRev(OUT_C);Off(OUT_A);ClearTimer(1);
   
             } else{
                 OnRev(OUT_C);OnFwd(OUT_A);ClearTimer(1);
   
               }
   
         }
          OnRev(OUT_A);OnFwd(OUT_C);Wait(80);
          OnRev(OUT_AC);Wait(150);
          Off(OUT_AC);Wait(100);
   
      /*   ボールをつかむ   */
          SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
          SetPower(OUT_B,1);OnRev(OUT_B);Wait(100);Off(OUT_B);
   
      /*   光センサーの値が50以上になるまで近づく   */
          OnFwd(OUT_A);OnRev(OUT_C);Wait(350);
          OnRev(OUT_AC);Wait(200);
   
          while(SENSOR_2 < 50){
               OnRev(OUT_AC);Wait(50);Off(OUT_AC);
               light();
          }
          PlaySound(SOUND_CLICK);
          light();
          OnRev(OUT_A);OnFwd(OUT_C);Wait(35);        //投げる方向の微調整
          Off(OUT_AC);Wait(100);
   
          SetPower(OUT_B,5);OnFwd(OUT_B);Wait(50);
   
          OnFwd(OUT_AC);Wait(100);
          Off(OUT_AC);
 }

**結果 [#z7856c00]
結果としては1つ目のボールを缶に当てることはうまくいった。しかし2つ目のボールをつかみ運ぶ途中でボールを受け取るロボットと連携がうまくいかず接触してしまった。

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