*ライントレースロボット [#oc0f9745]
目次
#contents


*課題 [#c1ecc07c]
 黒い線に沿って走るロボットの製作、ただし以下の事に注意する
~ 1 速さと正確さの追求
~ 2 交差点で優先道路を走ってない場合には、一時停止をする
~&ref(2007b/A5/課題2右/い.jpg);
~ 3 前方にあるロボットと衝突した場合、相手のロボットが離れるのを待つこと
*ロボット紹介 [#f3914037]
まずキャスターをつけ3輪駆動にする事にした。この方が曲がりやすく回転も容易にできると思ったからだ。
         バンパーはシングルバンパーにしてマシンのよけいな部分を剥ぎ落とした。

~&ref(2007b/A5/課題2右/車輪.jpg);   &ref(2007b/A5/課題2右/071204_165731.jpg);                                        &ref(2007b/A5/課題2右/全体.jpg);        
**光センサーの取り付け [#x4328df2]
~&ref(2007b/A5/課題2右/せんさ.jpg);               &ref(2007b/A5/課題2右/光2.jpg);
~2つの光センサーで黒い線を挟むような『挟み型』を採用
~メリットとして黒線からはみ出たときに反応が早い。比較的楽に曲がる事ができます
~デメリットとしては交差点に止まれの線がないと
光センサが認識しないという欠点があります。つまり全てのコースに対応するという訳でないということです。


**問題 [#re7e363d]
今回の課題で以下の問題が発生した
 1 急なカーブに対応できるか?
 2 交差点を通るために白を2つ認識するためのプログラムはどうするか?
 3 まっすぐに進まないマシン
~1の問題は我々の無計画なコース作りに問題があった。マシンの性能を知らずにコースを作ったので急なカーブ多く、交差点前でもカーブがある。急カーブでマシンが脱線してしまった。
~2ではプログラムとマシンの性能が影響を及ぼした。3の問題の通り我々のマシンはなぜか直進する事ができないのである。  なので最初センサーが黒を2つ認識しても直進しないので次の黒を認識しないでコースから外れる
**問題解決法 [#xe6c5767]
まず急カーブの問題を解決するためにマシンの幅を限界まで狭くした。こうする事で小回りを利かすようにしたのである。   また前方に駆動輪を設置することによって後方に設置するよりも早く反応し小回りの良さが上がった。            そしてカーブするときに片方のモーターを止める事で急カーブにも対応できるようにした。
(写真モーター)(写真前方林)
~2の問題は(小林書いて)
~直進できるようにするためにSetPowarをつかいモーターの速度の微調整をする事で解決した



*コース紹介 [#qa623e67]
~コースは全体的にカーブが多く2つの交差点を設けてある(直線がほとんどない)
~全体写真
~&ref(2007b/A5/課題2右/こーす.jpg);
~交差点前に急カーブがある。おかげでマシンの性能が問われるようなコースにした
~交差点写真
~&ref(2007b/A5/課題2右/こうさ.jpg);

*プログラム [#b7d4e8c8]
~アームセンサが反応した時に以下の3種類の対応を見せる 
**①3秒間停止して待つ [#l4544280]
**②その場で1回転だけ360度旋回する [#r276ca44]
**③180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る [#b1c0318f]
**①②③の複合 [#nc793bf8]
 #define THRESHOLD 40
 #define return_time 50
 int x,y=0;
 sub hurimuki(){
 	until (SENSOR_3<THRESHOLD);
	ClearTimer(0);
	while(Timer(0)<return_time){
	 	OnFwd(OUT_A);
	 	OnFwd(OUT_C);
		until(SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD );
	 	if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
	 		Off(OUT_A);
	 		OnFwd(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	 	}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
			 OnFwd(OUT_A);
			 Off(OUT_C);
  until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 	}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
 		Off(OUT_A+OUT_C);
 		Wait(200);
 		OnFwd(OUT_A+OUT_C);
		x=0;
 		while(x<3){
 		if(SENSOR_2==1){
 		break;
 			}
 		if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
 			until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD));
 			x++;
 			}else if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){
			until((SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 			}else if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
 			Off(OUT_A);
			OnFwd(OUT_C); 
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	 		x--;
			}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
			 OnFwd(OUT_A);
		 	Off(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 			x--;
 				}
 			}
 		}
 	}
 }
 void atattara(){
	if(y<=2){
 	Off(OUT_A+OUT_C);
 	Wait(300);
 	}else if(y>2&&y<=4){
 	OnFwd(OUT_A);
 	OnRev(OUT_C);
 	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
 		}
 	until(SENSOR_3<THRESHOLD);
 	until(SENSOR_3>THRESHOLD);
 	until(SENSOR_3<THRESHOLD);
 	}else {
 	OnFwd(OUT_A);
 	OnRev(OUT_C);
 	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
 		}
	hurimuki();
		OnFwd(OUT_A);
	 	OnRev(OUT_C);
 		until (SENSOR_3<THRESHOLD);
 	}
 }
 task main(){
      SetPower(OUT_A,7);
      SetPower(OUT_C,4);
 	SetSensor (SENSOR_1,SENSOR_LIGHT);
 	SetSensor (SENSOR_3,SENSOR_LIGHT);
 	SetSensor(SENSOR_2,SENSOR_TOUCH);
 while(true){
 		if(SENSOR_2==1){
 		atattara();
 		}
	 	OnFwd(OUT_A);
	 	OnFwd(OUT_C);
		until((SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD )||(SENSOR_2==1));
	 	if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
		Off(OUT_A);
	 	OnFwd(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 	}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
			 OnFwd(OUT_A);
			 Off(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
 		}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
 			Off(OUT_A+OUT_C);
 			Wait(200);
 			OnFwd(OUT_A+OUT_C);
 			x=0;
 			while(x<3){
 				if(SENSOR_2==1){
 					break;
 				}
 				if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){
	 			until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD)||(SENSOR_2==1));
 					x++;
 				}else if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
 					if(x<2){
 					until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
 					}else{
 					until((SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)||(SENSOR_2==1));
 					x++;
 					}
 				}else if((SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD)&&(x==2)){
	 				Off(OUT_A);
	 				OnFwd(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 				if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	 			until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
	 				x=3;
	 			}else if((SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD)&&(x==2)){
					OnFwd(OUT_A);
 			 		Off(OUT_C);  
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
					 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	 				until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
			x=3;
 				}
 			if(x==2){
 				y++;
 			}
 			}
 		}
 	}
 }
*まとめ [#c1c725bd]
**工夫したところ [#c394cd7d]
~みんなどんどんかいて
**苦労したところ [#u2355ff6]
~どんどんかいて
*感想 [#y34db20c]
書いて、どんどっm
*コメントをどうぞ [#y073999a]
#comment

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