ロボットの紹介

  1. 上から見たロボット
    ロボット
  1. アームの部分(缶を挟むのに必要)
    ロボット
  1. 横から見たロボット(下のファイルより見てください)
  1. 下から見たロボット
    ロボット
  1. ロボットで少し工夫したところ
    ロボット

コース攻略法

コース
  1. まず缶をつかむまでの時間を測定し、缶をつかむまでのラインとレースのプログラムを作成する
  2. それから時間を何個か区切って、ライントレースの作成をするが、その時間と時間の間で音をならし、また、その時に缶をつかむようにモーターを回すようにした。そうしなければライントレースの振動で缶が倒れたり、アームの中からはみ出てしまうからである
  3. 交差点を通過するさいはカウンターをつけて同じうごきをnMAX繰り返したら交差点を通化するというプログラムにした
  4. 最後の缶を置くプログラムは缶を置く目標の地点にUターンした時につく(ライントレースをしていてその地点に達した時間ではなくその地点をこえてUターンした時にその地点に達するようにすること)時間を測定してその時間に超えたらUターンし缶をはなし、バックしてからまたUターンするようなプログラムを作成した

プログラムの説明

#define THRESHOLD 45 // しきい値を設定した
#define HIPOWER 7 // モーターを強く回す時のパワーの大きさ(直進するときに使用する)
#define LOWPOWER 3 // モーターを弱く回すときのパワーの大きさ(カーブするときにライントレースからはみ出ないように使用する)
#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); // 左折1(その場で曲がりやすい)
#define turn_left0 set_power_L ;\
  OnFwd(OUT_C);Off(OUT_A); // 左折0(その場で曲がりにくい)
#define turn_right0 set_power_L ;\
  OnFwd(OUT_A);Off(OUT_C); // 右折1(その場で曲がりにくい)
#define turn_right1 set_power_L ;\
  OnFwd(OUT_A);OnRev(OUT_C); // 右折0(その場で曲がりやすい)
#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; // 交差点を渡る
task main () {
	SetSensor(SENSOR_2, SENSOR_LIGHT);
	int nOnline=0; // カウンタに0を代入する
	ClearTimer(0); // タイマーをクリアする
 /* 黒を続けてnMAX回繰り返さない&タイマーが6秒を超えるまで通常のライントレースをする */
 while(FastTimer(0)<=600){
  while(nOnline < nMAX && FastTimer(0)<=600){
    
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++; // カウンタを1プラスする
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_left0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_right0;
   }else{
      turn_right1;
    }
    nOnline=0; // カウンタを0にする
    }
    Wait(STEP);
   }
 }
	arm_fwd;
	PlaySound(SOUND_CLICK); // 音を鳴らす
 /* 黒を続けてnMAX回繰り返さない&タイマーが16秒を超えるまで通常のライントレースをする */
while(FastTimer(0)<=1600){
  while(nOnline < nMAX && FastTimer(0)<=1600){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++; // カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -11){
     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);
   } 
 }
	PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす
	ClearTimer(0); // タイマーをリセット
	turn_right1;
	Wait(10);
	arm_fwd;

  /* 黒を続けてnMAX回繰り返さない&タイマーが12秒を超えるまで通常のライントレースをする */

while(FastTimer(0)<=1200){
  while(nOnline < nMAX && FastTimer(0)<=1200){
 
  
   if(SENSOR_2< THRESHOLD -15) {
      turn_right1;
      nOnline++; // カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -13){
     turn_right0;
   }else if(SENSOR_2< THRESHOLD -7){
    go_fwd;
   }else if(SENSOR_2< THRESHOLD +2){
     turn_left0;
   }else{
      turn_left1;
    }
    nOnline=0; // カウンタをリセット
    }
    Wait(STEP);
    }
 } 
	PlaySound(SOUND_DOWN); // 音を鳴らす
	turn_left1;
	Wait(10);
	arm_fwd;
 /* 黒を続けてnMAX回繰り返さない&タイマーが20秒を超えるまで通常のライントレースをする */
 while(FastTimer(0)<=2000){
  while(nOnline < nMAX && FastTimer(0)<=2000){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++; // カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -11){
     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);
   }
 }
	PlaySound(SOUND_LOW_BEEP); // 音を鳴らす
	turn_right1;
	Wait(20);
	arm_fwd;
 /* 黒を続けてnMAX回繰り返さない&タイマーが29秒を超えるまで通常のライントレースをする */
 while(FastTimer(0)<=2900){
  while(nOnline < nMAX && FastTimer(0)<=2900){
   if(SENSOR_2< THRESHOLD -15) {
      turn_right1;
      nOnline++; カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -13){
     turn_right0;
   }else if(SENSOR_2< THRESHOLD -7){
   go_fwd;
   }else if(SENSOR_2< THRESHOLD +2){
     turn_left0;
   }else{
      turn_left1;
    }
    nOnline=0; // カウンタをリセット
    }
    Wait(STEP);
    } 
  } 
	PlaySound(SOUND_FAST_UP);
	arm_fwd;
 /* 黒を続けてnMAX回繰り返さない&タイマーが45秒を超えるまで通常のライントレースをする */
 while(FastTimer(0)<=4500){
  while(nOnline < nMAX && FastTimer(0)<=4500){
   if(SENSOR_2< THRESHOLD -13) {
      turn_right1;
      nOnline++; // カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -11){
     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);
   }
  }  
/* 缶を話す作業 */
	PlaySound(SOUND_DOUBLE_BEEP); // 音を鳴らす
	turn_left1; Wait(275);
	arm_bwd;
	OnRev(OUT_AC); Wait(100);
	turn_left1; Wait(275);
 /* 黒を続けてnMAX回繰り返さない&タイマーが55秒を超えるまで通常のライントレースをする */
 while(FastTimer(0)<=5500){
  while(nOnline < nMAX && FastTimer(0)<=5500){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++; // カウンタを1プラス
   }else{
    if(SENSOR_2< THRESHOLD -11){
     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);
   }
     /* 交差点の通過 */
	short_break;
	turn_right1;Wait(nMAX*STEP);
	cross_line;
	nOnline=0; // カウンタをリセット
   }
}

まとめ


添付ファイル: filerobotics-2013a-mission1.jpg 287件 [詳細] fileimage (2).jpg 301件 [詳細] fileimage (5).jpg 309件 [詳細] fileimage (4).jpg 289件 [詳細] fileimage (3).jpg 298件 [詳細] fileimage(9).jpg 286件 [詳細] fileimage8.jpg 175件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-24 (水) 00:26:42