#contents

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

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

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

*コース攻略 [#leb8b290]
#ref(2013a/Member/shu/Mission1/robo1.jpg,100%,コース攻略)
**反時計回り [#r05fb3ab]
+スタート直後の曲がり角を曲がるためにスタートから,泙任聾鮑硬世覆靴離薀ぅ鵐肇譟璽垢鬚靴泙后
+,ら△慮鮑硬世魃曚┐襪泙任蓮交差点ありのライントレースをします。
+△慮鮑硬世忘討唳垢軍櫃るまでは内側を回るために交差点なしのライントレースをします。
+交差点を超える直前に交差点ありのライントレースになるように初めて△魃曚┐浸からの時間指定で切り替えます。
+そのまま3つの交差点を越え、➂の交差点を越えた時から交差点なしのライントレースに切り替えて再び時間を計り始めます。
+そのままい泙膿覆澆泙后
+➂からい泙任了間指定で缶を置く動作をします。
+そのまま交差点なしのライントレースを続けてゴールします。
*プログラム [#h30b0a79]
 #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 STEP 1
 #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 
 #define time2 
 #define time3 
 #define time4 
 #define time5
 #define time1 1000
 #define time2 500
 #define time3 2000
 task main() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH); 
  int nOnline=0;
  int nCloss=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_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }
                              PlaySound(SOUND_LOW_BEEP);
    while(nCloss <= 0) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_right2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_left1;
             } else {	   
          turn_left2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     }
   } //一度交差点を曲がったら輪の内側での交差点誤認識を防ぐためしばらくライントレースのみ
 ClearTimer(0); //ここでタイマーをリセットして時間のズレを減らしたい
                              PlaySound(SOUND_LOW_BEEP); 
   while(FastTimer(0) <= time2){
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }
                              PlaySound(SOUND_LOW_BEEP);
 while((nCloss > 0)&&(nCloss <= 4)) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_right2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_left1;
             } else {	   
          turn_left2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     }
   } //ここからは交差点を曲がる必要がないのでライントレースに戻す
 ClearTimer(0);////ここでタイマーをリセットして時間のズレを減らしたい
                              PlaySound(SOUND_LOW_BEEP); 
 while(FastTimer(0) <= time3){
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      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);
                              PlaySound(SOUND_LOW_BEEP);
   while(true){   //ここからゴールまでは交差点なしのライントレース
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }
 }

*苦労した点 [#z6491a08]
-輪の内側を走る際に交差点と認識して一回転してしまうので、それを改善する方法を考えるのが大変だった。
-缶が軽いのでタッチセンサーがなかなか反応しなかった。
-時間を計るときに、バッテリーの残量によって速さが変わってしまうのでちょうどいい時間を見つけられなかった。

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


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