ロボットの紹介

  • まずはロボットのサイズをできるだけ小さくすることに尽力した。
  • 光センサの高さをできるだけ低くすることでラインの中と外で 数値にはっきりとした差が現れるようにした。
  • タッチセンサをハサミより少し手前に出すことで反応しやすくした。
  • ハサミを噛みあいやすく作ることで運ぶ時の安定感を増した。

コースの攻略

時計回り

どうしても最初の交差点を認識出来ずに曲がってしまったので、最初の交差点直前まで ライントレースをし、1秒間直進する。その後再びライントレースを再開して交差点付近まで行く。 交差点に差し掛かる直前から交差点を認識するようにし、2つ交差点を渡った時点で再び純粋な ライントレースに切り替える。最後の交差点に差し掛かったらまた交差点を認識するようにし、 交差点を渡ったらまたライントレースに切り替える。 缶を置く地点をすぎるまでライントレースをする。 180度旋回し、缶を手放し、再び180度旋回して、ライントレースを再開する。 そのままゴールに向かう。

反時計回り

一つ目の交差点に差し掛かる直前までは、黒い線に入ったら左旋回、線を出たら右旋回をして ライントレースだけをして、交差点付近から交差点を認識するようにする。 左旋回を4回繰り返したら交差点であると判断し、交差点を渡る。 その後また純粋なライントレースに切り替え、再び交差点付近から交差点を認識するようにする。 今度は二回交差点を渡った時点で純粋なライントレースをし、4回目の交差点まで同様に渡る。 缶を置く地点を通り過ぎるまでライントレースをし、180度旋回して缶を手放す。そのまま少し バックしてまた180度旋回して、ライントレースを再開し、ゴールする。

プログラム

時計回り

#define BLACK1 36   //光センサーがこの値以下なら黒い線の中
#define BLACK2 38   //この値以下かつBLACK1以上なら黒い線の縁
#define WHITE1 46   //この値以下かつBLACK2以上なら線付近ギリギリ
#define WHITE2 50   //この値以下なら線付近。超えると線から遠い
#define HIPOWER 7   //モーターを動かす力の強さを調整する。
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);   //強い力でモーターを動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER);   //弱い力でモーターを動かす
#define go_fwd set_power_H; OnFwd(OUT_AC);   //前進する
#define turn_right1 set_power_L; Off(OUT_A); OnFwd(OUT_C);   //左に曲がる
#define turn_left1 set_power_L; OnFwd(OUT_A); Off(OUT_C);   //右に曲がる
#define turn_right2 set_power_H; OnRev(OUT_A); OnFwd(OUT_C);   //その場で時計回りに旋回
#define turn_left2 set_power_H; OnFwd(OUT_A); OnRev(OUT_C);   //その場で半時計回りに旋回
#define STEP 1   //一回の命令を継続する時間
#define nMAX 4   //この値の回数だけ時計回りの旋回を繰り返したら交差点
#define short_break Off(OUT_AC); Wait(100);   //一時停止
#define CROSS_TIME 30   //交差点を渡るのにかかる時間
#define cross_line  set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break;   //交差点 を渡る
#define time1 1650   //一つ目の交差点直前までの時間
#define time2 1000   //二つ目の円を回る時間
#define time3 1000   //交差点をすべてわたってから缶を置く地点までの時間

 ここまでで動作などを定義する。

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);   //光センサーを使用する
  SetSensor(SENSOR_2,SENSOR_TOUCH);   //タッチセンサーを使用する
  int nOnline=0;   //線の中ほどに入ると1増える関数
  int nCloss=0;   //交差点を渡ると1増える関数
  ClearTimer(0);   //タイマーを設定する
  if(SENSOR_2 == 0) {
      OnRev(OUT_B);   //ハサミを開く
     }

 センサーを設定し、関数を定義する。 また、ハサミを開いておく。

 while (FastTimer(0) <= time1){   //決めた時間まで繰り返す
      if(SENSOR_2 == 1){   //缶がタッチセンサーに触れたらハサミを閉じる
        OnFwd(OUT_B);
      } if(SENSOR_1 < BLACK1) {   //線の中ほどで旋回する
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {   //線の内側で曲がる
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {   //
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

 最初の交差点直前までライントレースする。

         Off(OUT_AC);
          PlaySound(SOUND_UP);
         OnFwd(OUT_AC);
         Wait(100);
                              PlaySound(SOUND_LOW_BEEP);

 最初の交差点は上手く判断出来なかったため、一秒間直進した。

while (nCloss <= 1) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
          turn_right2;
	   nOnline++;
           } else {
             if (SENSOR_1 < BLACK2) {
	       turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	       go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	       turn_left1;
             } else {	   
             turn_left2;
                }
           nOnline=0;
              }
          Wait(STEP);  
          }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     }
     ClearTimer(0);

 交差点を2つ渡る。

                     PlaySound(SOUND_LOW_BEEP);

while (FastTimer(0) <= time2){
        if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

 しばらくライントレースのみ。

                    PlaySound(SOUND_LOW_BEEP);

 while ((nCloss > 1)&&(nCloss <= 2)) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_right2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_left1;
              } else {	   
          turn_left2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     }ClearTimer(0);

 最後の交差点を渡る。

                              PlaySound(SOUND_LOW_BEEP);

while (FastTimer(0) <= time3){
        if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
       Wait(STEP);
    }

 缶を置く地点をすぎるまでトレースする。

                              PlaySound(SOUND_LOW_BEEP);

  Off(OUT_AC);
  Wait(100);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(180);
  Off(OUT_AC);
  OnRev(OUT_B);
  OnRev(OUT_AC);
  Wait(50);
  OnFwd(OUT_C);
  OnRev(OUT_A);
  Wait(180);

 缶を置く地点を通り過ぎたら180度旋回し、缶を手放す。  そして180度旋回してコースに戻る。

                              PlaySound(SOUND_LOW_BEEP);
   while (true){
        if(SENSOR_1 < BLACK1) {
        turn_right2;
       } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
 	turn_left2;
	}
      Wait(STEP);
    }

}

 ゴールする。

反時計回り

#define BLACK1 36
#define BLACK2 42
#define WHITE1 46
#define WHITE2 48
#define HIPOWER 7
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_fwd set_power_H; OnFwd(OUT_AC);
#define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C);
#define turn_right1 set_power_L; OnFwd(OUT_A); Off(OUT_C);
#define turn_left2 set_power_H; OnRev(OUT_A); OnFwd(OUT_C);
#define turn_right2 set_power_H; OnFwd(OUT_A); OnRev(OUT_C);
#define STEP 1
#define nMAX 4
#define short_break Off(OUT_AC); Wait(100);
#define CROSS_TIME 30
#define cross_line  set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break;
#define time1 1000
#define time2 500
#define time3 2000

 ここまでで動作、時間等を定義する。

task main() {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensor(SENSOR_2,SENSOR_TOUCH); 
  int nOnline=0;
  int nCloss=0; //交差点を曲がった数
  ClearTimer(0);
  if(SENSOR_2 == 0) {
      OnRev(OUT_B);
     }

 センサーの設定、関数の設定をする。  また、ハサミを開いておく。

 while(FastTimer(0) <= time1){
      if(SENSOR_2 == 1){
        OnFwd(OUT_B);
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

 交差点に差し掛かるまで、ただのライントレース。

                              PlaySound(SOUND_LOW_BEEP);

    while(nCloss <= 0) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_right2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_left1;
             } else {	   
          turn_left2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     
   }

    一度交差点を曲がったら輪の内側での交差点誤認識を防ぐためしばらくライントレース

   ClearTimer(0); //ここでタイマーをリセットして時間のズレを減らしたい
                              PlaySound(SOUND_LOW_BEEP); 

   while(FastTimer(0) <= time2){
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

                              PlaySound(SOUND_LOW_BEEP);

while((nCloss > 0)&&(nCloss <= 4)) {
       while(nOnline < nMAX){
          if(SENSOR_1 < BLACK1) {  
        turn_right2;
	  nOnline++;
          } else {
             if (SENSOR_1 < BLACK2) {
	  turn_right1;
             } else if (SENSOR_1 < WHITE1) {
	   go_fwd;
             } else if (SENSOR_1 < WHITE2) {
	   turn_left1;
             } else {	   
          turn_left2;
             }
       nOnline=0;
         }
          Wait(STEP);  
       }
      PlaySound(SOUND_UP);
      short_break;
      turn_left1; Wait(nMAX*STEP);
      cross_line;
      nCloss++;
      nOnline=0;
     }
   }

  ここからは交差点を曲がる必要がないのでライントレースに戻す

ClearTimer(0);//ここでもタイマーをリセットする。
                              PlaySound(SOUND_LOW_BEEP); 

while(FastTimer(0) <= time3){
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

  缶をおくところまで時間で指定

                              PlaySound(SOUND_LOW_BEEP);

  Off(OUT_AC);
  Wait(100);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(150);
  Off(OUT_AC);
  OnRev(OUT_B);
  OnRev(OUT_AC);
  Wait(200);
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(150);

                              PlaySound(SOUND_LOW_BEEP);

  缶を置いたら再びライントレースでゴールに向かう。

   while(true){
      } if(SENSOR_1 < BLACK1) {
        turn_right2;
      } else if (SENSOR_1 < BLACK2) {
        turn_right1;
      } else if (SENSOR_1 < WHITE1) {
        go_fwd;
      } else if (SENSOR_1 < WHITE2) {
        turn_left1;
      } else {
	turn_left2;
	}
      Wait(STEP);
    }

}

苦労した点

  1. 時間で区切っていたが、時間を測って調整している間に電池残量が減ってしまい、 丁度いい時間設定が出来なかった。
  2. 缶が軽くてタッチセンサーが上手く反応しなかった。

感想

グループで時間を合わせられず、大変だった。 課題2では、予定を確認しあい、効率的に作業を進めたい。


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