*目次 [#q0beaeb0]
#contents

*課題の説明 [#ib723224]
&ref(./img.jpeg,20%);
-画像のようなコースを作成し、与えられた条件を満たしてゴールせよ。
***条件 [#ndfbf27e]
+A,B,Cのいずれかから、それぞれ指定された場所までコースに沿って移動する。(AからB,BからA,CからA)
+交差点は曲がらずに通過する。
+途中に設置されたボールをゴールまで持っていく。(可能ならシュートする)

*ロボットの説明 [#bd77b578]
**本体 [#s425d79f]
&ref(./image[1].jpeg,20%);
&ref(./image[2].jpeg,20%);

これが今回私たちのチームが制作したロボットです。

アームでボールを囲み、ゴールまで運びます。
**アーム [#ie485727]
***アーム1 [#wf712d8e]
&ref(./image.jpeg,13%);

本体の下部にあり、ボールをキャッチし外に出ないようにする役割をもちます。
***アーム2 [#peeefd4c]
&ref(./image[6].jpeg,15%);

本体の上部にあり、最初は開いています。

ボールが射程範囲に入るころに閉じ、ゴールまで運べるようにプログラムしてあります。

シュートのときは再度開きます。
*コンセプト [#a317f46d]
光センサの値が低い(黒〜灰色)ときは右に、高い(灰色〜白)ときは左に曲がります。

そのためラインの左側に沿ってゴールまで移動していきます。

光センサの値が低い場合が続いたら交差点と判断し、突破用のプログラムが作動します。

光センサの値が高い場合が続いたらゴール前だと判断し、シュートして動作を終了します。

ボールは上で書いたように、2つのアームを使って運びます。

シュートはアーム2を開き、体当たりすることで行います。

*プログラム [#ye3fb51e]
**マクロ [#y9ccd10e]
 #define THRESHOLD 39           //光センサの基準値
 #define SPEED_H 30       //直線に進むときのスピード
 #define SPEED_L 20       //曲線に進むときのスピード
 #define downtime 10000         //ボールが射程範囲に入る時間で、この時間あたりでアーム2を下げる
 #define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(300);      //アーム2を下げる
 #define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300);        //アーム2を上げる
 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);    //引数に応じて運動する
 #define go_forward OnRL(SPEED_H, SPEED_H);    //まっすぐ進む
 #define turn_left1 OnRL(SPEED_L, -SPEED_L);   // 左旋回
 #define turn_left0 OnRL(SPEED_L, 0);          // 左折
 #define turn_right0 OnRL(0, SPEED_L);         // 右折
 #define turn_right1 OnRL(-SPEED_L, SPEED_L);  // 右旋回
 #define STEP 1
 #define nMAX 300    //光センサの値が低い状態がこの時間だけ続いたら、交差点突破プログラムを発動する 
 #define CROSS_TIME 200  //交差点突破に必要な時間
 #define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500);\
 up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC);        //シュートするプログラム
**サブルーチン [#mc07ce40]
 sub short_break(long s)
 {
  int a=0;
  while(a<1000)
  {
   Off(OUT_BC);
   Wait(STEP);
   if(CurrentTick()-s<=downtime+1.0 && downtime<=CurrentTick()-s)
   {
    down;
   }
   a++;
  }
 } 


 sub cross_line(long t)
 {
  int b=0;
  while(b<CROSS_TIME)
  {
   OnRL(SPEED_L,SPEED_L);
   Wait(STEP);
   if(CurrentTick()-t<=downtime+1.0 && downtime<=CurrentTick()-t)
    {
    down;
    } 
   b++;
  }
 } 

 sub c_direction(long u)
 {
  int c=0;
  while(c<nMAX)
  {
   turn_left1;
   Wait(STEP);
   if(CurrentTick()-u<=downtime+1.0 && downtime<=CurrentTick()-u)
    {
    down;
    }
   c++;
  }
 }

**メイン [#a1376baa]
***開始から10秒まで [#i2b8cf80]
 task main()
 {
  SetSensorLight(S3);
  int nOnline=0;
  long t0=CurrentTick();
  int g=0;
   while (CurrentTick()-t0<10000)
   {
    while (nOnline < nMAX) 
    {
     if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0)
      {
      down;
      }
     if (SENSOR_3 < THRESHOLD-8) 
      {
      turn_right1;
      nOnline++;
      }
     else
      {
      if (SENSOR_3 < THRESHOLD-5) 
       {
       turn_right0;
       }
      else if (SENSOR_3 < THRESHOLD+5)
       {
       go_forward;
       }
      else if (SENSOR_3 < THRESHOLD+8)
       {
       turn_left0;
       }
      else
       {
       turn_left1;
       }
      nOnline=0;
      }
     Wait(STEP);
     }
    short_break(t0);
    c_direction(t0);
    cross_line(t0);
    nOnline=0;
  }
***開始から10秒以降 [#c297922f]
  while(CurrentTick()-t0>10000.0 && CurrentTick()-t0<10000000.0)
    {
    while (nOnline < nMAX) 
    {
     if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0)
      {
      down;
      }
     if (SENSOR_3 < THRESHOLD-8) 
      {
      turn_right1;
      nOnline++; 
      g=0;
      }
     else if (SENSOR_3 >= THRESHOLD+8)
      {
      turn_left1;
      g++;
      nOnline=0;
      if(g==nMAX)
       {
       nOnline=nMAX;
       }
      }
     else
      {
      if (SENSOR_3 < THRESHOLD-5) 
       {
       turn_right0;
       }
      else if (SENSOR_3 < THRESHOLD+5)
       {
       go_forward;
       }
      else if (SENSOR_3 < THRESHOLD+8)
       {
       turn_left0;
       }
      nOnline=0; 
      g=0;
      }
     Wait(STEP);
    }
    if(g<nMAX)
    {
     short_break(t0);
     c_direction(t0);
     cross_line(t0); 
     nOnline=0; 
    }
    else if(g==nMAX)
    {
     short_break(t0);
     turn_right1;
     Wait(nMAX*STEP);
     goal;
     t0-=10000000;
    }
  }
 }
*結果 [#e41fff56]

*苦労したところ・反省点 [#h7ce2d02]
**苦労したことと解決法 [#b65b839b]

**反省点 [#o868e8fc]

*感想 [#f439ae4e]


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