[[2008b/A2/課題2/メンバーページへ:http://yakushi.shinshu-u.ac.jp/robotics/?]]
*課題2 黒い線に沿って動くロボット [#g0e7cf73]

*目次 [#bbb662ff]

#contents

**1. 課題の概要 [#ffe6fdc2]

 各チームで作成したコースに沿って動くロボットの作成。ただし・・・

・速さと正確さの追求

・交差点で優先側を走っていない場合は一時停止

・前方のもう一台のロボットに接触した場合には、停止して相手のロボットが行き過ぎるか、距離が離れるのを待つ

・コースを2周したら自動的に止まる


**2. ロボット紹介 [#l346c357]

***ロボットの完成写真 [#j8dcbc75]
~完成した写真がこちら~
&ref(Image004.jpg,nolink);
&ref(Image008.jpg,nolink);
&br;正面
&ref(Image002.jpg,nolink);
&ref(Image006.jpg,nolink);
&br;側面
&ref(Image003.jpg,nolink);
&br;今のロボットと若干違うので、後日最新版の画像をupします。
&ref(Image007.jpg,nolink);

***ロボットの工夫した点 [#cba7dd30]
今回のロボットは課題1と同様の4輪を採用した。
~今回のロボットでの工夫点は、タッチセンサ用のバンパーである。
&br;おおまかな構成は本に載っているものと大差は無いが、2段にすることにより、より安定してタッチセンサを反応させることを可能にした。
&br;また、前輪を大きくすることで、スピードが上昇した。


***ロボットの改善点 [#n4d07154]

&br;コースを完走することができるようになったが、たまに脱線する恐れがあるので、
&br;安定してコースを完走させることが今後の課題となってくる。

**3. コース紹介 [#rec26116]

~今回自分たちが作成したコースは8の字を2つ合体させたようなコースにした。
&br;単純なコースではあるが、その分正確性、速さが求められる。
&br;コースの全体図
~少々お待ち下さい。後日upします。
&br;コースの全体~
&ref(Image005.jpg,nolink);
**4. プログラム [#w510e493]

***プログラムの紹介 [#raf7f73b]
今回作成したプログラムがこちら(完成度95%)
今回作成したプログラムがこちら(完成)

 #define A OUT_A     //OUT_Aの簡略
 #define  C OUT_C     //OUT_Cの簡略
 #define trace 39    //闘値
 #define A OUT_A     //OUT_Aの省略
 #define  C OUT_C     //OUT_Cの省略
 #define trace 39    //閾値


 task main(){	    
	SetPower(A+C,7);
	SetSensor(SENSOR_1,SENSOR_TOUCH);
	start line_trace;                               //光センサーのプログラムの開始
	while(true){
		if(SENSOR_1  == 1){
			stop line_trace;			//タッチセンサーに接触したときの反応
			OnRev(A+C); Wait(100);
			Off(A+C); Wait(300);
			start line_trace;
			
		}
	}
 }
 task main(){
	
	
	
 task line_trace(){     
	int i;		//停止用変数 i の宣言
	    	     
	int i;       //停止用変数iの宣言
	i = 0;
	SetSensor(SENSOR_1,SENSOR_TOUCH);  //センサー1をタッチセンサー宣言
	SetSensor(SENSOR_2,SENSOR_LIGHT);   //センサー2を光センサー宣言
	SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー3を光センサー宣言
	while(true){
	while(i < 5){	                  //停止用変数iが5より小さければ実行する
		if(SENSOR_2>trace){
			if(SENSOR_3>trace){        //共に白を感知したとき
			if(SENSOR_3>trace){        //センサーが共に白であるとき前に進む
				OnFwd(A+C);
				}               //前
			else{                         //センサー3が黒
 
				Off(C); OnFwd(A);   //左に曲がる
				}
			}               
			else{                         //センサー3が黒のとき左にまがる
				Off(C); OnFwd(A);   				
			}
		else{
			
			if(SENSOR_3>trace){        //センサー2が黒
				OnFwd(C); Off(A);   //右に曲がる
				}
			else{                         //共に黒を感知
		}	
		else{	
			if(SENSOR_3>trace){        //センサー2が黒のとき右にまがる
				OnFwd(C); Off(A);   
			}	
			else{                        //センサーが共に黒のとき
				Off(A+C); Wait(100);
				OnFwd(A+C); Wait(50);     //1秒停止、0.5秒前進
				i  = i + 1;      
                                        while(i == 5){   //変数iが5になったら停止させる
					Off(A+C);
					}
				OnFwd(A+C); Wait(150);	//1秒停止、1.5秒前進する
				i = i + 1;	//停止用変数iを1増加
				}	
			}
		if(SENSOR_1  == 1){
						//タッチセンサーが反応したとき1秒後退、3秒停止する
			OnRev(A+C); Wait(100);
			Off(A+C); Wait(300);
			
		}
	}
	if(i == 5){      //停止用変数iが5になったら停止する
		Off(A+C);
	}
 }


***プログラムの工夫点や改善点[#q6e62d57]
今回のプログラムは過去の作品を参考にtaskを2つにするプログラムを作成した。
今回、最初に作成したプログラムは過去の作品を参考にtaskを2つにするプログラムを作成した。
&br;taskを2つにすることでタッチセンサーが作動するとき、光センサーのプログラムを停止させ、誤作動を防ぐプログラムが簡単に作成できた。
&br;改善する点として、このプログラムでは変数iを使用し、停止線での止まる回数を利用して2周して止まるプログラムである。
&br;しかし、タッチセンサーが反応してしまうとこのプログラムでは、変数iのカウントが0に戻ってしまうため、2周で止まれなくなってしまう点がある。
&br;そのため、今後はタッチセンサーに反応しても2周して停止できようにプログラムを考える必要がある。
&br;1個目のプログラムでは変数iを使用し、停止線での止まる回数を利用して2周して止まるプログラムである。
&br;しかし、タッチセンサーが反応してしまうと1個目プログラムでは、変数iのカウントが0に戻ってしまうため、2周で止まれなくなってしまう点が問題であった。
&br;そこでtaskを2つから1つにまとめ改良を加えたのが、上にあるプログラム2個目である。
&br;2個目ではタッチセンサーに反応しても変数iがリセットされないため、無事に2周して停止することができた。
**5. 課題発表を終えて [#yc06013a]

~ここは課題発表が終わり次第更新の予定です。

~課題発表当日になって慌ててプログラムの2個目を作成して無事に動くかどうか不安だったが、無事に動いてくれて安心した。
&br;また、1個目のプログラムの問題であったタッチセンサーによる変数iのリセットもクリアしてプログラムは自分でも満足に動いてくれたと思った。
&br;あとは停止線で停止してから進むときに脱線しやすいので、そこの修正ができれば良いと思った。
*コメント [#l48d40b5]

~・コメントがあればどうぞ
#comment


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