[[2013a/Member]]

*サッカーロボの解説 [#ma809a44]
*ロボットの紹介 [#dae41522]
今回のロボットもシンプルに仕上げました。
僕が本体を主に作り相方のA.K.416君がボールを取ったり、発射したりする機構を作りました。
本体は前回の時と同じでシンプルにし、いかにボールをどうするかに悩みました。
タイヤのモーターとプログラムを入れる機械にはさむという形に落ち着き、このようにプログラムを入れる機械を上げています。
#ref(2013a/Member/BK201/Mission2/IMG_0700.jpg,20%,本体の説明)
受け取る機構はA.K.416君のを僕なりに書いてみた。
#ref(2013a/Member/BK201/Mission2/IMG_0701.jpg,20%,受け取る機構の説明)
#ref(2013a/Member/BK201/Mission2/IMG_0702.jpg,20%,受け取る機構の説明)
*コースの紹介 [#ia3cfa77]
*コースの紹介・攻略 [#ia3cfa77]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission2&openfile=robocon2013a.png
-僕たちが先にボールを取りにいく
+ライントレースし交差点
+
+
+
+
 #define off Off(OUT_BC);
+ライントレースし交差点まで行く
+交差点にきたらボールに角度を合わせ取りに行く
+Uターンし今来た道を戻る
+上の2の位置で態勢を整えパスをする
+startと書かれた所でパスを受け取る態勢をとる
+90度の曲がり角でパスを出し待機する
-ここからは僕たちがボールをシュートする
+相手側がボールを持ってくるまで待機
+ボールを持ってきたらパスを受け取る
+startの位置でパスを出す
+上の2の位置でパスをもらいライントレース
+交差点に来たらゴールの缶に角度調整
+缶に向けて発射して終了
*プログラムの解説 [#lc214ced]
文字の定義
 #define TURN_TIME 500 //1/4回転の時間
 #define BLACK 31
 #define WHITE 62
 #define SPEED 100
 #define go OnFwd(OUT_BC,30);
 #define left OnFwd(OUT_B,30);Off(OUT_C);
 #define right OnFwd(OUT_C,30);Off(OUT_B);
 #define THRESHOLD 46
 #define lleft OnFwd(OUT_B,30);OnRev(OUT_C,30); 
 #define rright OnFwd(OUT_C,30);OnRev(OUT_B,30);
 #define fire OnRev(OUT_A,55);
 #define catch OnFwd(OUT_A,40);
 #define back OnRev(OUT_BC,30);
 #define off1 Off(OUT_BC);
 #define off2 Off(OUT_A);
 #define CONN 1
        
 #define BLACK 31//黒線は明るさ31
 #define WHITE 62//白紙は明るさ62
 #define SPEED 100//モーターの出力100%
 #define go OnFwd(OUT_BC,30);//goで前に出力30%で進む
 #define left OnFwd(OUT_B,30);Off(OUT_C);//Cのモーターを軸に左に30%で曲がる
 #define right OnFwd(OUT_C,30);Off(OUT_B);//Bのモーターを軸に右n30%で曲がる
 #define THRESHOLD 46//線の明るさのしきい値
 #define lleft OnFwd(OUT_B,30);OnRev(OUT_C,30);//モーター同士の間を中心に出力30%で左回転
 #define rright OnFwd(OUT_C,30);OnRev(OUT_B,30);//モーター同士の間を中心に出力30%で右回転
 #define fire OnRev(OUT_A,55);//ボールを発射する
 #define catch OnFwd(OUT_A,40);//ボールを抑える
 #define back OnRev(OUT_BC,30);//出力30%で後退する
 #define off1 Off(OUT_BC);//モーターBCを止める(BCはタイヤを動かすモーター)
 #define off2 Off(OUT_A);//モーターAを止める(Aは受け取ったり発射したりするモーター)
 #define CONN 1//通信時の文字定義
 task main()
 {//1
   SetSensorLight(S1);//光センサー定義
    int n=0;//変数1
    int m=0;//変数2
     int msg;
      
球をとるまでのプログラム  
  
  
 while(n<600)//球をとるまでのプログラム
 while(n<600)//ライントレース(左に600回連続で曲がったら次へ)交差点まで
   {//2
   if (SENSOR_1 < 35){left;n++; }
   else
     {//3
    if(SENSOR_1 < 42){lleft} 
    else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
    else  {rright}
    n=0;
     }//3
   }//2
   

交差点に来たら

   back
   Wait(1250);
   right
   Wait(980);//球の方向へ
   Wait(1250);//態勢を整えるため後退し距離をとる
   right 
   Wait(980);//球の方向に角度調整 
   go
   Wait(500);//進む
   catch
   Wait(500);//球を抑える
   Off(OUT_A);
   rright
   Wait(1500);//元の方向へ
   Wait(1500);//Uターンする
   go
   Wait(2450);
   while(SENSOR_1 > 50){left} 
   Wait(2450);//進む
   while(SENSOR_1 > 50){left}//黒線になるまで左回転 

 long t0 = CurrentTick();//時間指定
ボールを発射場までのライントレース

 long t0 = CurrentTick();//ここから時間測定をする
 
 while(CurrentTick()-t0 <= 4850)//球を排出するまでのプログラム
   {//5
 while(CurrentTick()-t0 <= 4850)//4.85秒間ライントレース
   {//4
   if (SENSOR_1 < 37){left}
   else
     {//6
     {//5
    if(SENSOR_1 < 45){lleft} 
    else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
    else  {rright}
     }//6
    }//5
     }//5
    }//4

時間が来たらパスする行動するプログラム
 
  lleft//球排出
  lleft
  Wait(1040);
  Off(OUT_BC);
  Wait(2000);
  SendRemoteNumber(CONN,MAILBOX1,11);
  fire
  SendRemoteNumber(CONN,MAILBOX1,11);相手に信号を送る
  fire//ボール発射
  Wait(1200);
  Off(OUT_A);
  rright
  Wait(400);
    while(SENSOR_1 > 50){rright}
    while(SENSOR_1 > 50){rright}//方向角度調整
 
 go//次の地点へ
       Wait(2050);

ボールを受け取るプログラム
    
     lleft//受け取る体勢
     lleft
     Wait(1040);
     Off(OUT_BC);
      
    Wait(5000);
     SendRemoteNumber(CONN,MAILBOX1,12); 
     SendRemoteNumber(CONN,MAILBOX1,12); //ボールを打たせる信号を送る
      Wait(3000);
     catch
     catch//ボールをとる
     Wait(350);
     Off(OUT_A);
    while(SENSOR_1 > 50){rright}
    while(SENSOR_1 > 50){rright}//方向角度調整

ボールを発射するまでのプログラム
     
    long t3 = CurrentTick();
   while(CurrentTick()-t3 <= 2400)//球を排出するまでのプログラム
   {//5
   while(CurrentTick()-t3 <= 2400)//2.4秒間ライントレースしたら次のプログラムへ
   {//6
   if (SENSOR_1 < 37){left}
   else
     {//6
     {//7
    if(SENSOR_1 < 45){lleft} 
    else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
    else  {rright}
     }//6
    }//5
     }//7
    }//6
     
       lleft//球排出
       lleft
       Wait(1040);
       Off(OUT_BC); 
       Wait(5000);
    SendRemoteNumber(CONN,MAILBOX1,13);
        fire
       Wait(1000);//1回目終了
    SendRemoteNumber(CONN,MAILBOX1,13);//相手に信号を送る
        fire//球排出
       Wait(1000);
       Off(OUT_A);
                    

相手が終わるまで待機                    
  
 Wait(40000);
 SendRemoteNumber(CONN,MAILBOX1,13);
 Wait(30000);

ボールを受け取る

 SendRemoteNumber(CONN,MAILBOX1,13);//ボールを打たせる信号を送る
 Wait(800);
 catch
 catch//ボールを受け取る
 Off(OUT_A);
 Wait(500);
  while(SENSOR_1 > 50){lleft}
  while(SENSOR_1 > 50){lleft}//方向角度調整
  
ボールを発射するまでのプログラム
   
    long t4 = CurrentTick();
   while(CurrentTick()-t4 <= 1500)//球を排出するまでのプログラム
   {//5
   while(CurrentTick()-t4 <= 2500)//2.5秒間ライントレース
   {//8
   if (SENSOR_1 < 37){left}
   else
     {//6
     {//9
    if(SENSOR_1 < 45){lleft}  
   else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
   else  {rright}
     }//6
    }//5
     }//9
    }//8
     
        
     rright
     Wait(1000); 
     Off(OUT_BC);
     fire
     fire//ボール発射
     Wait(500);
     Off(OUT_A);
   while(SENSOR_1 > 50){lleft}
   while(SENSOR_1 > 50){lleft}//方向角度調整
  
ボールを受け取るプログラム
   
    long t5 = CurrentTick();
   while(CurrentTick()-t5 <= 1500)//球を排出するまでのプログラム
   {//5
   while(CurrentTick()-t5 <= 1500)//1.5秒間ライントレース
   {//10
   if (SENSOR_1 < 37){left}
   else
     {//6
     {//11
    if(SENSOR_1 < 45){lleft} 
    else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
    else  {rright}
     }//6
    }//5 
     }//11
    }//10
 
         rright
         Wait(1000);
        Off(OUT_BC);
  
         catch
         catch//ボールを受け取る
         Wait(500);
          Off(OUT_A);
         while(SENSOR_1 > 50){lleft}
         while(SENSOR_1 > 50){lleft}//方向角度調整
 
最後のライントレース
 
 long t6 = CurrentTick();
 
 while(CurrentTick()-t6 <= 5000)//ゴール用
  {//7
 while(CurrentTick()-t6 <= 5000)//5秒間ライントレース
  {//12
   if (SENSOR_1 < 35){left}
   else
     {//8
     {//13
    if(SENSOR_1 < 42){lleft} 
    else if (SENSOR_1 < 50){go}
    else if (SENSOR_1 < 56){right}
    else  {rright}
     }//8
    }//7
     }//13
    }//12

時間が来たら発射
 
 fire
 Wait(1000);
 Off(OUT_A);
 }//1

*まとめ [#qefe0acc]
今回の課題はなかなか難しかった。課題に合わせたロボットを作ることが難しいかったが、相手と通信するためのBluetooth通信が特に難しかった。また、ボールの受け取り口が広くはないのでパスのやり取りに苦戦した。本番ではうまくいっていたのは不幸中の幸いだと思う。もう少し改善すべきところもあっただろう。他にも、電池の残量によってロボットの挙動が変わってしまい数値を調節するのに時間がかかってしまい大変だった。


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