2011a

目次

課題の内容

次のような周回コース(黒い線)を動くロボットを作成せよ。

 1.直角のコーナーを通る

 2.直角のコーナーを通らない(近道する)

ただし互いに逆方向に周回すること。

メンバー紹介

 ロボットの紹介

1.jpg

1_2.jpg

1_1.jpg

ロボットはうまく曲がれるように本体を出来れば出来るほど小さく作りました。

センサーが一つだけなら線で外れた時また線を探しにくいので二つのセンサーを付きました。

それに、センサーが前で早く道を認識するように本体の前のほうに付着しました。

 図

zu.jpg

 プログラム

zu_2.jpg

#define THERSHOLD 44                   //閾値
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);             //tの時間の間前に行く
#define back(t) OnRev(OUT_A+OUT_C);Wait(t);      //tの時間の間後ろに行く
#define migi(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);  //tの時間の間右に曲がる
#define hidari(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t); //tの時間の間左に曲がる
#define off Off(OUT_A+OUT_C);             //止まる
int kousa=0;      //交差点を曲がる時使う関数    
int sen=0;       //線を探す時使う関数
int saigo=0;      //最後に止まる時使う関数
sub chika()      //近道を行く		
{
  OnFwd(OUT_A);
  OnRev(OUT_C);
  Wait(40);
  off;
}
task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);   //1番光センサを付ける
  SetSensor(SENSOR_3,SENSOR_LIGHT);   //3番光センサを付ける
   ClearTimer(1);
     while(true)
      {
	 start go_line;
	 until((kousa == 1) || (Timer(1) == 167) || (saigo == 1));
	 stop go_line;
	 if (Timer(1)==167)    //16.7秒になれば右に曲がって近道を探す。
	 {
	 	chika();
	 	continue;
	 }
	 else if (saigo == 1)
	 {
	 	break;
	 }			
	 start search;     //1番が黒とか3番が黒とかタイマーが15秒以上になれば探すのを止まる。
	 until((SENSOR_1 <= THERSHOLD) || (SENSOR_3 <= THERSHOLD) ||     (Timer(0)>=15));
	stop search;
	 if((SENSOR_1 <= THERSHOLD) || (SENSOR_3 <= THERSHOLD)) //二つのセンサー全部が線を認識した時
	 {
	 	kousa--;    //二つのセンサーが全部線を認識したら関数は1をひく
	 }
	 else if((Timer(0)>=15))
	 {  
          if(sen<1)           //線を探す関数が1より小さい時
           {
	             kousa--;      //交差点を探す時使う関数は1をひく
	 	     back(40);
	             hidari(0);
		     until(SENSOR_1 <= THERSHOLD);  //センサー1が黒になった時
	             off;
		     sen++;       //線を探す時の関数に1をたす
	   }
	   else if(sen>=1)       //線を探す関数が1以上の時
	   { 
	             kousa--;     //交差点を探す時使う関数は1をひく
		     back(40);
		     migi(0);
	             until(SENSOR_3 <= THERSHOLD);  //センサー3が黒になった時までする
		     off;
		    sen--;      //線を探す時の関数に1をひく
		}
	    }
        }
    off;
}			
task go_line()
{
    while(true){

 	if((SENSOR_1 >= THERSHOLD) && (SENSOR_3 >= THERSHOLD))
	{
		go(0);
	}           //1番が白、3番が白なら前に行く
	else if ((SENSOR_1 <= THERSHOLD) && (SENSOR_3 >= THERSHOLD))
	{
		hidari(0);
	}           //1番が黒、3番が白なら左に曲がる
	else if ((SENSOR_1 >= THERSHOLD) && (SENSOR_3 <= THERSHOLD))
	{
		migi(0);	
	}           //1番が白、3番が黒なら右に曲がる
	else if((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <= THERSHOLD))  //1番が黒、3番が黒なら音が出る。
    	{	
	    PlaySound(SOUND_DOUBLE_BEEP);
		ClearTimer(2);
		go(10);
		off;
		go(0);
		until(((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <= THERSHOLD)) || (Timer(2) >= 6));
		if((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <= THERSHOLD))
		{	
		   off;
		   saigo++;     
		   break;       //関数に1をたしてロボットを止める
		}
		else if(Timer(2) >= 6)
		{
		   kousa++;      //交差点に1をたす
		   off;
			} 
		}         
	}              
}
task search()
{
	ClearTimer(0);
	hidari(30);
	migi(65);
	hidari(40);
	off;
}

 反省&まとめ

前に行く

go_1.gif

二つのセンサーで1番のセンサーも白、3番のセンサーも白なら前に行くようにしまた。

センサーが黒い線を両方認識した場合、センサー1だけ認識した場合、センサー3だけ認識した場合、その他 このように四つの場合に分けましたが、うまく行きませんでした。

それで、その他の場合をセンサー両方が黒い線を認識しなかった場合と設定して見ましたがうまく行くことになりました。

曲がる

mawaru_1.gif

二つのセンサーの中で一つのセンサーが黒い線に引っかかったら引っかかった線の方向に曲がるようにした。

ロタリ

rotari.gif

ロタリを回るとき交差点の数を数えてするつもりだった。

でも交差点じゃない区域でもたまにセンサー二つがひとつの線を認識する時があって毎度変わるので関数を使った。

ロタリで一番目は0にしてこちを過ぎたら1を足すようにした。

次は反対に1を引くようにした。関数が0の時は左に回るように、関数が1の時は右に回るようにした。

近道

3.jpg

タイマーだけを使って近道を過ぎていく方法もあるけど私たちは一応タイマーを使ってその場所に行くようにした後センサーが道を探す方法にした。

到着点

4.jpg

到着して止まるようにする為に交差点が引き続いて再び表れたら消えるようにするつもりでしたが、そんなにすれば他の交差点で止まってしまう可能性があるので0.7秒ないに交差点が出たら止まるようにタイマーを使った。

最初は50で作動させましたがロボットが自分のㅏ影を線に認識してしまい、問題が発生しました。 それで確実に黒い線だけを認識するために数値を下がりました。

音がない時はロボットがどの作業を処理する途中に問題が発生したのか分かりにくくて、交差点に出会った時音が鳴るようにしました。

 コメントをお願いします



添付ファイル: filezu_2.jpg 249件 [詳細] filezu.jpg 248件 [詳細] file4.jpg 223件 [詳細] file3.jpg 257件 [詳細] filemawaru_1.gif 33件 [詳細] filego_1.gif 242件 [詳細] filerotari.gif 242件 [詳細] file1_2.jpg 283件 [詳細] file1_1.jpg 310件 [詳細] file1.jpg 302件 [詳細]

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