[[2009a]]
*課題2 ライントレースロボットを作る [#qcba8fc1]
A11L メンバー ダークホース ライス バビロン
#contents
**ロボット [#h779cce3]

***車体 [#p2c45fc8]
車輪は基本的に最初に作ったものに改良を加えたもの。~
最初に作ったロボットはなかなか小回りが利くため今回の課題にはもってこいだった。~
またセンサーを組み込みやすかったため比較的はやくロボットを完成させられた。~
#ref(./車体.jpg,130%,車体)

***タッチセンサー [#ibfeb330]
シングルバンパーを作成し、その先にアームを取り付けることにした。~
アームによって牛乳パックをキャッチし、運ぶことにしたがしかし、運ぼうと思っても牛乳パックが出てしまうことに気がつき改良を加えた。G型にすることにより、左旋回では出ないようになった、なので右旋回はできない。~
結果、いい感じに牛乳パックをキャッチできるようになった。~
#ref(./アーム.jpg,130%,アーム)
***光センサー [#s27b9c2c]
最初はかなり悩んだが、先端につけると重心が前になってしまうためタッチセンサーアームより後ろにつけることにした。~
センサー間を狭くすることによって、正確なライントレースが可能になった。~
#ref(./光センサー-1.jpg,130%,光センサー)
#ref(./20090612174757.jpg,130%,光センサー2)
#ref(./20090612174810.jpg,130%,光センサー3)

***完成 [#x5e75ece]
完成したがクワガタになった。~
なかなかの出来ではないだろうか。~
#ref(./20090612174743.jpg,130%,光センサー3)

**コース [#td8c7c25]
#ref(course2.JPG)~
コース1~
交差点:3~
紙の端や交差点が狭い。

**プロブラム [#ka9d6769]

***1:紙パックをキャッチした後、旋回し元の場所に戻し、また旋回してライントレースに戻る。 [#s1680104]
制作者:ダークホース~
~
定数・マクロの指定
 #define T 40                                                          //闘値を40に設定
 #define Run_time 1500                                                  //Run_timeを150秒に設定
 #define a OUT_A                                                       //OUT_Aをaと定義
 #define c OUT_C                                                       //OUT_Cをcと定義
 #define go_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);         //直進
 #define go_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);         //後退
 #define t_l(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);   //左旋回
 #define t_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);   //右旋回
メインプログラム
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーを1にセットする。
 SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーを2にセットする。
 SetSensor(SENSOR_3,SENSOR_LIGHT); //光センサーを3にセットする。
 ClearTimer(0);
 while(Timer(0) <= Run_time){     //150秒たったら止まるループ
	if(SENSOR_1>T){                  //光センサが2個とも白紙上にあるとき、直進
		if(SENSOR_3>T){
			OnFwd(a+c);
             	 }
		else{
			if(SENSOR_1>T){                  //左だけ白紙上にあるとき、右にターン
				OnFwd(a);
				Off(c);
   	         		}
 		}
 	}
	else{
		if(SENSOR_3>T){                  //右だけ白紙上にあるとき、左にターン
			OnFwd(c);
			Off(a);
             	}
		else{                            //両方線上にあるとき  1.0秒止まりし、1.0秒前進する。
			Off(a+c);
			Wait(100);
			OnFwd(a+c);
			Wait(100);
 		}
    
   	 }
	if(SENSOR_2 == 1);		    //タッチセンサーのが押されるか判断
		go_s(50);            //押されたら、0,5秒進み
		t_l(90);             //左に180度旋回
		go_b(50);            //0,5下がり、牛乳パックをおく
		t_l(90);             //左に180度旋回
	}



***2:迂回するパターンのプログラム [#c2d98e5f]
制作者:バビロン~
~
定数・マクロの指定
 #define BORDER 40                 //闘値を40に設定
 int x=0;                      //変数Xを定義

メインプログラム
 task main ()
 {
	
	SetSensor ( SENSOR_1, SENSOR_LIGHT );   //光センサーを1にセットする。
	SetSensor ( SENSOR_2, SENSOR_TOUCH );    //タッチセンサーを2にセットする。
	SetSensor ( SENSOR_3, SENSOR_LIGHT );    //光センサーを3にセットする。
	
	
	
	
	while (x < 3); //xが3になるまで下のプログラムをつづける
		
		if ( SENSOR_2 == 1 ){ //タッチセンサーが押されたとき
			OnRev(OUT_A+OUT_C); //バック
			Wait(50);
			Off(OUT_A+OUT_C);
			OnFwd(OUT_A);
			OnRev(OUT_C); //右を向く
			Wait(90);
			OnFwd(OUT_A+OUT_C);//直進
			Wait(100);
			OnFwd(OUT_C);
			OnRev(OUT_A); //左を向く(コースに平行)
			Wait(90);		
		            OnFwd(OUT_A+OUT_C); //直進
			Wait(100);
			OnFwd(OUT_C); //左を向く
			OnRev(OUT_A);
			Wait(90);		
		            OnFwd(OUT_A+OUT_C);//直進 この時点でパックの向こう側にいる
			Wait(100);
			OnFwd(OUT_A); //右を向く(コースの先に)
			OnRev(OUT_C);
			Wait(90);
 			x=x+1; //xに+1する
 		}
 		else{ //ライントレース
 			
  			if ( SENSOR_1 > BORDER ){
 				if ( SENSOR_3> BORDER ){
 					OnFwd(OUT_A+OUT_C);
 				}
 				else {
 					OnFwd(OUT_A);
 					Off(OUT_C);
 				}
 			}
 			else {
 				if ( SENSOR_3> BORDER ){
 					Off(OUT_A);
 					OnFwd(OUT_C);
  				}
 				
 			}
 		}
 }


***3:最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む [#vf690d40]
制作者:ライス~
~
 #define THRESHOLD 44    
 int a;
 task main ()
 {
 a=0;      
 SetSensor(SENSOR_1,SENSOR_LIGHT);  //光センサーを1にセットする。
 SetSensor(SENSOR_2,SENSOR_TOUCH);  //タッチセンサーを2にセットする。
 SetSensor(SENSOR_3,SENSOR_LIGHT);    //光センサーを3にセットする。
 while (a<20){ //aが20=三周するまで以下の動作をする
 
 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))  //光センサーが両方黒を感知した=交差点にきたとき
 {
 if((a==0)||(a==2)||(a==4)||(a==6)||(a==8)||
 (a==10)||(a==12)||(a==14)||(a==16)||(a==18)) //aが偶数の時
 {
 Off(OUT_A+OUT_C);
 Wait(100);
 OnFwd(OUT_A+OUT_C);
 Wait(50);
 OnFwd(OUT_A);  //右に曲がる
 OnRev(OUT_C);
 Wait(95);
 OnFwd(OUT_A+OUT_C); 
 Wait(35);
 a=a+1;
 }
 else{              //それ以外=aが奇数の時
 Off(OUT_A+OUT_C);
 Wait(105);
 OnFwd(OUT_A+OUT_C);
 Wait(50);
 OnFwd(OUT_C); //左に曲がる
 OnRev(OUT_A);
 Wait(100);
 OnFwd(OUT_A+OUT_C);
 Wait(40);
 a=a+1;
 }               //一度、以上のどちらかの動作を行ったらaに+1している
 
 if (SENSOR_1>THRESHOLD){    //通常ライントレース、他の人とほぼ同じなので説明は省く。                       
 OnFwd(OUT_A);
 OnRev(OUT_C);
 }
 if(SENSOR_3>THRESHOLD){     
 OnRev(OUT_A);
 OnFwd(OUT_C);
 }
 }
 Off(OUT_A+OUT_C);
 }
 
 		
*感想    [#m9e9b613]
今回の課題は例年に比べ難しかったと思う。
高校のころにマイコンカーをやっていてライントレースはやっていたが、まったく違う内容だった。まず、牛乳パックをいかに動かすかというところが難しかった。またプログラムもなかなか難しかった。

**コメント [#w23da78b]
- ロボットの説明はよくできています。カブトよりクワガタ?あとは、コースの画像が欲しいところです。また、プログラムは一人ひとつお願いします。 -- [[こさか]] &new{2009-07-02 (木) 23:13:19};
- 『関数の指定』と書いてあるところは『定数・マクロの指定』ですね。 -- [[松本]] &new{2009-08-07 (金) 14:34:37};
- 二つ目の課題ではどのようにしてロボットが止まるかが抜けています。三つ目に関しては、%(割り算の余りを出す演算子)を使った方が簡単に記述できます。また、int b;b=1;として交差点を通るごとに-1をかけて、bと0の大小により交差点においてどちらの命令を採用するか判定するという方法も考えられます。 -- [[FI]] &new{2009-08-08 (土) 05:03:29};
- FIさんも書かれてますが、やはり偶数・奇数の判定は、2で割った余り方式を採用していただきたいところです。 -- [[こさか]] &new{2009-08-10 (月) 00:20:25};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS