目次

課題2:黒い線に沿って動くロボット

各チームで作成したコースを1周するロボットを製作せよ。
交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

  1. 空き缶をコース上に戻して再びコースに戻って進む
  2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

ただし、

メンバー

ロボット

F1000168.jpg
F1000169.jpg
←全体
センサ部分→

改良後

全体図

全体図b.jpg

上面

上面b.jpg

NQC本体を取り外した写真

下面

下面b.jpg

ほとんど本に載っていた基本ベースを元に作ってある。

前面

前面b.jpg

光センサを外した写真

アーム

アームb.jpg

タッチセンサ

タッチセンサb.jpg

光センサ

光センサb.jpg

その他に工夫した点

コース

コース

交差部分3つのシンプルなコース
ロボットが感知しやすいように、交差する部分を直角になるようにした。

プログラム

ヒデ 1.空き缶をコース上に戻して再びコースに戻って進む

#define THRESHOLD 47 // 閾値

#define TURN_TIME 222 // 半回転する時間

#define GO_TIME 100

#define BACK_TIME 100

#define LIMIT 5000 

task main(){

 SetSensor(SENSOR_1, SENSOR_LIGHT);
 SetSensor(SENSOR_3, SENSOR_LIGHT);
 SetSensor(SENSOR_2, SENSOR_TOUCH);
 ClearTimer(0);

  while(FastTimer(0)<LIMIT){                                    //タイマーのセット

	     start follow_line;                                 //ライントレースの開始
            until(SENSOR_2==1);	                                //タッチセンサが1になるまで
	     stop follow_line;                                  //ライントレース終了
	     OnFwd(OUT_A+OUT_C);                                //缶を移動したときに場所がずれないように前進
            Wait(160);   
            OnFwd(OUT_A);                                        //缶の移動
            OnRev(OUT_C);
	     Wait(TURN_TIME);
	     OnRev(OUT_A+OUT_C);                                 //缶をアームからはずす
	     Wait(BACK_TIME);
	     OnFwd(OUT_A);OnRev(OUT_C);                          //進行方向に戻る
	     Wait(TURN_TIME);
	     Off(OUT_A+OUT_C);
	     OnRev(OUT_A+OUT_C);                                 //ラインの上に戻る
            Wait(100);}


}

task follow_line(){

    while (true){
          if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){            //センサー1だけ黒
              OnFwd(OUT_C);OnRev(OUT_A);                             //左回転
          }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){      //センサー3だけ黒
              OnFwd(OUT_A);OnRev(OUT_C);                             //右回転
          }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){      //両方黒なら1秒止まって、0.5秒間前進して渡り切きる
			Off(OUT_A+OUT_C);
			Wait(100);
			OnFwd(OUT_A+OUT_C);
			Wait(50);
	  }else{
	      OnFwd(OUT_A+OUT_C);                                    //両方白なら前進
	  }
     }
}

最初、交差する部分を渡り切るまでに何度も止まってしまったので、交差点に行ったら前進するようにした。
閾値を黒い線を半分だけまたいだ時の値にして、無駄な動きを減らした。

ショウ 2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

#define THRESHOLD 47      //閾値(ラインから少しずれてる時)
#define THRESHOLD_B 40    //閾値2(ラインから大きくずれてる時)
#define TURN_TIME 222     //半回転する時間
#define GO_TIME 100       //交差点から抜け出す時間
#define BACK_TIME 100     //缶から遠ざかる時間
#define LIMIT 6000        //プログラムの稼働時間
int x=0;			//x=1→空き缶持ってる,x=0持っていない
task main(){

  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  ClearTimer(0);

   while(FastTimer(0)<LIMIT){
		start follow_line;                                 //ライントレースの開始
             until(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD);                        //交差点まで
		stop follow_line;						//ライントレース終了
		Off(OUT_A+OUT_C);						//交差点で1秒停止
		Wait(100);
		OnFwd(OUT_A+OUT_C);                             //交差点から出る
		Wait(GO_TIME);
		if(x==1){                                     //もし缶を持っているなら
			move();                               //缶を移動
		}
    }
    music();              //終わったら音楽を鳴らす
}

task follow_line(){       //ライントレースタスク
while (true){
          if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){           //センサ1だけ黒
              if(SENSOR_1<THRESHOLD_B){                           //ラインから大きくずれてる時
                     OnFwd(OUT_C);OnRev(OUT_A);                            //左回転
              }else{                                              //ラインから少しずれてる時
                     OnFwd(OUT_C);Float(OUT_A);                    //左に曲がる
              }
              Wait(3);
          }else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){     //センサ3だけ黒
              if(SENSOR_3<THRESHOLD_B){                           //ラインから
                     OnFwd(OUT_A);OnRev(OUT_C);                            //右回転
              }else{                                             //ラインから少しずれてる時
			OnFwd(OUT_A);Float(OUT_C);             //右に曲がる
	       }
	       Wait(3);
          }else{                                                //両方白もしくは両方黒
              OnFwd(OUT_A+OUT_C); Wait(3);                                  //前進
	   }
	  if(SENSOR_2==1){                  //空き缶に当たったらxを1にする
		x=1;
	  }
     }
}

sub move(){
       OnFwd(OUT_A);OnRev(OUT_C);              //缶を交差点に戻す
       Wait(TURN_TIME);
	OnRev(OUT_A+OUT_C);                     //後退して缶を巻き込まないようにする
	Wait(BACK_TIME);
	OnFwd(OUT_A);OnRev(OUT_C);              //進行方向へ回転
	Wait(TURN_TIME);
	OnRev(OUT_A+OUT_C);                     //ラインの上に移動
	Wait(BACK_TIME);
	Off(OUT_A+OUT_C);
	x=0;                                    //作業を終了したのでxを0にする
}                                   
			
sub music(){         //某RPGのレベルアップ音

	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(30);
	PlayTone(1047,10);
	Wait(30);
	PlayTone(1319,20);
	Wait(30);
	PlayTone(1175,44);

}

タスクを2つとサブルーチンを使い、メインタスクを1番前に持ってきたことで見やすくすっきりとしたプログラムになったと思う。
音楽を鳴らせるようにした
閾値を2段階に設定して、少し曲がっただけならFwdとFloat、かなり曲がるときはFwdとRevの組み合わせにし、その後にWait(3)を入れて効率よく進めるようにした。

感想

ヒデ

タッチセンサがうまく押せなくて、パーツをつけて調整したら逆に常に押してしまうようになったり調整が難しかった。今回のは考えるのが大変でした。

ショウ

音楽が意外とうまくいった。前回よりもロボット本体の製作が難しくて最初は思った通りに行かず、授業外に集まるなど大変だった。

コメント

コメントやアドバイスをお願いします



添付ファイル: file全体図b.jpg 220件 [詳細] file前面b.jpg 209件 [詳細] file上面b.jpg 252件 [詳細] file光センサb.jpg 206件 [詳細] file下面b.jpg 214件 [詳細] fileタッチセンサb.jpg 217件 [詳細] fileコードb.jpg 223件 [詳細] fileアーム接続部分b.jpg 296件 [詳細] fileアームb.jpg 208件 [詳細] file上面.jpg 148件 [詳細] file光センサ.jpg 134件 [詳細] file下面.jpg 120件 [詳細] fileアーム.jpg 150件 [詳細] file前面.jpg 144件 [詳細] file全体図.jpg 130件 [詳細] fileタッチセンサ.jpg 133件 [詳細] fileコード.jpg 106件 [詳細] fileアーム接続部分.jpg 131件 [詳細] fileF1000170.jpg 206件 [詳細] fileF1000169.jpg 198件 [詳細] fileF1000168.jpg 191件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-29 (木) 10:30:35