#contents

*ロボットの紹介 [#de0a99bc]
はじめは三輪で小回りの聞くロボットを作ろうと考えましたが、安定性と高さを考慮してコンパクトな四輪にしました。~
コンパクトながらも安定感が欲しかったので、車軸を支える点を一輪につき二箇所にしてより強固にしました。~
その結果車軸周りの重さが増して、重心が低く安定感のあるロボットになりました。~

鋏の部分は鋏自体を大きく広くすることで挟みやすく外れにくい構造に仕上がりました。~
また、うまく鋏同士が噛みあうようにしたので、持った時の安定感がより増しました。~
ただ、鋏部分と本体部分の接続が弱いので簡単に壊れてしまうのが欠点です。~

タッチセンサー部分は説明書の完成品を参考に作りました。~
軽い缶にも反応するようにできたと思います。~

*コース攻略 [#leb8b290]

**時計回り [#d8cb9e2c]
+はじめの角を交差点と誤認識して逆方向に曲がってしまうので、本当の交差点に差し掛かるまでは交差点無しのライントレースをするように時間で管理する。
+円に差し掛かったら交差点有りのライントレースに直し、4つの交差点を越える。
+交差点が終わったらまた交差点無しのライントレースに戻し、時間での管理で缶を離す。
+そのまま交差点無しのライントレースでゴールする。

#ref(2013a/Member/shu/Mission1/robo1.jpg,100%,コース攻略)
**反時計回り [#r05fb3ab]
+基本的に時計回りの逆をたどるだけ。
+時間を細かく見る。

+スタート直後の曲がり角を曲がるためにスタートから,泙任聾鮑硬世覆靴離薀ぅ鵐肇譟璽垢鬚靴泙后
+,ら△慮鮑硬世魃曚┐襪泙任蓮交差点ありのライントレースをします。
+△慮鮑硬世忘討唳垢軍櫃るまでは内側を回るために交差点なしのライントレースをします。
+交差点を超える直前に交差点ありのライントレースになるように初めて△魃曚┐浸からの時間指定で切り替えます。
+そのまま3つの交差点を越え、➂の交差点を越えた時から交差点なしのライントレースに切り替えて再び時間を計り始めます。
+そのままい泙膿覆澆泙后
+➂からい泙任了間指定で缶を置く動作をします。
+そのまま交差点なしのライントレースを続けてゴールします。
*プログラム [#h30b0a79]

 #define BLACK1 38
 #define BLACK2 42
 #define WHITE1 45
 #define WHITE2 49
 #define BLACK1 38 //最も黒い部分のしきい値
 #define BLACK2 42 //そこそこ黒い部分のしきい値 
 #define WHITE1 45 //そこそこ白い部分のしきい値
 #define WHITE2 49 //最も白い部分のしきい値
 #define HIPOWER 7
 #define LOWPOWER 1
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_fwd set_power_H; OnFwd(OUT_AC);
 #define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C);
 #define turn_right1 set_power_L; OnFwd(OUT_A); Off(OUT_C);
 #define turn_left2 set_power_H; OnRev(OUT_A); OnFwd(OUT_C);
 #define turn_right2 set_power_H; OnFwd(OUT_A); OnRev(OUT_C);
 #define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C); //左に曲がる
 #define turn_right1 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右に曲がる
 #define turn_left2 set_power_H; OnRev(OUT_A); OnFwd(OUT_C); //左に旋回
 #define turn_right2 set_power_H; OnFwd(OUT_A); OnRev(OUT_C); //右に旋回
 #define STEP 1
 #define nMAX 2
 #define nMAX 4
 #define short_break Off(OUT_AC); Wait(100);
 #define CROSS_TIME 30
 #define cross_line  set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break;
 #define time1 1600
 #define time2 3400
 #define time3 4600
 #define time4 5400
 #define time5     

 ↑明るさなどの定数や右に曲がるなどの一連の動きを定義する

 task main() {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH); 
   int nOnline=0;
   ClearTimer(0);
   if(SENSOR_2 == 0) {
       OnRev(OUT_B);
        }
   
    while(FastTimer(0) <= time1){
       if(SENSOR_2 == 1){
         OnFwd(OUT_B);
       } if(SENSOR_1 < BLACK1) {
         turn_left2;
       } else if (SENSOR_1 < BLACK2) {
         turn_left1;
       } else if (SENSOR_1 < WHITE1) {
         go_fwd;
       } else if (SENSOR_1 < WHITE2) {
         turn_right1;
       } else { 
 	turn_right2;
 	}
      Wait(STEP);
    }


  ↑交差点の前まではただのライントレース               PlaySound(SOUND_LOW_BEEP);

  while(FastTimer(0) > time1) {
    while(FastTimer(0) <= time2) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_left2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_left1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_right1;
             } else {	   
          turn_right2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_right1; Wait(nMAX*STEP);
      cross_line;
      nOnline=0;
     }
   }

    ↑交差点を三つこえる          PlaySound(SOUND_LOW_BEEP);

  while(FastTimer(0) > time2) {
    while(FastTimer(0) <= time3) {
      while(nOnline < nMAX) {
      if(SENSOR_1 < BLACK1) {
        turn_left2;
      } else if (SENSOR_1 < BLACK2) {
        turn_left1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_right1;
      } else {
	turn_right2;
	}
      Wait(STEP);
    }


      ↑ここは輪の内側なので間違えて交差点と認識して一回転しないようにただのライントレースに直す           PlaySound(SOUND_LOW_BEEP);

  while(FastTimer(0) > time3) {
    while(FastTimer(0) <= time4) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_left2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_left1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_right1;
             } else {	   
          turn_right2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_right1; Wait(nMAX*STEP);
      cross_line;
      nOnline=0;
     }
   }

     ↑再び交差点ありに直す              PlaySound(SOUND_LOW_BEEP);


  while(FastTimer(0) > time4) {
    while(FastTimer(0) <= time5) {
      while(nOnline < nMAX) {
      if(SENSOR_1 < BLACK1) {
        turn_left2;
      } else if (SENSOR_1 < BLACK2) {
        turn_left1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_right1;
      } else {
	turn_right2;
	}
      Wait(STEP);
    }


        ↑ただのライントレース            PlaySound(SOUND_LOW_BEEP);
  


  Off(OUT_AC);
  Wait(100);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(150);
  Off(OUT_AC);
  OnRev(OUT_B);
  OnRev(OUT_AC);
  Wait(200);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(150);
 
    ↑缶を置く

    while(true){
      if(SENSOR_1 < BLACK1) {
        turn_left2;
      } else if (SENSOR_1 < BLACK2) {
        turn_left1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_right1;
      } else {
	turn_right2;
	}
      Wait(STEP);
    }
 }
 } 
  ↑ゴールする

 #define CROSS_TIME 30 //交差点を曲がる際に進む時間
 #define cross_line  set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; //交差点を曲がる動作
 #define time1 
 #define time2 
 #define time3 
 #define time4 
 #define time5
*苦労した点 [#z6491a08]
-輪の内側を走る際に交差点と認識して一回転してしまうことが多かった。
-輪の内側を走る際に交差点と認識して一回転してしまうので、それを改善する方法を考えるのが大変だった。
-缶が軽いのでタッチセンサーがなかなか反応しなかった。
-時間を計るときに、バッテリーの残量によって速さが変わってしまうのでちょうどいい時間を見つけられなかった。

*感想 [#t10a777a]
履修当初に想像していたよりもずっと大変で驚きました。~
チームで集まろうとしてもなかなか予定が合わずにしっかりと時間が取れなかったのが残念です。~
課題2ではうまくできるように頑張りたいと思います。~


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