2006a/C3/ロボコン

#define blackline 40           //ライトセンサーが黒線を認識するときの値を40とする
int frag;                //変数frag(黒線を認識した本数)の設定
sub linetrace (){            //ライントレースを定義
 if ((SENSOR_1 <= blackline) && (SENSOR_3 <= blackline)){    //センサー1とセンサー3が共に黒線を認識したとき
   OnFwd(OUT_A + OUT_C);        //直進
   Wait(030);
   frag++;               //fragを1足す
 }
 else{            
   if ((SENSOR_1 <= blackline) && (SENSOR_3 >= blackline)){    //センサー1のみが黒線を認識したとき
     OnFwd (OUT_A);OnRev (OUT_C);    //左折
   }
   if ((SENSOR_1 >= blackline) && (SENSOR_3 <= blackline)){    //センサー3のみが黒線を認識したとき
     OnFwd (OUT_C);OnRev (OUT_A);    //右折
   }
   if ((SENSOR_1 >= blackline) && (SENSOR_3 >= blackline))   {  //センサー1、センサー3共に黒線を認識していないとき
     OnFwd (OUT_A + OUT_C);       //直進
   }
 }
}
sub hold_can (){                       //缶を受け取るときの動作を定義
ClearMessage();                       
       until (Message() != 0); 
       if ( Message() == 1 ){     //メッセージ1を受け取ったとき
Wait(1000);              //10秒静止
OnFwd(OUT_B);Wait(200);        //アームを下ろす
OnRev(OUT_A+OUT_C);Wait(350);     //3,5秒後進
}
}
sub port_can (){           //缶を離す時の動作を定義
OnFwd(OUT_A+OUT_C);Wait(30);     //0,3秒直進
 OnRev(OUT_B);Wait (200);       //アームを上げる
 Off (OUT_B);
 OnFwd(OUT_A+OUT_C);
 Wait(50);              //0,5秒直進して缶を入れる
 OnRev(OUT_A+OUT_C);
 Wait(250);             //2,5秒後進
 }
sub turn_R (){           //右折を定義
 Off (OUT_A + OUT_C);OnRev (OUT_A+OUT_C);Wait (007);OnFwd  (OUT_A);Wait (150);Off (OUT_A+OUT_C);
}
sub turn_r(){            //缶を持っていないときの右折を定義
Off(OUT_A+OUT_C);OnRev(OUT_A+OUT_C);Wait(007);OnFwd  (OUT_A);Wait(130);
}
sub turn_L (){           //左折を定義
 Off (OUT_A + OUT_C);OnRev (OUT_C+OUT_A);Wait (007);OnFwd (OUT_C);Wait (130);Off (OUT_A+OUT_C);
}
 
task main(){
 SetSensor (SENSOR_1, SENSOR_LIGHT);
 SetSensor (SENSOR_3, SENSOR_LIGHT);
 frag=0;              //黒線の数を0とする
 while (true){
  if(frag==0){           //黒線を0本認識しているとき
  hold_can();            //缶を受け取る
  turn_R();             //右折
  frag=1;              //黒線の数を1とする
  }
     if (frag ==1||2||6||7||9){  //黒線を1,2,6,7,9本認識しているとき
       linetrace ();        //ライントレース
     }	
     if (frag == 3){        //黒線を3本認識したとき
     OnFwd(OUT_A+OUT_C);Wait(30);  //0,3秒直進 
       turn_L ();                  //左折
       frag = 4;          //黒線の数を4本とする
     }
     if (frag == 4){        //黒線を4本認識しているとき
       port_can();         //缶を離す
       turn_L();          //左折
       frag=6;           //黒線の数を6本とする
       }
       if (frag == 8){       //黒線を8本認識しているとき
       OnFwd(OUT_A+OUT_C);Wait(050); //0,5秒直進
       turn_r ();          //右折
       frag =9;           //黒線の数を9本とする
     }
     if (frag == 10){        //黒線を10本認識しているとき
         OnFwd(OUT_A+OUT_C);Wait(120);  //1,2秒直進
         Off(OUT_A+OUT_C);      
         Wait(80);         //0,8秒静止
          frag = 0;         //黒線の数を0本とする
     }
   }
   }

黒線を認識した本数で場合わけし、繰り返しを防ぐために一つの動作が終わるごとに本数を1ずつ足した。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-08-10 (木) 23:54:35