目次
#contents
*課題2 [#df722398]
**コース [#xeb5023e]
#ref(2016b/Member/zaurusu/Mission2/2016b-mission2_a.png,60%,コース)
**ミッション [#o355c3dc]
B地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートする。

Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート

・なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。

・ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい。

・可能であればC,Dのゴールエリアライン上からシュートする。
*ロボットの説明 [#nf08b60a]
**ロボットの全体 [#pdcfe965]
2つの車輪で前に進み、前方のアームでピンポン玉を捕まえる。

今回のライントレースは半径4�僂糧庄澆�あるため、機体を小さくして小回りがしやすいようにした。
#ref(2016b/Member/zaurusu/Mission2/DSC_0364.JPG,100%,ロボット)
**ロボットのアーム [#nb5c2212]
機体の上にギアを取り付けて、軸を動かすことにより動力を伝えている。また、車輪の上に取り付けることにより、走行しやすいようにしてある。
#ref(2016b/Member/zaurusu/Mission2/DSC_0365.JPG,100%,アーム上)
光センサーはアームの接続部分に装着してある。

片方のアームに付いている軸を回すことで、もう一方のアームも同じように開閉する。
#ref(2016b/Member/zaurusu/Mission2/DSC_0367.JPG,100%,アーム下)
**ロボットの車体 [#k4e2458c]
車体の中央に付近にギアを取り付け、車輪のギアに直接動力を伝えている。
#ref(2016b/Member/zaurusu/Mission2/DSC_0366.JPG,100%,ロボットの車輪)
摩擦力を低下させるため、車体裏側後方に丸いブロックを装着している。

車輪の動力となるギアは可能な限り横幅をなくすために、互いに接触するように組み込んでいる。
#ref(2016b/Member/zaurusu/Mission2/DSC_0369.JPG,100%,ロボットの裏側)
**ロボットの基本的な動作 [#j3ce42f5]
ロボットには光センサーが装着してあり、反射してくる光の明るさによって値が変化する。そのため黒色や白色などが判断できる。黒い線上を走るのではなく、余白と黒い線の境目をジクザクにはしるプログラムにしてある。白色ならば右に曲がり、黒色ならば左に曲がる。これを繰り返すことで前に進む。

交差点では黒い値をある秒数(今回は0.25秒)以上感知し続けたときに、その場所が交差点だと判断している。
*プログラム [#bc43c67d]
十字路は基本的にまっすぐ進むようにしてあり、T字路は右に進むようにしてある。
2つめの交差点後はピンポン玉をつかむ必要があるため、惰性で進まないように停止してから掴んでいる。また、円上を走行するため光センサーが黒色と認識する時間が増えて、交差点と誤認識してしまう。そのためつかむ動作の後、4秒間線上を走行するようにプログラミングしてある。

電圧低下により毎回同様の動作をしないため、曲がった後に多少の誤差がある。これを解消するために曲がった後2秒間はロボットの基本的な動作をしてもらい、臨機応変に対応できるように改良した。

 #define white 50//光センサーの白に対する下限値
 #define white_grey 47//光センサーの灰色よりも少し白い色に対する下限値
 #define grey 44//光センサーの灰色に対する下限値
 #define black_grey 41//光センサーの灰色よりも少し黒い色に対する下限値
 #define black 38//光センサーの黒に対する下限値
 #define turn_right OnFwd(OUT_A);Off(OUT_C);//右に曲がる
 #define turn_left Off(OUT_A);OnFwd(OUT_C);//左に曲がる
 #define go OnFwd(OUT_AC);//真っ直ぐ進む
 #define senkai_right OnFwd(OUT_A);OnRev(OUT_C);//右旋回
 #define senkai_left OnFwd(OUT_C);OnRev(OUT_A); //左旋回
 #define back OnRev(OUT_AC);//後ろに進む
 #define Stop Off(OUT_AC);Wait(100);//1秒間停止
 int n=0;//nは交差点の回数
 sub usually()//ロボットの基本的な動作
 {
   if(SENSOR_3>white)
   {
   senkai_right;ClearTimer(0);//白色ならば右に旋回
   }
   else if(SENSOR_3>white_grey)
   {
   turn_right;ClearTimer(0);//白色より少し黒いならば右に曲がる
   }
   else if(SENSOR_3>grey)
   {
   go;ClearTimer(0);//灰色ならばまっすぐ進む
   }
   else if(SENSOR_3>black_grey)
   {
   turn_left;ClearTimer(0);//黒色より少し白いならば左に曲がる
   }
   else if(SENSOR_3>black)
   {
   senkai_left;//黒色ならば左に旋回
   }
 }
 sub turn_right_t()//T字路の動作
 {
     if(n==4)//4回目の交差点(T字路)
  {
     if(SENSOR_3>white_grey)
  {
     Off(OUT_AC);Wait(100);
     back;Wait(050);
     go;Wait(030);
     senkai_right;Wait(057);
     go;Wait(030);
     Stop;
     
  }
  }
     if(n==6)//6回目の交差点(T字路)
  {
     if(SENSOR_3>white_grey)
  {
     Off(OUT_AC);Wait(100);
     back;Wait(060);
     go;Wait(030);
     senkai_right;Wait(057);
     go;Wait(030);
     Stop;
  }
  }            
 }
 sub tashikame()//交差点を判断した後の動作
 {
     senkai_right;Wait(021);
     Stop;
     go;Wait(050);
     n++;//交差点のカウント
 }
 sub kousaten_ichi()//交差点1つめの動作
 {
     if(n==1)
     {
     PlaySound(SOUND_CLICK);
     back;Wait(050);
     go;Wait(030);
     senkai_right;Wait(057);
     go;Wait(030);
     }
 }
 sub kousaten_nana()//交差点7つめ(ゴール)の動作
 {
     if(n==7)
  {
     Off(OUT_AC);Wait(100);
     OnRev(OUT_AC);Wait(060);//ゴールから少し離れる
     Off(OUT_AC);
     OnFwd(OUT_B);Wait(012);//アームを開く
     Off(OUT_B);
     go;Wait(060);//ボールをシュートする
     while(n==7)//全体の動作終了
   {
      Off(OUT_AC);
   } 
  }
 }
 task main()//メインプログラム
 {
     ClearTimer(0);
     SetSensor(SENSOR_3, SENSOR_LIGHT);
     while(true)
    {
     while(FastTimer(0)<025)//交差点の判断は0.25秒にした
       {
      usually();
       }
      tashikame();
      kousaten_ichi();
      ClearTimer(0);
      ClearTimer(1);
      if(n==2)//交差点2つめの動作
      {
       while(FastTimer(1)<050)//線上を0.5秒間進む
       {
       usually(); 
       }
      Off(OUT_AC);//車輪停止
      OnFwd(OUT_B);Wait(012);Off(OUT_B);Wait(050);//アームを広げる
      ClearTimer(1);
      while(FastTimer(1)<100)//線上を1秒間進む
       {
      usually(); 
       }
      Off(OUT_AC);//車輪停止
      OnRev(OUT_B);Wait(015);Off(OUT_B);Wait(050);//ピンポン玉をつかむ
      ClearTimer(1);
      while(FastTimer(1)<400)//4秒間線上を進む
      {
      usually();
       }
      }
     kousaten_nana();
     turn_right_t();
     ClearTimer(1);
     while(FastTimer(1)<200)//曲がった直後に2秒間進む
     {
     usually();
     }
   } 
 }
*まとめ [#w055892a]
**結果 [#v7107b21]
最後のゴールまでピンポン玉を運ぶことができた。しかし、機体の重心が前方に偏ったため後ろに進む際に車体が傾いてしまい、バックの距離が短くなることがたまに発生してしまった。そのためゴールで十分に下がらずに、シュートをしてしまうことがあった。
**感想 [#n61bb423]
交差点で曲がる際に電圧低下などによって毎回変化して曲がるため、その場合の対処を考えることに手間取ってしまった。だが最後にはゴールできる機体ができ、良かったと思う。

改善点として機体の重心をもう少しだけ後ろにすればバックの性能をあげられたと思う。また、交差点を判断する秒数をそれぞれ変えれば、誤作動なくスムーズに走行することができるだろう。

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