[[2018a/Member]]
*課題2 [#pb9c0a80]
与えられたコースに従った缶とロボットの移動
*コース [#f3c1a0b1]
コース2
*ロボット [#sb7c80fd]
#ref(S__50102275.jpg)
#ref(S__50102276.jpg)
課題1の経験を生かしてセンサーをできるだけ前輪に近づけた。
アームを取り付けると重心が前にいくため、超音波センサーを下につけて安定させた。&br;
アームは缶を安定して掴めるように頑丈なものにした。&br;
アームにタッチセンサーも取り付けていたが缶が軽過ぎて認識しないので取りはずした

*プログラミング [#r0450d6d]
**定義 [#o5d80ae2]
 #define THRESHOLD 50
光センサーの基準値を指定
 #define SPEED_H 25 
 #define SPEED_L 20
速さをそれぞれ指定
 #define OnRL(speedR,speedL)OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 #define go_forward OnRL(SPEED_H,SPEED_H);
 #define turn_left1 OnRL(SPEED_L+20,-SPEED_L-20);
 #define turn_left0 OnRL(SPEED_L,0);
 #define turn_right0 OnRL(0,SPEED_L);
 #define turn_right1 OnRL(-SPEED_L-20,SPEED_L+20);Wait(t);
直進、カーブ等の調整
 #define STEP 1
 #define short_break Off(OUT_BC);Wait(1000);
 #define CROSS_TIME 300
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
上記例外の動きを指定
**サブルーチン [#q281a59d]
名前を付けたが動きによって変えていったためルートと名前は参考にならない。&br;
交差点は黒の色で識別
 sub AtoJ(int t)
 {
 int n = 0;
 SetSensorLowspeed(S4);
   SetSensorLight(S3); 
    while(n < 1){              //缶を見つけるまで成り立つ
     if(SensorUS(S4) <= 7){                //缶が7�儖米發砲△襪伴孫�
       Off(OUT_BC);
       Wait(1000);
       go_forward;
       Wait(500);
       Off(OUT_BC);
       OnRev(OUT_A,50);
       Wait(1000);
       Off(OUT_A); 
       n++;
     }else{                //右トレース
       if (SENSOR_3 < THRESHOLD-14){
       turn_right1;
     }else if(SENSOR_3 < THRESHOLD-7){
        turn_right0;
     }else if(SENSOR_3 < THRESHOLD+7){
        go_forward;
     }else if(SENSOR_3 < THRESHOLD+10){
        turn_left0;
     }else if(SENSOR_3 < THRESHOLD+20){
        turn_left1;
      }else{
       turn_left1;
     }      
      Wait(STEP);
    }
   }
   n = 0;
 }
まずは右折するため、ラインの右側をトレース&br;
缶と超音波センサーとの距離が7�儖焚爾覗或覆靴憧未鬚弔�む。
 sub JtoL(int t)
 {
 int n = 0;
 int  nOnline=0;
 
 SetSensorLight(S3);
 

  while(n < 4){               //四回の交差点の間で成立
  
 
    if (SENSOR_3 < THRESHOLD-14){
         if(nOnline < 2){      //交差点を二つ無視するまで成立
           OnFwd(OUT_BC,30);     //交差点を認識すると前進
           Wait(200);
           nOnline++;
           n++;
           }else{                    //交差点を二回前進すると成立
     turn_left1;Wait(1500);          //Iの交差点とHの交差点を左折
     nOnline=0;
     n++;
     }
    }else{
     if(SENSOR_3 < THRESHOLD-7){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_right1;
    }else{
      turn_right1;
     }   
     nOnline=0;
     Wait(STEP);
   }

  }
  n=0;
  Off(OUT_BC);
  Wait(1000);
  turn_right1;              //次の右トレースのため右折しておく
 }
今度は左トレース。&br;
KとLで二回左折を無視し、Iで左折する
 sub LtoH(int t)
 {
 int n = 0;
 
 SetSensorLight(S3);

  while(n < 6){               //一回目の急カーブまで成立

    if (SENSOR_3 < THRESHOLD-14){
     turn_right1;
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+20){    //左トレースに移行できるように大回転
       turn_left1;Wait(420);/*電池依存*/
       n++;
    }else{
      turn_left1;
      n++;
      }
     Wait(STEP);
   }
  }
  n = 0;
 }
H以降の急カーブのため右トレース。
 sub HtoG(int t)
 {
 int n = 0;
 
 SetSensorLight(S3);

 while(n < 1){             //急カーブ後黒を認識するまで成立

    if (SENSOR_3 < THRESHOLD-14){
      cross_line;      
      n++;     
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_right1;
    }else{
      turn_right1;
      }
     Wait(STEP);
   }

  }
  n = 0;
 }
急カーブのため左トレース。&br;
次右トレースへ切り替えるため最後に右へ移行する。
 sub GtoD(int t)
 {
 int n = 0;
 
 SetSensorLight(S3);

  while(n < 2){            //交差点を二回右折するまで成立

    if (SENSOR_3 < THRESHOLD-14){   //交差点を認識したら右折
      Off(OUT_BC);
      Wait(1000);     
     turn_right1;
     n++;
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_left1;
    }else{
      turn_left1;
      }
     Wait(STEP);
   }

  }
  n = 0;
 }
右トレース。Gの交差点を右に曲がる。
 sub FtoD(int t) 
 {
 int n = 0;
 
  SetSensorLight(S3);
 

   while(n < 1){          //Eの交差点を無視するまで成立

    if (SENSOR_3 < THRESHOLD-14){  //Eを認識し直進
     OnFwd(OUT_BC,30);
     Wait(200);
     n++;
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_left1;
    }else{
      turn_left1;
      }
     Wait(STEP);
   }

  }
  n = 0;
 }
右トレース。Eの右折を無視し、缶を置くための準備
 sub DtoD(int t)
 {
 int n = 0;
 
  SetSensorLight(S3);

   while(n < 1){         //缶を置き、180°回転するまで成立

    if (SENSOR_3 < THRESHOLD-14){ //Dを認識すると置くべき場所に缶を置き180°回転
     turn_left1;Wait(t);
     OnRev(OUT_BC,30);
     Wait(t);
     Off(OUT_BC);
     OnFwd(OUT_A,50);
     Wait(1000);
     Off(OUT_A);
     OnRev(OUT_BC,30);
     Wait(90);
     Off(OUT_BC);
     turn_left1;
     Wait(t);
     n++;
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_left1;
    }else{
      turn_left1;
      }
     Wait(STEP);
   }

  }
  n = 0;
 }
方向転換して缶を置く。もう一度方向転換し直接次のカーブへ
  sub DtoC(int t)
 {
 int n = 0;
 
  SetSensorLight(S3);
 

   while(n < 2){           //Cの交差点とAの直進まで成立

    if (SENSOR_3 < THRESHOLD-14){     //黒を踏んだら直進
     Off(OUT_BC);
     Wait(1000);
     cross_line;
     n++;
    }else{ 
    if(SENSOR_3 < THRESHOLD-7){
      turn_right0;
    }else if(SENSOR_3 < THRESHOLD+7){
      go_forward;
    }else if(SENSOR_3 < THRESHOLD+10){
      turn_left0;
    }else if(SENSOR_3 < THRESHOLD+20){
       turn_left1;
    }else{
      turn_left1;
      }
     Wait(STEP);
   }

  }
  n = 0;
 }  
右トレース。急カーブ、そしてCの交差点を無視してAへ
**メイン [#r31b93c3]
 task main()
 {
  AtoJ(1350);
  turn_left1;
  Wait(1000);
  go_forward;
  Wait(500);
  Off(OUT_BC);
  JtoL(100);
  LtoH(100);
  turn_left0;
  Wait(3000);
  HtoG(100);
  turn_left0;
  Wait(400);
  GtoD(740);
  FtoD(100);
  DtoD(1500);
  DtoC(100);
  }
プログラムの実行。左右トレースの補助
*まとめ [#v24c0638]
急カーブとカーブと線の合流点が辛かった。特に急カーブではどうしても左右のトレースを切り替える必要があるため電池残量に左右されるため調整する必要があった。&br;
アームによる缶のキャッチ&リリースはすぐにできたのでよかった

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS