2011a

目次

課題の内容

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

  • 通常の交差点が2箇所以上ある
  • ロータリー型の交差点が1箇所以上ある (ロータリーでは反時計まわりに進む)
  • 直角に曲がるコーナーおよびそのコーナーをショートカットするコース(点線)が存在する
  • 急なヘアピンカーブが1箇所以上ある
  • スタート地点に目印がある
  • 黒い線の幅は15〜20mm程度 センサー、モーターはいくつ使ってもよい。プログラムは次の2つを作成すること。

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

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

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

メンバー紹介

  • ホン

 ロボットの紹介

1.jpg

1_2.jpg

1_1.jpg

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

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

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

 図

zu.jpg

 プログラム

  • ホン
    #define THERSHOLD 44
    #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);
    #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);
    #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
    #define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);
    #define off Off(OUT_A+OUT_C);
    int kousa=0; // ifを使った交差点通行。センサー両方が暗い線に当たるとこの変数は 1になって道を探し始まる。
    int sen=0; // センサー2つを使って線を探す変数、
    int saigo=0; //この変数は0が普通の状態で1になると最後の線に当たることを意味してとまる。
    task main()
    {
    	SetSensor(SENSOR_1,SENSOR_LIGHT);
    	SetSensor(SENSOR_3,SENSOR_LIGHT);
         ClearTimer(1);
    	while(true)
    	{       
                   start go_line;
    		until((kousa == 1) || (Timer(1) == 167) || (saigo == 1));
    		stop go_line;
    		if (saigo == 1)
    		{
    			break;
    		}			
    		start search;
    		until((SENSOR_1 <= THERSHOLD) || (SENSOR_3 <= THERSHOLD) ||     (Timer(0)>=15));
    		stop search;
    		if((SENSOR_1 <= THERSHOLD) || (SENSOR_3 <= THERSHOLD))
    		{
    			kousa--;
    		}
    		else if((Timer(0)>=15))
    		{
    			if(sen<1){
    				kousa--;
    				go_back(40);
    				turn_left(0);
    				until(SENSOR_1 <= THERSHOLD);
    				off;
    				sen++;
    			}
    			else if(sen>=1)
    			{
    				kousa--;
    				go_back(40);
    				turn_right(0);
    				until(SENSOR_3 <= THERSHOLD);
    				off;
    				sen--;
    			}
    		}
    	}
    	off;
     }			
     task go_line()
     {
    	while(true){
    		if((SENSOR_1 >= THERSHOLD) && (SENSOR_3 >= THERSHOLD))
    		{
    			go_straight(0);
    		}
    		else if ((SENSOR_1 <= THERSHOLD) && (SENSOR_3 >= THERSHOLD))
    		{
    			turn_left(0);
    		}
    		else if ((SENSOR_1 >= THERSHOLD) && (SENSOR_3 <= THERSHOLD))
    		{
    			turn_right(0);	
    		}
    		else if((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <= THERSHOLD))
        		{	
    			PlaySound(SOUND_DOUBLE_BEEP);
    			ClearTimer(2);
    			go_straight(10);
    			off;
    			go_straight(0);
    			until(((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <=   THERSHOLD)) || (Timer(2) >= 6));
    			if((SENSOR_1 <= THERSHOLD) && (SENSOR_3 <= THERSHOLD))
    			{	
    				off;
    				saigo++;
    				break;
    			}
    			else if(Timer(2) >= 6)
    			{
    				kousa++;
    				off;
    			} 
    		}
    	}
    }
    task search()
    {
    	ClearTimer(0);
    	turn_left(30);
    	turn_right(65);
    	turn_left(40);
    	off;
    }

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で作動させましたがロボットが自分のㅏ影を線に認識してしまい、問題が発生しました。 それで確実に黒い線だけを認識するために数値を下がりました。

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

 コメントをお願いします

  • 使用した変数の意味なども説明してください。 -- 松本 2011-06-24 (金) 13:05:40
  • 上はスペースがなくて‘反省&まとめ’のロたリ部分に書いてます。 -- ? 2011-07-11 (月) 22:18:39


添付ファイル: filezu_2.jpg 127件 [詳細] filezu.jpg 123件 [詳細] file4.jpg 118件 [詳細] file3.jpg 142件 [詳細] filemawaru_1.gif 136件 [詳細] filego_1.gif 131件 [詳細] filerotari.gif 121件 [詳細] file1_2.jpg 173件 [詳細] file1_1.jpg 185件 [詳細] file1.jpg 170件 [詳細]

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