2013a/Member

サッカーロボの解説

ロボットの紹介

今回のロボットもシンプルに仕上げました。 僕が本体を主に作り相方のA.K.416君がボールを取ったり、発射したりする機構を作りました。 本体は前回の時と同じでシンプルにし、いかにボールをどうするかに悩みました。 タイヤのモーターとプログラムを入れる機械にはさむという形に落ち着き、このようにプログラムを入れる機械を上げています。

本体の説明

受け取る機構はA.K.416君のを僕なりに書いてみた。

受け取る機構の説明
受け取る機構の説明

コースの紹介・攻略

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013a%2FMission2&openfile=robocon2013a.png

  1. ライントレースし交差点まで行く
  2. 交差点にきたらボールに角度を合わせ取りに行く
  3. Uターンし今来た道を戻る
  4. 上の2の位置で態勢を整えパスをする
  5. startと書かれた所でパスを受け取る態勢をとる
  6. 90度の曲がり角でパスを出し待機する
  1. 相手側がボールを持ってくるまで待機
  2. ボールを持ってきたらパスを受け取る
  3. startの位置でパスを出す
  4. 上の2の位置でパスをもらいライントレース
  5. 交差点に来たらゴールの缶に角度調整
  6. 缶に向けて発射して終了

プログラムの解説

文字の定義

#define TURN_TIME 500 //1/4回転の時間
#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)//ライントレース(左に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);//球の方向に角度調整 
  go
  Wait(500);//進む
  catch
  Wait(500);//球を抑える
  Off(OUT_A);
  rright
  Wait(1500);//Uターンする
  go
  Wait(2450);//進む
  while(SENSOR_1 > 50){left}//黒線になるまで左回転 

ボールを発射場までのライントレース

long t0 = CurrentTick();//ここから時間測定をする

while(CurrentTick()-t0 <= 4850)//4.85秒間ライントレース
  {//4
  if (SENSOR_1 < 37){left}
  else
    {//5
   if(SENSOR_1 < 45){lleft} 
   else if (SENSOR_1 < 50){go}
   else if (SENSOR_1 < 56){right}
   else  {rright}
    }//5
   }//4

時間が来たらパスする行動するプログラム

 lleft
 Wait(1040);
 Off(OUT_BC);
 Wait(2000);
 SendRemoteNumber(CONN,MAILBOX1,11);相手に信号を送る
 fire//ボール発射
 Wait(1200);
 Off(OUT_A);
 rright
 Wait(400);
   while(SENSOR_1 > 50){rright}//方向角度調整

go//次の地点へ
      Wait(2050);

ボールを受け取るプログラム

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

ボールを発射するまでのプログラム

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

相手が終わるまで待機

 
Wait(30000);

ボールを受け取る

SendRemoteNumber(CONN,MAILBOX1,13);//ボールを打たせる信号を送る
Wait(800);
catch//ボールを受け取る
Off(OUT_A);
Wait(500);
 while(SENSOR_1 > 50){lleft}//方向角度調整
 

ボールを発射するまでのプログラム

  
   long t4 = CurrentTick();
  while(CurrentTick()-t4 <= 2500)//2.5秒間ライントレース
  {//8
  if (SENSOR_1 < 37){left}
  else
    {//9
   if(SENSOR_1 < 45){lleft}  
  else if (SENSOR_1 < 50){go}
   else if (SENSOR_1 < 56){right}
  else  {rright}
    }//9
   }//8
    
       
    rright
    Wait(1000); 
    Off(OUT_BC);
    fire//ボール発射
    Wait(500);
    Off(OUT_A);
  while(SENSOR_1 > 50){lleft}//方向角度調整
 

ボールを受け取るプログラム

  
   long t5 = CurrentTick();
  while(CurrentTick()-t5 <= 1500)//1.5秒間ライントレース
  {//10
  if (SENSOR_1 < 37){left}
  else
    {//11
   if(SENSOR_1 < 45){lleft} 
   else if (SENSOR_1 < 50){go}
   else if (SENSOR_1 < 56){right}
   else  {rright}
    }//11
   }//10

        rright
        Wait(1000);
       Off(OUT_BC);
 
        catch//ボールを受け取る
        Wait(500);
         Off(OUT_A);
        while(SENSOR_1 > 50){lleft}//方向角度調整

最後のライントレース

long t6 = CurrentTick();

while(CurrentTick()-t6 <= 5000)//5秒間ライントレース
 {//12
  if (SENSOR_1 < 35){left}
  else
    {//13
   if(SENSOR_1 < 42){lleft} 
   else if (SENSOR_1 < 50){go}
   else if (SENSOR_1 < 56){right}
   else  {rright}
    }//13
   }//12

時間が来たら発射

fire
Wait(1000);
Off(OUT_A);
}//1

まとめ

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


添付ファイル: fileIMG_0702.jpg 244件 [詳細] fileIMG_0701.jpg 202件 [詳細] fileIMG_0700.jpg 218件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-15 (木) 20:18:14