2008b/MemberOnly/進行状況A

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

課題内容:各チームでコースに沿って動くロボットを以下の条件で作成せよ。

・速さと正確さを追求すること。
・交差点で優先側を走っていない場合には一時停止すること。
・前方にいるもう1台のロボットと接触した場合には停止して相手のロボットが通過する、あるいは距離が離れるのを待つ。
・コースを2周したら自動的に停止する。

ロボットについて

今回使用したコースは写真のようなコースである。
F1000005.JPG

ロボット本体

ロボットの全体像はこのようになっています。 。
F1000003.JPG

センサーは光センサーにタッチセンサーを取り付けた形になっています。 。
F1000002.JPG

光センサーは2つ使い、間隔はこの程度です。 。
F1000007.JPG

曲がりやすくするために後輪はキャスターにしました。 。
F1000001.JPG

プログラム

今回は関数は前進する関数と後退する関数を用いた。

前進する関数

void go_straight(int t ){	 //t/100秒間前進
           OnFwd(OUT_A+OUT_C);
           Wait(t);
           Off(OUT_A+OUT_C);
}

後退する関数

void go_back(int t ){          //t/100秒間後退
           OnRev(OUT_A+OUT_C);
           Wait(t);
           Off(OUT_A+OUT_C);
}

メインのプログラム

#define THRESHOLD 40                      //閾値を40に設定
#define RUN_TIME 11000  //110s       //タイマーを110秒に設定
task main()
{
       SetSensor(SENSOR_1,SENSOR_LIGHT);  //センサー1を光センサーに設定
       SetSensor(SENSOR_2,SENSOR_TOUCH);  //センサ−2をタッチセンサーに設定 
       SetSensor(SENSOR_3,SENSOR_LIGHT);  //センサー3を光センサーに設定
	
       ClearTimer(0);           //タイマー0をクリア
	
       while(1)
       {
	
       while(FastTimer(0)<=RUN_TIME)    //タイマーが110秒になったら停止
	
       {
	
       if(SENSOR_2==1)           //タッチセンサーが反応したとき
	
       {
       Off(OUT_A+OUT_C);          //1秒間後退して5秒待って1秒間前進
       go_back(100);
	Wait(500);
	go_straight(100);
	
	}
	
	else
	
	{
	 
	 if(SENSOR_1<THRESHOLD)       //左の光センサーが値域より小さいとき
	  {
	      OnFwd(OUT_C);         //0,15秒間右に旋回
	      OnRev(OUT_A);
	      Wait(15);
	  }
	 else
	  {OnFwd(OUT_A+OUT_C);}       //左の光センサーが値域より大きいとき前進
	 if(SENSOR_3<THRESHOLD)      //右の光センサーが値域より小さいとき
	 {
	   OnFwd(OUT_A);         //0,15秒間左に旋回
	   OnRev(OUT_C);  
	   Wait(15);
	 }
	 else
	 {OnFwd(OUT_A+OUT_C);}      //右の光センサーが値域より大きいとき前進
	 
	 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //左と右両方のセンサーが値域より小さいとき
	 {
	 	Off(OUT_A+OUT_C);    //一端止まって
	 	Wait(200);       //2秒間待って
	 	OnFwd(OUT_A+OUT_C);   //0,8秒間前進
	 	Wait(80);
	 }
	 else
	 
	 {OnFwd(OUT_A+OUT_C);}     //そうでなければ前進
	 
	} 
	
	}	 
	 
	   Off(OUT_A+OUT_C);      //110秒経過したら音を鳴らしながら停止
	   PlaySound(SOUND_FAST_UP);
		 
	 }
	
	}

結果・問題点

タッチセンサーに反応があってからその後の動作に問題があり、接触後の動きが良くなかった。後ろに下がってから、同じとこまで前進するようにしてあるので、その間に再び接触すると、タッチセンサーが働かないようになってしまっている。 接触がなければ黒線の上をうまく走っていた。しかし、交差点ではうまくいかない時がたまにあった。 センサーで時間を計って停止するようにしてあるので、厳密に2周したら止まるようにはなっていない。

コメント

何かございましたらお願いします。

きちんと2周で止まらせる方法としては、両方のセンサが黒になった回数(交差点の数)を数えて、ある回数になった止まる方法や衝突した回数を数えてその分だけRun_timeをのばす方法があります。FI


添付ファイル: fileF1000008.JPG 243件 [詳細] fileF1000007.JPG 367件 [詳細] fileF1000006.JPG 205件 [詳細] fileF1000004.JPG 180件 [詳細] fileF1000003.JPG 336件 [詳細] fileF1000002.JPG 384件 [詳細] fileF1000001.JPG 334件 [詳細] fileIMG_1819.JPG 161件 [詳細] fileIMG_1818.JPG 195件 [詳細] fileIMG_1817.JPG 188件 [詳細] fileIMG_1816.JPG 197件 [詳細] fileIMG_1815.JPG 176件 [詳細] fileIMG_1814.JPG 170件 [詳細] fileF1000005.JPG 357件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-11 (木) 13:18:37