Welcome!


*課題 [#n26bc92f]
所定のコースを一周する。但し、道中に置かれた缶は元あった場所に戻さなければならない。
*ロボットの説明 [#aaf182c5]
小回りが利くように車幅を限界まで狭め、ライトセンサも極力車体に近づけた。

又、タッチセンサの感度を良くする為、バンパーを設置した。
*プログラム [#c8a26b8b]
 #define THERESHOLD 47  // 閾値
 #define HIGHESTPOWER 7
 #define HIPOWER 2
 #define LOWPOWER 0
 #define set_power_HE SetPower(OUT_AC,HIGHESTPOWER);
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_forward set_power_H; OnFwd(OUT_AC);  // 直進
 #define turn_left1 set_power_L;\
   OnFwd(OUT_C); OnRev(OUT_A); // 左旋回
 #define turn_left0 set_power_L;\
   OnFwd(OUT_C); Off(OUT_A);  // 左折
 #define turn_right0 set_power_L;\
   OnFwd(OUT_A); Off(OUT_C);  // 右折
 #define turn_right1 set_power_L;\
   OnFwd(OUT_A); OnRev(OUT_C); // 右旋回
 #define STEP 1
 #define nMAX 35 // 通常のカーブとみなす時間の最大値
 #define short_break Off(OUT_AC); Wait(100); // 小休止
 #define cross_line go_forward set_power_H;\
   OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過
 #define go_forward1 OnFwd(OUT_AC); Wait(50);
 #define U_turn1 set_power_HE; OnRev(OUT_A);OnFwd(OUT_C);\
   Wait(145);  // 右半回転
 #define U_turn2 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A);\
   Wait(145); // 左半回転
 #define go_back OnRev(OUT_AC); Wait(50); // 後退
 
 
 sub line_trace() // ライントレース用プログラム
 {
       if (SENSOR_1 < THERESHOLD -4) {
         turn_right1;
       } else {
         if (SENSOR_1 < THERESHOLD -2) {
           turn_right0;
         } else if (SENSOR_1 < THERESHOLD +2) {
           go_forward;
         } else if (SENSOR_1 < THERESHOLD +4) {
           turn_left0;
         } else {
           turn_left1;
          }
 }            
 
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_TOUCH);
 
     ClearTimer(1);
 
  
   while (FastTimer(1) <= 1200) {
     
     line_trace();
     Wait(STEP);
   }
     if (SENSOR_2==1) { // タッチセンサが反応した場合、
     go_forward1; // 少し直進し、
     U_turn1; // 半回転し、 
     go_back; // 少し後退し、
     U_turn2; // 半回転してライントレースに戻る
    }
  }
 
   ClearTimer(0);
   ClearTimer(1);
 
 
 
   while (FastTimer(1) <= 5000) { 
     while (FastTimer(0) < nMAX) { // 黒を続けてnMAX秒認識しない場合、
                         通常のライントレースを行う
     line_trace();
     ClearTimer(0);
   }
     Wait(STEP);
   }
     turn_left1; Wait(nMAX); // 進行方向修正
     cross_line; // 交差点通過
     ClearTimer(0); // タイマーをリセット
     }
     ClearTimer(0);
     ClearTimer(1);
 
   while (true) {
     
     line_trace();
     Wait(STEP);
       }
     }
   }
 }
*反省 [#s7f7c576]
正確に線を辿ることが出来るに至ったものの、ターンの円滑さに欠けていたので、

よりスムースにカーブを曲がるようにプログラムを改良する必要があると思った。

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