目次

ロボットの説明

機能

  • 軽量化重視
  • しっかりと空き缶をつかむためのループ搭載()
  • 左右の重心を整えてある
    a1.jpg

攻略

  • 開始→T字路→空き缶をどかす→交差点→交差点→交差点→急カーブ→交差点→ヘアピン→T字路→終了 この順番で各課題をこなして、こなしたら次の課題を行うようにした。

プログラムの説明

#define VERY_WHITE THRESHOLD+7
#define WHITE THRESHOLD+3
#define THRESHOLD 53
#define BLACK THRESHOLD-2
#define VERY_BLACK THRESHOLD-8
#define SPEED_H 35
#define SPEED_L 25
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED_H,SPEED_H);
#define spin_left1 OnRL(SPEED_L+10,-SPEED_L);
#define turn_left0 OnRL(SPEED_L,0);
#define turn_right0 OnRL(0,SPEED_L);
#define spin_right1 OnRL(-SPEED_L,SPEED_L+10);
#define STEP 1
#define nMAX 240 //Time on black
#define short_break Off(OUT_AC);Wait(100);
#define CROSS_TIME 800 //Time to cross the line
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
#define start_time 8000 //Time to finish the T cross
#define swiching_time 5000 //Time to switch the side of the line
#define after_cross 7000 //Time to wait after crossing the third cross
#define Can_Move_Time 15000
#define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
#define Rev_U_Turn OnRL(-30,30);Wait(800);
#define Can_Move_Time 15000
#define Grave_Can Off(OUT_AC);OnFwd(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define Release_Can OnRev(OUT_B,40);Wait(500);Off(OUT_B);Wait(100);
#define U_Turn OnRL(30,-30);Wait(2800);Off(OUT_AC);Wait(100);
#define Rev_U_Turn OnRL(-30,30);Wait(800); 
task main()
{//1
  SetSensorLight(S3);
  int RUN=0;//main while() program
  int nOnline=0;//Black counter
  int CrossCount=0;//Counts of crossed lines
  int FinalSwitch=0;//Kill cross searching program
  long t0,t1,t2,t3 = CurrentTick();
 
  • 発信後は白と黒の境界線を"starting_time"だけなぞって進む。
         t1=CurrentTick();//Set t1
         while(CurrentTick()-t1<start_time){//While start_time
           if(SENSOR_3<VERY_BLACK){
           spin_left1;
           }
        else {//2'
           if(SENSOR_3<BLACK){
             turn_left0;
             }
           else if(SENSOR_3<WHITE){
             go_foward;
             }
           else if(SENSOR_3<VERY_WHITE){
             turn_right0;
             }
           else {
             spin_right1;
             }
           }
         }//End of "While start_time"
  • 空き缶を探すプログラムを始動
    while(SensorUS(S1)>10){    
      if(SENSOR_3<VERY_BLACK){
        spin_left1;
        }
      else {
        if(SENSOR_3<BLACK){
          turn_left0;
          }
        else if(SENSOR_3<WHITE){
          go_forward;
          }/
        else if(SENSOR_3<VERY_WHITE){
          turn_right0;
          }
        else {
          spin_right1;
          }
        }
      }
  • 空き缶をつかんである程度黒線をだどってから180°回転して空き缶を放し、再び180°回転する。
    Grave_Can; 
    t4=CurrentTick();//Set t4
    while(CurrentTick()-t4<Can_Move_Time){//Trace line for "Can_Move_Time"
      if(SENSOR_3<VERY_BLACK){
        spin_left1 OnRL(SPEED_L+5,-SPEED_L);Wait(1);
        }
      else {
        if(SENSOR_3<BLACK){
          OnRL(SPEED_L-5,0);Wait(1);
          }
        else if(SENSOR_3<WHITE){
          OnRL(SPEED_H-10,SPEED_H-10);Wait(1);
          }
        else if(SENSOR_3<VERY_WHITE){
          OnRL(0,SPEED_L-5);Wait(1);
           }
        else {
          OnRL(-SPEED_L,SPEED_L+5);Wait(1);
          }
        }
      }//END &#128;OF "Trace line for "Can_Move_Time""
      U_Turn;
      Release_Can;
      OnRev(OUT_AC,SPEED_H);Wait(500);Off(OUT_AC);Wait(100);//Set back for a moment
      Rev_U_Turn;//U turn
    }
	
  • ここからは交差点を意識して進行する。ちなみに"RUN"とは通常のライン・トレイスの間は0として、ライン・トレイスを終えるときに"RUN"が1となる。
    while(RUN==0){//Main Program
      while(nOnline<nMAX){//Basic cross finding
        if(SENSOR_3<VERY_BLACK){
          spin_left1;
          nOnline++;
          }
        else {
          if(SENSOR_3<BLACK){
            turn_left0;
            }
          else if(SENSOR_3<WHITE){
            go_forward;
          }
          else if(SENSOR_3<VERY_WHITE){
            turn_right0;
          }
          else {
            spin_right1;
          }
    	nOnline=0;
          }//6  
        }//4
         //End of Basic cross finding
      short_break;PlaySound(SOUND_CLICK);
      spin_right1;Wait(nMAX*STEP/2);
      cross_line;
      PlaySound(SOUND_UP);
      CrossCount +=1;
      nOnline=0;
  • 交差点を2つ通過した後、黒線の反対側の境界線をなぞるようにする。これは3つ目から4つ目の交差点の間の急なカーブを交差点と反応させないためである。
      while(CrossCount==2){//1'' Hit second cross line
      turn_right0;PlayTone(RE,1);Wait(1000);
      while(nOnline<nMAX){//Backwards cross finding
         if(SENSOR_3<VERY_BLACK){
           spin_right1;
           nOnline++;
           }
         else {
           if(SENSOR_3<BLACK){
             turn_right0;
             }
           else if(SENSOR_3<WHITE){
             go_foward;
             }
           else if(SENSOR_3<VERY_WHITE){
             turn_left0;
             }
           else {
             spin_left1;
             }
    	nOnline=0;
           }
        }//End of Backwards cross finding
      short_break;PlaySound(SOUND_CLICK);
      spin_left1;Wait(nMAX*STEP/2);
      cross_line;
      PlaySound(SOUND_UP);
      CrossCount +=1;
      nOnline=0;
    }//End of Hit second cross line
  • 交差点を3つ目通過
      while(CrossCount==3){// Hit third cross line
        while(nOnline<nMAX){//Backwards cross finding
          if(SENSOR_3<VERY_BLACK){
            spin_right1;
            nOnline++;
            }
          else {
            if(SENSOR_3<BLACK){
              turn_right0;
              }
            else if(SENSOR_3<WHITE){
              go_forward;
              }
            else if(SENSOR_3<VERY_WHITE){
              turn_left0;
              }
            else {
              spin_left1;
              }
    	 nOnline=0;
            } 
          }//End of Backwards cross finding
        short_break;PlaySound(SOUND_CLICK);
        spin_left1;Wait(nMAX*STEP/2);
        cross_line;
        PlaySound(SOUND_UP);
        FinalSwitch +=1;
        CrossCount +=5;
        RUN +=1;
        nOnline=0;
        }//End of Hit third cross line
      }//End of Main Program
  • 4つ目の交差点を通過。switch_time後にたどる黒の境界線を逆にする。
      while(FinalSwitch==1){//Hits final line
        PlaySound(SOUND_UP);
        t2=CurrentTick();
         while(CurrentTick()-t2<switching_time){//Ignore the cross program for "switching_time"
           if(SENSOR_3<VERY_BLACK){
             spin_right1;
             }
           else {
             if(SENSOR_3<BLACK){
               turn_right0;
               }
             else if(SENSOR_3<WHITE){
               go_forward;
               }
             else if(SENSOR_3<VERY_WHITE){
               turn_left0;
               }
             else {
            spin_left1;
            }
          }
        }
       spin_left1;Wait(400);
       nOnline=0;
       t3=CurrentTick();
       while(CurrentTick()-t3<after_cross){//While the "after_cross"
         if(SENSOR_3<VERY_BLACK){
           spin_left1;
           }
         else {
           if(SENSOR_3<BLACK){
             turn_left0;
             }
           else if(SENSOR_3<WHITE){
             go_forward;
             }
           else if(SENSOR_3<VERY_WHITE){
             turn_right0;
             }
           else {
             spin_right1;
             }
           }
         }//End of "While after_cross"
  • T字を意識した進行。
       while(nOnline<nMAX){//Final cross finding
         if(SENSOR_3<VERY_BLACK){
           spin_left1;
           nOnline++;
           }
         else {
           if(SENSOR_3<BLACK){
             turn_left0;
             }
           else if(SENSOR_3<WHITE){
             go_forward;
             }
            else if(SENSOR_3<VERY_WHITE){
              turn_right0;
              }
            else {
              spin_right1;
              }
    	 nOnline=0;
            }  
          }//End of "Final cross finding"
          PlaySound(SOUND_UP);
          FinalSwitch +=1;
          }//End of "Hits final line"
    
  • T字路にぶつかった後、スタート地点に戻る。
    go_forward;Wait(400);
    spin_left1;Wait(400);
    go_forward;Wait(400);
    spin_left1;Wait(3000);
    PlaySound(SOUND_DOWN);
    Off(OUT_AC);
    }//1

課題を振り返って

プログラムを書き込むにつれて、いくつかの原因がよくわからなかったバグに直面した。プログラムを何度も何度も見返して、時間のロスがどんどん大きくなってしまいました(中にはバッテリー残量が30%だけで止まってしまうものもありました)。そのため、空き缶を一つしかどかせず、マイナーな調整が必要であって完璧な走りを実現できませんでした。


添付ファイル: filea3.jpg 81件 [詳細] filea1.jpg 161件 [詳細] filea2.jpg 77件 [詳細] filerobo_pic_3.jpg 80件 [詳細] filerobo_pic_2.jpg 85件 [詳細] filerobo_pic_1.jpg 88件 [詳細] filephoto.jpg 87件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-12-30 (月) 17:46:49