[[2008b/MemberOnly/進行状況A]]

*課題2:黒い線に沿って動くロボット [#haf54440]
**課題内容:各チームでコースに沿って動くロボットを以下の条件で作成せよ。 [#t47e2042]
・速さと正確さを追求すること。&br;
・交差点で優先側を走っていない場合には一時停止すること。&br;
・前方にいるもう1台のロボットと接触した場合には停止して相手のロボットが通過する、あるいは距離が離れるのを待つ。&br;
・コースを2周したら自動的に停止する。&br;

***とりあえずプログラム [#ded5e435]
 
void turn_right(int t ) {
*ロボットについて [#jd78204c]
今回使用したコースは写真のようなコースである。&br;
&ref(F1000005.JPG);&br;
**ロボット本体 [#e3cf986b]
ロボットの全体像はこのようになっています。
。&br;
&ref(F1000003.JPG);&br;

	OnFwd(OUT_A);
	OnRev(OUT_C);
	Off(OUT_A+OUT_C);}
センサーは光センサーにタッチセンサーを取り付けた形になっています。
。&br;
&ref(F1000002.JPG);&br;

void turn_left(int t ) {
光センサーは2つ使い、間隔はこの程度です。
。&br;
&ref(F1000007.JPG);&br;

	OnFwd(OUT_C);
	OnRev(OUT_A);
	Off(OUT_A+OUT_C);}
曲がりやすくするために後輪はキャスターにしました。
。&br;
&ref(F1000001.JPG);&br;

void go_straight(int t ) {

	OnFwd(OUT_A+OUT_C);
	Off(OUT_A+OUT_C);}

void go_back(int t ) {

	OnRev(OUT_A+OUT_C);
	Off(OUT_A+OUT_C);}

#define THRESHOLD 40

task main() {

	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
**プログラム [#l2593556]
今回は関数は前進する関数と後退する関数を用いた。&br;
***前進する関数 [#cf8730a9]
 void go_straight(int t ){	 //t/100秒間前進
            OnFwd(OUT_A+OUT_C);
            Wait(t);
            Off(OUT_A+OUT_C);
 }
***後退する関数 [#gac653ef]
 void go_back(int t ){          //t/100秒間後退
            OnRev(OUT_A+OUT_C);
            Wait(t);
            Off(OUT_A+OUT_C);
 }
***メインのプログラム [#s74015e9]
 #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を光センサーに設定
	
	while(1)
        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)
	 if(SENSOR_1<THRESHOLD)       //左の光センサーが値域より小さいとき
	  {
	  	OnFwd(OUT_C);
	      OnFwd(OUT_C);         //0,15秒間右に旋回
	      OnRev(OUT_A);
	      Wait(15);
	  }
	 else
	  {
	  OnFwd(OUT_A+OUT_C);
	  }
	
	 if(SENSOR_3<THRESHOLD)
	  {OnFwd(OUT_A+OUT_C);}       //左の光センサーが値域より大きいとき前進
	 if(SENSOR_3<THRESHOLD)      //右の光センサーが値域より小さいとき
	 {
	   OnFwd(OUT_A);
	   OnFwd(OUT_A);         //0,15秒間左に旋回
	   OnRev(OUT_C);  
	   Wait(15);
	 }
	 else
	 {
	  OnFwd(OUT_A+OUT_C);
	 }
	 {OnFwd(OUT_A+OUT_C);}      //右の光センサーが値域より大きいとき前進
	 
	 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))
	 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) //左と右両方のセンサーが値域より小さいとき
	 {
	 	Off(OUT_A+OUT_C);
	 	Wait(200);
               OnFwd(OUT_A+OUT_C);
               Wait(60);
	 	Off(OUT_A+OUT_C);    //一端止まって
	 	Wait(200);       //2秒間待って
	 	OnFwd(OUT_A+OUT_C);   //0,8秒間前進
	 	Wait(80);
	 }
	 else
	 {
	  OnFwd(OUT_A+OUT_C);
	 
	 {OnFwd(OUT_A+OUT_C);}     //そうでなければ前進
	 
	} 
	
	}	 
	 
	   Off(OUT_A+OUT_C);      //110秒経過したら音を鳴らしながら停止
	   PlaySound(SOUND_FAST_UP);
		 
	 }
	 
	}}
	
	}
***結果・問題点 [#b5534df4]
タッチセンサーに反応があってからその後の動作に問題があり、接触後の動きが良くなかった。後ろに下がってから、同じとこまで前進するようにしてあるので、その間に再び接触すると、タッチセンサーが働かないようになってしまっている。
接触がなければ黒線の上をうまく走っていた。しかし、交差点ではうまくいかない時がたまにあった。
センサーで時間を計って停止するようにしてあるので、厳密に2周したら止まるようにはなっていない。
***コメント [#udc4a3d8]
何かございましたらお願いします。

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


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS