2006b/A6/RoBoCoN

プログラム

RCX1(走行系)

主に走行に必要なセンサーやモーターを集めた方です。
無駄が多くてやたら長いくせに上手くいきません;;

#define LIGHT 40

task main(){
  SetSensor(SENSOR_2,SENSOR_LIGHT); //センサ−2を左側の光センサーに定義
  SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を左側の光センサーに定義
  //OUT_A = 右タイヤ, OUT_C = 左タイヤ
  
  int i, x, TIME;
  
  /*威嚇モーション*/
  ClearMessage();
  ClearTimer(0);
  while(FastTimer(0) <= 30){
     SendMessage(1);  //掴む
  }
  Wait(10);
  ClearTimer(0);
  ClearMessage();
  while(FastTimer(0) <= 20){
     SendMessage(2);  //離す
  }
  Wait(20);
  ClearMessage();
  ClearTimer(0);
  while(FastTimer(0) <= 30){
     SendMessage(1);  //掴む
  }
  Wait(10);
  ClearTimer(0);
  ClearMessage();
  while(FastTimer(0) <= 20){
     SendMessage(2);  //離す
  }
  Wait(60);
  
  ClearMessage();
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_2 <= LIGHT);
  until(SENSOR_2 >= LIGHT);
  Wait(20);
  OnRev(OUT_C);
  until(SENSOR_3 <= LIGHT);
  OnFwd(OUT_C); OnRev(OUT_A);
  until(SENSOR_2 < LIGHT);
  
  for(i=0;i<=2;){  //一番奥の横棒に接触するまでライントレース
     if(SENSOR_3 <= LIGHT){
        if(i==0){
           OnFwd(OUT_C);OnRev(OUT_A); 
           until(SENSOR_2 < LIGHT);
           until(SENSOR_2 > LIGHT);
           OnFwd(OUT_C);Off(OUT_A);
           until(SENSOR_2 < LIGHT);
           i++;
        }
        else if(i==1){
           OnFwd(OUT_A+OUT_C); Wait(10);
           OnFwd(OUT_C);Off(OUT_A);
           until(SENSOR_2 < LIGHT);
           until(SENSOR_2 > LIGHT);
           until(SENSOR_2 < LIGHT);
           i++;
        }
        else if(i==2){
           i++;
        }
     }
     else if(SENSOR_2 <= LIGHT){
        OnRev(OUT_C);
     }
     else{
        OnFwd(OUT_A+OUT_C);
     }
  }
  /*ターゲットに向けて旋回*/
  OnFwd(OUT_A);OnRev(OUT_C);
  Wait(30);
  OnRev(OUT_A+OUT_C); Wait(20);
  OnFwd(OUT_A);OnRev(OUT_C);
  Wait(40);
  OnRev(OUT_A+OUT_C); Wait(20);
  OnFwd(OUT_A);OnRev(OUT_C);
  Wait(65);
  
  /*円の向かいの線までターゲットも持って行って、掴む*/
  OnFwd(OUT_A+OUT_C);
  Wait(100);
  until(SENSOR_2 < LIGHT);
  Off(OUT_A+OUT_C);
  ClearMessage();
  ClearTimer(0);
  while(FastTimer(0) <= 35){
     SendMessage(1);  //tukame
  }

  /*ラインに復帰*/
  OnFwd(OUT_C); OnRev(OUT_A); Wait(26);
  OnFwd(OUT_A+OUT_C);
  Wait(280);
  until(SENSOR_2 <= LIGHT);
   
 /*最後の横棒までライントレース*/
  for(i=0;i<=2;){
     if(SENSOR_3<= LIGHT){
        if(i<=1){
           OnFwd(OUT_A+OUT_C);
           Wait(10);
           OnFwd(OUT_C);OnRev(OUT_A);
           until(SENSOR_2 < LIGHT);
           i++;
        }
        else if(i==2){
           i++;
        }
     }
     else if(SENSOR_2 <= LIGHT){
        OnRev(OUT_C);
     }
     else{
        OnFwd(OUT_A+OUT_C);
     }
  }
  
  /*分かれ道まで進む*/
  OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_2<=LIGHT);
  Off(OUT_A+OUT_C);

  /*持っているものによって分かれ道の方向を選択*/
  ClearMessage();
  SendMessage(255);  //RCX2に識別を促す通信を出す
  until(Message() == 6 || Message() == 7);
  if(Message()==6){  //アルミ缶
     x=0;
     OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
     until(SENSOR_2<=LIGHT);
     while(Message()!=5){
        if(FastTimer(0) > 500){  /*ぶつかる程度で停止*/
           break;
        }
        else  if(SENSOR_2<=LIGHT){
           OnRev(OUT_C);
        }
        else{
        OnFwd(OUT_A+OUT_C);
        }
     }
     OnFwd(OUT_A); OnRev(OUT_C);
     Wait(15);
     OnFwd(OUT_A+OUT_C);
     Wait(10);
     Off(OUT_A+OUT_C);

    /*投下作業*/
     ClearMessage();
     ClearTimer(0);
     while(FastTimer(0) <= 30){
        SendMessage(1);  //掴む
     }
     Wait(20);
     ClearTimer(0);
     ClearMessage();
     while(FastTimer(0) <= 30){
        SendMessage(3);  //ウィリー(車体を持ち上げる)
     }
     Wait(20);
     OnFwd(OUT_A+OUT_C); Wait(50);
     Off(OUT_A+OUT_C);
     ClearTimer(0);
     ClearMessage();
     while(FastTimer(0) <= 20){
        SendMessage(2);  //離す
     }
     Wait(20);
     OnRev(OUT_A+OUT_C); Wait(10); 
     Off(OUT_A+OUT_C);
     ClearTimer(0);
     ClearMessage();
     while(FastTimer(0) <= 20){
        SendMessage(4);  //元に戻る
     }
  }
   
   else if(Message()==7){  //紙パック
     x=1;
     OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
     until(SENSOR_3<=LIGHT);
     ClearTimer(0);
     while(Message()!=5){
        if(FastTimer(0) > 500){  //ぶつかる程度で停止
           break;
        }
        else if(SENSOR_3<=LIGHT){
           OnRev(OUT_A);
        }
        else{
           OnFwd(OUT_A+OUT_C);
        }
     }
     OnFwd(OUT_C); OnRev(OUT_A);
     Wait(15);
     OnFwd(OUT_C+OUT_A);
     Wait(10);
      Off(OUT_A+OUT_C);
     ClearMessage();
     ClearTimer(0);
     while(FastTimer(0) <= 30){
        SendMessage(1);  //掴む
     }
     Wait(20);
      ClearMessage();
      while(FastTimer(0) <= 30){
        SendMessage(3);  //ウィリー開始
      }
     Wait(20);
     OnFwd(OUT_A+OUT_C); Wait(50);
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(2);  //離す
      }
      Wait(20);
      OnRev(OUT_A+OUT_C); Wait(10); 
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(4);  //元に戻る
      }
  }
  


↑ここまでが、一回目の運搬作業のプログラムです。
↓ここからは使えなかった(上手くいかなかった)二回目のプログラムです。

  Off(OUT_A+OUT_C);  //一時停止
  Wait(200);
  
  /*分岐点まで逆走で戻る*/
  if(x==0){  //アルミ缶の場合
     for(i=0;i==0;){
        if(SENSOR_3 <= LIGHT){
           OnFwd(OUT_C);
        }
        else if(SENSOR_2 <= LIGHT){
           OnFwd(OUT_C);  180°回転
           Wait(120);
           i++;
        }
        else{
           OnRev(OUT_A+OUT_C);
        }
     }
  }
  else if(x==1){  //紙パックの場合
     for(i=0;i<1;){
        if(SENSOR_2 <= LIGHT){
           OnFwd(OUT_A);
        }
        else if(SENSOR_3 <= LIGHT){
           OnFwd(OUT_A);
           Wait(120);  //180°回転
           i++;
        }
        else{
           OnRev(OUT_A+OUT_C);
        }
     }
  }

 /*スタート地点まで戻る*/
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_2 <= LIGHT);
  until(SENSOR_2 >= LIGHT);
  until(SENSOR_2 <= LIGHT);
  until(SENSOR_2 >= LIGHT);
  ClearTimer(0);
  until(SENSOR_2 <= LIGHT);
  TIME = FastTimer(0) / 2;
  until(SENSOR_2 >= LIGHT);
  Wait(TIME);

 /*90°回転*/   
  OnFwd(OUT_A); OnRev(OUT_C);
  Wait(110);
  
  
  
  /*以下からは一回目の逆を行きます*/
  ClearMessage();
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_3 <= LIGHT);
  until(SENSOR_3 >= LIGHT);
  Wait(20);
  OnRev(OUT_A);
  until(SENSOR_2 <= LIGHT);
  OnFwd(OUT_A); OnRev(OUT_C);
  until(SENSOR_3 < LIGHT);
  
  for(i=0;i<=2;){
     if(SENSOR_2 <= LIGHT){
        if(i==0){
           OnFwd(OUT_A);OnRev(OUT_C); 
           until(SENSOR_3 < LIGHT);
           until(SENSOR_3 > LIGHT);
           OnFwd(OUT_A);Off(OUT_C);
           until(SENSOR_3 < LIGHT);
           i++;
        }
        else if(i==1){
           OnFwd(OUT_A+OUT_C); Wait(10);
           OnFwd(OUT_A);Off(OUT_C);
           until(SENSOR_3 < LIGHT);
           until(SENSOR_3 > LIGHT);
           until(SENSOR_3 < LIGHT);
           i++;
        }
        else if(i==2){
           i++;
        }
     }
     else if(SENSOR_3 <= LIGHT){
        OnRev(OUT_A);
     }
     else{
        OnFwd(OUT_A+OUT_C);
     }
  }
  OnFwd(OUT_C);OnRev(OUT_A);
  Wait(30);
  OnRev(OUT_A+OUT_C); Wait(20);
  OnFwd(OUT_C);OnRev(OUT_A);
  Wait(40);
  OnRev(OUT_A+OUT_C); Wait(20);
  OnFwd(OUT_C);OnRev(OUT_A);
  Wait(60);
  
  OnFwd(OUT_A+OUT_C);
  Wait(100);
  until(SENSOR_2 < LIGHT);
  Off(OUT_A+OUT_C);
  
  ClearMessage();
  ClearTimer(0);
  while(FastTimer(0) <= 40){
     SendMessage(1);  //掴む
  }
        
  OnFwd(OUT_C); OnRev(OUT_A); Wait(20);
  OnFwd(OUT_A+OUT_C);
  Wait(250);
     
  for(i=0;i<=2;){
     if(SENSOR_3<= LIGHT){
        if(i<=1){
           OnFwd(OUT_A+OUT_C);
           Wait(10);
           OnFwd(OUT_C);OnRev(OUT_A);
           until(SENSOR_2 < LIGHT);
           i++;
        }
        else if(i==2){
           i++;
        }
     }
     else if(SENSOR_2 <= LIGHT){
        OnRev(OUT_C);
     }
     else{
        OnFwd(OUT_A+OUT_C);
     }
  }
  
  OnFwd(OUT_C); OnRev(OUT_A); Wait(50);
  OnFwd(OUT_A+OUT_C);
  until(SENSOR_2<=LIGHT);
  Off(OUT_A+OUT_C);

 /*持っているものによって分岐*/
  ClearMessage();
  SendMessage(255);
  until(Message() == 6 || Message() == 7);
  if(Message()==6){  //アルミ缶の場合
     x=0;
     OnFwd(OUT_C);OnRev(OUT_A);Wait(40);
     until(SENSOR_2<=LIGHT);
     while(Message()!=5){
        if(FastTimer(0) > 500){
           break;
        }
        else  if(SENSOR_2<=LIGHT){
           OnRev(OUT_C);
        }
        else{
           OnFwd(OUT_A+OUT_C);
        }
     }
     OnFwd(OUT_A); OnRev(OUT_C);
     Wait(15);
     OnFwd(OUT_A+OUT_C);
     Wait(10);
      Off(OUT_A+OUT_C);
      ClearMessage();
      ClearTimer(0);
      while(FastTimer(0) <= 30){
         SendMessage(1);  //掴む
      }
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 30){
        SendMessage(3);  //ウィリー開始
      }
     Wait(20);
      OnFwd(OUT_A+OUT_C); Wait(50);
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(2);  //離す
      }
      Wait(20);
      OnRev(OUT_A+OUT_C); Wait(10); 
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(4);  //元に戻る
      }
  }
  else if(Message()==7){  //紙パックの場合
     x=1;
     OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
     until(SENSOR_3<=LIGHT);
     ClearTimer(0);
     while(Message()!=5){
        if(FastTimer(0) > 500){
           break;
        }
        else if(SENSOR_3<=LIGHT){
           OnRev(OUT_A);
        }
        else{
           OnFwd(OUT_A+OUT_C);
        }
     }
     OnFwd(OUT_C); OnRev(OUT_A);
     Wait(15);
     OnFwd(OUT_A+OUT_C);
     Wait(10);
     Off(OUT_A+OUT_C);
     ClearMessage();
     ClearTimer(0);
     while(FastTimer(0) <= 30){
        SendMessage(1);  //掴む
     }
     Wait(20);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 30){
        SendMessage(3);  //ウィリー
      }
     Wait(20);
     OnFwd(OUT_A+OUT_C); Wait(50);
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(2);  //離す
      }
      Wait(20);
      OnRev(OUT_A+OUT_C); Wait(10); 
      Off(OUT_A+OUT_C);
      ClearTimer(0);
      ClearMessage();
      while(FastTimer(0) <= 20){
         SendMessage(4);  //元に戻る
      }
  }
  
  Off(OUT_A+OUT_C);
 /*終了*/
}




RCX2(技能系)

アームやウィーリーなどの特殊な機能が集約しています。
主にRCXの一つ目と通信することで効果を発揮します。

task main(){
  SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2を中央のタッチセンサーに定義
  SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を中央の光センサーに定義
  //OUT_A = アーム, OUT_C = ウィリー
  
  ClearMessage();
  
  int i=0;
  
  while(true){ 
     if(Message() == 1){  //アームで掴む動作
        OnRev(OUT_A);Wait(40);
        Off(OUT_A);
        ClearMessage();
        ;
     }
     else if(Message() == 2){  //アームで離す動作
        OnFwd(OUT_A);Wait(20);
        Off(OUT_A);
        ClearMessage();
     }
     else if(Message() == 3){  //ウィリー開始
        OnRev(OUT_C); Wait(20);
        Off(OUT_C);
        ClearMessage();
     }
     else if(Message() == 4){  //ウィリー終了
        OnFwd(OUT_C); Wait(12);
        Off(OUT_C);
        ClearMessage();
     }
     else if(SENSOR_2==1){   //衝突したら(持っている物が押されて接触)
        ClearTimer(0);
        while(FastTimer(0) <=50){
           SendMessage(5);
        }
     }
     else if(Message() == 255){  //RCX1から持っている物の識別の要請
        if(SENSOR_3<38){  //アルミ缶
           SendMessage(6);
        }
        else if(SENSOR_3>=38){  //紙パック
           SendMessage(7);
        }
        ClearMessage();
     }
  }
}

コメント

 何かご意見・ご感想がある場合はここにお書きください。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-09 (金) 17:09:11 (4578d)