*ロボットの紹介とコース攻略 [#j5cdf78b]
#ref(2013a/Member/Jun/Mission2/robocon2013a_3.png,50%)
↑コース

-課題1と同様タイマーを使い細かく時間を区切り、時間の調節をしやすいようにプログラムした

-ロボット1…はじめにボールを缶に当てるロボット
#ref(2013a/Member/Jun/Mission2/DSC_0009_1_1.jpg,10%)
#ref(2013a/Member/Jun/Mission2/DSC_0011_1_2.jpg,10%)
#ref(2013a/Member/Jun/Mission2/DSC_0013_1_3.jpg,10%)
#ref(2013a/Member/Jun/Mission2/_36974_2_1.jpg,50%)
#ref(2013a/Member/Jun/Mission2/_36972_2_2.jpg,50%)
#ref(2013a/Member/Jun/Mission2/_36968_2_3.jpg,50%)

+ロボット2からボールをもらう位置に移動
+向きを調節し待機
+ボールを受け、向きを調節しパス
+ライントレースしボールを受け、またライントレース
+缶の前までライントレースしたらシュート
+後半はロボット2の前半と同様に動く

-ロボット2…はじめにボールを拾うロボット
#ref(2013a/Member/Jun/Mission2/_36974_2_1.jpg,50%)
#ref(2013a/Member/Jun/Mission2/_36972_2_2.jpg,50%)
#ref(2013a/Member/Jun/Mission2/_36968_2_3.jpg,50%)
#ref(2013a/Member/Jun/Mission2/DSC_0009_1_1.jpg,10%)
#ref(2013a/Member/Jun/Mission2/DSC_0011_1_2.jpg,10%)
#ref(2013a/Member/Jun/Mission2/DSC_0013_1_3.jpg,10%)



+ライントレースを繰り返し、ボールの前まで進む
+アームを上げボールをキャッチ
+再びライントレース
+パス、ライントレース、受けを繰り返す
+待機
+後半はロボット1と同様に動く
*プログラム説明 [#h70bcb3f]

-ロボット1

#define THRESHOLD 42  //しきい値の基準
#define HIPOWER 7
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define set_power_N SetPower(OUT_B,LOWPOWER);
#define go_fwd set_power_H; OnFwd(OUT_AC);
#define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B);  //アームを上げる
#define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);  //アームを下げる
#define turn_left1 set_power_L ;  //左旋回
  OnFwd(OUT_C);OnRev(OUT_A);
#define turn_left0 set_power_L ;  // 左回転
  OnFwd(OUT_C);Off(OUT_A);
#define turn_right0 set_power_L ;  //右回転
  OnFwd(OUT_A);Off(OUT_C);
#define turn_right1 set_power_L ;  //右旋回
  OnFwd(OUT_A);OnRev(OUT_C);
#define STEP 1
#define nMAX 3  //判断する最大値
#define short_break Off(OUT_AC); Wait(100);  //小休憩
#define CROSS_TIME 300  //交差点を通過する時間
#define cross_line set_power_L;  //交差点を通過
  OnFwd(OUT_A);OnRev(OUT_C);
  Wait(CROSS_TIME);short_break;

sub followline_l ()  //左側のライントレース
{
  int nOnline=0;
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
 
 
  PlaySound(SOUND_UP);
  MOVETIME=MOVETIME+600;
  
  while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
    
    if(SENSOR_2< THRESHOLD -14) {
       turn_left1;
       nOnline++;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_left0;
    }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
    }else if(SENSOR_2< THRESHOLD -1){
      turn_right0;
    }else{
       turn_right1;
     }
     nOnline=0;
     
     }
     Wait(STEP*10);
   }	
}

sub followline_r ()  //右側のライントレース
{
  int nOnline=0;
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
 
 
 MOVETIME=MOVETIME+600;
 PlaySound(SOUND_DOWN);
  
  while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
    
    if(SENSOR_2< THRESHOLD -14) {
       turn_right1;
       nOnline++;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_right0;
    }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
    }else if(SENSOR_2< THRESHOLD -1){
      turn_left0;
    }else{
       turn_left1;
     }
     nOnline=0;
     
     }
     Wait(STEP*10);
   }	
}

sub followline_l1 ()  //もうひとつの左側のライントレース
{   
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  MOVETIME=MOVETIME+450; 
  PlaySound(SOUND_LOW_BEEP);
  
  
  while(FastTimer(0)<=MOVETIME){
    if(SENSOR_2< THRESHOLD -14) {
       turn_left1;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_left0;
     }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
     }else if(SENSOR_2< THRESHOLD -1){
      turn_right0;
     }else{
       turn_right1;
      }
     Wait(STEP*10);
     }
  }
}
 
sub followline_r1 ()  //もうひとつの右側のライントレース
{   
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  MOVETIME=MOVETIME+150; 
  PlaySound(SOUND_CLICK);
  
  
  while(FastTimer(0)<=MOVETIME){
    if(SENSOR_2< THRESHOLD -14) {
       turn_right1;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_right0;
     }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
     }else if(SENSOR_2< THRESHOLD +1){
      turn_left0;
     }else{
      turn_left1;
      }
     Wait(STEP*10);
     }
  }
}

sub catch_1 ()  //ボールを拾う
{
       turn_right1;Wait(100);
       Off(OUT_AC);Wait(50);
       go_fwd;Wait(50);
       Off(OUT_AC);Wait(50);
       OnFwd(OUT_B);Wait(15);
       Off(OUT_B);Wait(10);
       turn_left1;Wait(100);
       Off(OUT_AC);Wait(50);

}

sub throw_1 ()  //ボールを投げる
{
       OnFwd(OUT_B);Wait(10);
       Off(OUT_B);Wait(10);
}

sub get_1()  //ボールを受ける
{
       OnFwd(OUT_B);Wait(10);
       Off(OUT_B);Wait(300);
       OnRev(OUT_B);Wait(40);Off(OUT_B);Wait(10);
} 

task main ()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);
 int nOnline;
 int MOVETIME;
  

       turn_left1;Wait(180);
       Off(OUT_AC);Wait(10);
       ClearTimer(0);

 while(FastTimer(0)<=150){
    followline_r1();
 }
       Off(OUT_AC);
       Wait(3500);
  
       turn_left1;Wait(80); 
	Off(OUT_AC);Wait(100);
       get_1();
       turn_left1;Wait(50);
       Off(OUT_AC);Wait(800);
       throw_1();
       turn_left1;Wait(80);
	Off(OUT_AC);Wait(10);
	 ClearTimer(0);      
    
 while(FastTimer(0)<=450){
    followline_l1();
 }
       Off(OUT_AC);
       Wait(50); 
       ClearTimer(0);

       turn_right1;Wait(120);Off(OUT_AC);Wait(10);
       get_1();
       turn_left1;Wait(130);Off(OUT_AC);Wait(10);
       ClearTimer(0); 

 while(FastTimer(0)<=600){
    followline_l();
 }
       Off(OUT_AC);
       Wait(50); 
      turn_left1;Wait(30);Off(OUT_AC);Wait(10);
     
       throw_1();
       turn_right1;Wait(100);Off(OUT_AC);Wait(10);
       ClearTimer(0);

 while(FastTimer(0)<=600){
    followline_l();
 }
       Off(OUT_AC);
       Wait(50); 
       ClearTimer(0);

       catch_1();

}

-ロボット2 

#define THRESHOLD 39  //基準のしきい値
#define HIPOWER 7
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define set_power_N SetPower(OUT_B,LOWPOWER);
#define go_fwd set_power_H; OnFwd(OUT_AC); //前進
#define throw set_power_H; OnFwd(OUT_B);  //投げる
#define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B);  //アームを上げる
#define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);  //アームを下げる
#define turn_left1 set_power_L ;  //左旋回
  OnFwd(OUT_C);OnRev(OUT_A);
#define turn_left0 set_power_L ;  //左回転
  OnFwd(OUT_C);Off(OUT_A);
#define turn_right0 set_power_L ;  //右回転
  OnFwd(OUT_A);Off(OUT_C);
#define turn_right1 set_power_L ;  //右旋回
  OnFwd(OUT_A);OnRev(OUT_C);
#define STEP 1
#define nMAX 200  //判断する最大値
#define short_break Off(OUT_AC); Wait(100);  //小休憩
#define CROSS_TIME 300  //交差点を通過する時間
#define cross_line set_power_L;  //交差点を通過
  OnFwd(OUT_A);OnRev(OUT_C);Wait(CROSS_TIME);short_break; 

sub followline_l ()  //左側をライントレース
{
  int nOnline=0;
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
 
 
  PlaySound(SOUND_UP);
  MOVETIME=MOVETIME+500;
  while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
    
    if(SENSOR_2< THRESHOLD -14) {
       turn_left1;
       nOnline++;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_left0;
    }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
    }else if(SENSOR_2< THRESHOLD -1){
      turn_right0;
    }else{
       turn_right1;
     }
     nOnline=0;
     
     }
     Wait(STEP*10);
   }
} 

sub followline_r ()  //右側をライントレース
{
  int nOnline=0;
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
 
 
 MOVETIME=MOVETIME+500;
 PlaySound(SOUND_DOWN);
  
  while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
    
     if(SENSOR_2< THRESHOLD -14) {
       turn_right1;
       nOnline++;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_right0;
    }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
    }else if(SENSOR_2< THRESHOLD -1){
      turn_left0;
    }else{
       turn_left1;
     }
     nOnline=0;
     
     }
     Wait(STEP*10);
   }	
} 

sub followline_l1 ()  //もうひとつの左側のライントレース
{  
   
  int MOVETIME;
  MOVETIME=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  MOVETIME=MOVETIME+500; 
  PlaySound(SOUND_LOW_BEEP);
  
  
  while(FastTimer(0)<=MOVETIME){
    if(SENSOR_2< THRESHOLD -14) {
       turn_left1;
    }else{
     if(SENSOR_2< THRESHOLD -10){
      turn_left0;
     }else if(SENSOR_2< THRESHOLD -7){
      go_fwd;
     }else if(SENSOR_2< THRESHOLD -1){
      turn_right0;
     }else{
       turn_right1;
      }
     Wait(STEP*10);
     }
  }
}

sub catch_1 ()  //もうひとつの右側のライントレース
{ 
	turn_right1;Wait(125);
	Off(OUT_AC);Wait(50);
	go_fwd;Wait(20);
	Off(OUT_AC);Wait(10);
	OnFwd(OUT_B);Wait(11);
	Off(OUT_B);Wait(10);
	go_fwd;Wait(170);
	Off(OUT_AC);Wait(1);
	OnRev(OUT_B);Wait(10);
	Off(OUT_B);Wait(50); 
	turn_left1;Wait(20);
	Off(OUT_AC);Wait(2);
}

sub throw_1 ()  //ボールを投げる
{
	throw;Wait(50);
	Off(OUT_B);Wait(10);
	
}

sub get_1 () //ボールを拾う
{
	OnFwd(OUT_B);Wait(10);
	Off(OUT_B);Wait(600);
	OnRev(OUT_B);Wait(50);
	Off(OUT_B);Wait(50);
}

task main ()
{
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);
 int nOnline;
 int MOVETIME;
 
 
 
 while(FastTimer(0)<=500){
    followline_l();
  }
	Off(OUT_AC);
	Wait(1); 
	ClearTimer(0);
	
 while(FastTimer(0)<=500){
    followline_l();
 }
	Off(OUT_AC);
	Wait(1); 
	catch_1();
	ClearTimer(0);
	
while(FastTimer(0)<=500){
    followline_l();
 }
	Off(OUT_AC);
	Wait(1); 
	ClearTimer(0);
	turn_right1;Wait(10);
	
	
 while(FastTimer(0)<=300){
  followline_l1();
 }
	Off(OUT_AC);Wait(1);
	ClearTimer(0);
	turn_left1;
	Wait(30);
	turn_right1;Wait(30);
	
 while(FastTimer(0)<=500){
  followline_r();
 }
 
	Off(OUT_AC);
	Wait(1);
	ClearTimer(0);


	
 while(FastTimer(0)<=500){
  followline_r();
 }
	Off(OUT_AC);
	Wait(1);
	ClearTimer(0);
	
	turn_left1;Wait(200);
	Off(OUT_AC);Wait(50);
	throw_1();	
	turn_right1;Wait(80);
	Off(OUT_AC);Wait(10);

	
 
 while(FastTimer(0)<=500){
  followline_r();
   }
	Off(OUT_AC);
	Wait(1);
	ClearTimer(0);
	
	
 while(FastTimer(0)<=500){
  followline_r();
 }
	Off(OUT_AC);
	Wait(1);
	PlaySound(SOUND_CLICK);
	ClearTimer(0);
	
	
	turn_left1;Wait(180);
	Off(OUT_AC);Wait(50);
	get_1();
	turn_right1;Wait(60);
	Off(OUT_AC);Wait(600);
	
	throw_1();
	Off(OUT_B);Wait(50);
	Off(OUT_AC);Wait(50);
}

*まとめ [#qc268b16]
-ライントレースをすべて時間で区切って操作していたため、調節することが大変だった。また、電池の残量にも気をつけなければならないので、非常に苦労した。
-時間が少しでもずれると2台のロボットの動きもすべてずれるので、安定してパスするということができなかった。
-結果的に私たちのチームは下から2番目の順位と残念ではあったが、みんなで協力した結果なのでしょうがない。

-このロボティクス入門ゼミは非常に難しい講義のように思えた。そして、多くのことを学ぶことができたので、これからの大学生活にいかしていきたい。

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