- 追加された行はこの色です。
- 削除された行はこの色です。
[[2006a/C3/ロボコン]]
#define blackline 40
int frag;
sub linetrace (){
if ((SENSOR_1 <= blackline) && (SENSOR_3 <= blackline)){
OnFwd(OUT_A + OUT_C);
#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++; //fragを1足す
}
else{
if ((SENSOR_1 <= blackline) && (SENSOR_3 >= blackline)){
OnFwd (OUT_A);OnRev (OUT_C);
else{
if ((SENSOR_1 <= blackline) && (SENSOR_3 >= blackline)){ //センサー1のみが黒線を認識したとき
OnFwd (OUT_A);OnRev (OUT_C); //左折
}
if ((SENSOR_1 >= blackline) && (SENSOR_3 <= blackline)){
OnFwd (OUT_C);OnRev (OUT_A);
if ((SENSOR_1 >= blackline) && (SENSOR_3 <= blackline)){ //センサー3のみが黒線を認識したとき
OnFwd (OUT_C);OnRev (OUT_A); //右折
}
if ((SENSOR_1 >= blackline) && (SENSOR_3 >= blackline)) {
OnFwd (OUT_A + OUT_C);
if ((SENSOR_1 >= blackline) && (SENSOR_3 >= blackline)) { //センサー1、センサー3共に黒線を認識していないとき
OnFwd (OUT_A + OUT_C); //直進
}
}
}
sub hold_can (){
ClearMessage();
sub hold_can (){ //缶を受け取るときの動作を定義
ClearMessage();
until (Message() != 0);
if ( Message() == 1 ){
Wait(1000);
OnFwd(OUT_B);Wait(200);
OnRev(OUT_A+OUT_C);Wait(350);
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);
OnRev(OUT_B);
Wait (200);
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);
Wait(50); //0,5秒直進して缶を入れる
OnRev(OUT_A+OUT_C);
Wait(250);
}
sub go_straight (){
OnFwd (OUT_A+OUT_C);
}
sub go_down (){
OnRev (OUT_A+OUT_C);
}
sub turn_R (){
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(){
sub turn_r(){ //缶を持っていないときの右折を定義
Off(OUT_A+OUT_C);OnRev(OUT_A+OUT_C);Wait(007);OnFwd (OUT_A);Wait(130);
}
sub turn_L (){
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;
frag=0; //黒線の数を0とする
while (true){
if(frag==0){
hold_can();
turn_R();
frag=1;
if(frag==0){ //黒線を0本認識しているとき
hold_can(); //缶を受け取る
turn_R(); //右折
frag=1; //黒線の数を1とする
}
if (frag ==1|| 2||6||7||9){
linetrace ();
if (frag ==1||2||6||7||9){ //黒線を1,2,6,7,9本認識しているとき
linetrace (); //ライントレース
}
if (frag == 3){
OnFwd(OUT_A+OUT_C);Wait(30);
turn_L ();
frag = 4;
if (frag == 3){ //黒線を3本認識したとき
OnFwd(OUT_A+OUT_C);Wait(30); //0,3秒直進
turn_L (); //左折
frag = 4; //黒線の数を4本とする
}
if (frag == 4){
port_can();
turn_L();
frag=6;
if (frag == 4){ //黒線を4本認識しているとき
port_can(); //缶を離す
turn_L(); //左折
frag=6; //黒線の数を6本とする
}
if (frag == 8){
OnFwd(OUT_A+OUT_C);Wait(050);
turn_r ();
frag =9;
if (frag == 8){ //黒線を8本認識しているとき
OnFwd(OUT_A+OUT_C);Wait(050); //0,5秒直進
turn_r (); //右折
frag =9; //黒線の数を9本とする
}
if (frag == 10){
OnFwd(OUT_A+OUT_C);Wait(120);
Off(OUT_A+OUT_C);
Wait(80);
frag = 0;
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ずつ足した。