*目次 [#m9e8d242]
#contents
*課題 [#k6c01612]
各チームで作成したコースに沿って動くロボットを作成。
~
 *速さと正確さを追求すること 
 *交差点で優先側を走っていない場合には、一時停止すること 
 *前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと 
 *コースを3周したら自動的に止まること
*コース [#fb378ebe]
#ref(2008a/A8/課題2左/DSC000041.JPG)
#ref(2008a/A8/課題2左/DSC000041.jpg,CENTER)

*ロボット[#f1cda9ad]
#ref(2008a/A8/課題2左/DSC_0155.jpg,CENTER)
CENTER:ロボットの真上から。
~
~
#ref(2008a/A8/課題2左/DSC_0157.jpg,CENTER)
~
~
~
#ref(2008a/A8/課題2左/DSC_0158.jpg,CENTER)
~
~
~
#ref(2008a/A8/課題2左/DSC_0156.jpg,CENTER)
CENTER:タッチセンサー
CENTER:一つのタッチセンサーで、全面をカバーできるようにした。
~
#ref(2008a/A8/課題2左/DSC_0161.jpg,CENTER)
~
~
~
#ref(2008a/A8/課題2左/DSC_0159.jpg,CENTER)
CENTER:ロボットの裏側。シンプルだが頑丈にできている。
~
~
#ref(2008a/A8/課題2左/DSC_0160.jpg,CENTER)
CENTER:タッチセンサーの接合部分
CENTER:できるだけ車体に近いように、最低限の部品で作った。
~
~

*プログラム [#u5597e55]
 #define DEGREE_OF_LIGHT	40 
 #define STOP_TIME		100                  // 止まっている時間
 #define BACK_TIME		70     // 交差点で逆に行く時間 
 #define GO_TIME		150       // 交差点でまっすぐ行く時間 
 #define NUMOFCROSS		4*3    // コースの中にある交差点の数
 #define GO			0         
 #define BACK			1
 #define RIGHT			0
 #define LEFT			1
 #define AWARE			40			// コースを外れたと判断する時間
 
 int	iNumOfCross = 0;         // 走っている間に数える交差点変種
 int	iDirection = LEFT;         // 曲がっている方向 
 int	iGoOrBack = 0;          // 前進しているか後進しているか判断変種
 
 task main ( )
 {
 
 	SetSensor ( SENSOR_1, SENSOR_LIGHT );   // 光センサを設定
 	SetSensor ( SENSOR_2, SENSOR_TOUCH );  // タッチセンサを設定 
       SetSensor ( SENSOR_3, SENSOR_LIGHT );   // 光センサを設定
 	
 	PlaySound ( SOUND_UP );          
 	ClearTimer ( 0 );
 	
 	while ( iNumOfCross <=  NUMOFCROSS ) {     // 指定された交差点の数まで繰り返す
 		if ( SENSOR_1 > DEGREE_OF_LIGHT ) {      // 光センサ1が黒い線を見つかったら。。。
 			if ( SENSOR_3 > DEGREE_OF_LIGHT )  {		// 光センサ3が黒い線を見つかったら。。。	
 				if ( Timer ( 0 ) >=  AWARE) {      // 指定された時間まで何もしなくて行ったら               
                                                                                                               コースを外れたと判断する。
                                       // 黒い線を見つかるまでに後進する
 					until ( SENSOR_1 < DEGREE_OF_LIGHT ||
 						SENSOR_3 < DEGREE_OF_LIGHT ) {
 						OnRev ( OUT_A );
 						OnRev ( OUT_C );
 					}
 
 					if ( iDirection == RIGHT ) {
 						OnRev ( OUT_C );
 						OnFwd ( OUT_A );
 						Wait ( 30 );
 						until (  SENSOR_1 > DEGREE_OF_LIGHT &&
 							SENSOR_3 > DEGREE_OF_LIGHT ) {
 							OnRev ( OUT_C );
 							OnFwd ( OUT_A );
 						}
 					}
 					else {
 						OnRev ( OUT_A );
 						OnFwd ( OUT_C );
 						Wait ( 40 );
 						until (  SENSOR_1 > DEGREE_OF_LIGHT &&
 							SENSOR_3 > DEGREE_OF_LIGHT ) {
 							OnRev ( OUT_A );
 							OnFwd ( OUT_C);
 						}
 					}
 					
 					ClearTimer ( 0 );
 				}
                                 // 前進する	 
 				OnFwd ( OUT_A );
 				OnFwd ( OUT_C );
 			}			
 			else {
                               //右に曲がる
 				iDirection = RIGHT;
 				OnRev ( OUT_C );
 				OnFwd ( OUT_A );
 				Wait ( 10 );
 				ClearTimer ( 0 );
 
 			}
 		} 
 		else {
                        // 左に曲がる
 			if ( SENSOR_3 > DEGREE_OF_LIGHT ) {
 				iDirection = LEFT;
 				OnFwd ( OUT_C );
 				OnRev ( OUT_A );
 				Wait ( 10 );
 				ClearTimer ( 0 );
  				
 			}
 			else {
                               //交差点を見つかったとき
 
                               // 指定された交差点の数だったらここで止まる
 				if ( iNumOfCross == NUMOFCROSS ) {
 					break;
 				}
 
                               //前進するとき交差点を見つかったら少し止まった後で出発
 				if ( iGoOrBack == GO ) {
 					iNumOfCross++;
 					OnRev ( OUT_A );
 					OnRev (  OUT_C );
 					PlaySound ( SOUND_DOUBLE_BEEP );
 					Wait ( BACK_TIME );
 					Off ( OUT_A );
 					Off ( OUT_C );
 					Wait ( STOP_TIME );
 					OnFwd ( OUT_A );
 					OnFwd ( OUT_C );
 					Wait ( GO_TIME );
 					ClearTimer ( 0 );
 				} 				
 			}
 		}
  		
               // トッチセンサに何かぶつかったら少し止まった後で出発
 		if ( SENSOR_2 == 1 ) {
 			Off ( OUT_A );
 			Off ( OUT_C );
 			PlaySound ( SOUND_CLICK );
 			Wait ( STOP_TIME );
 		}
 	}	
 	
        // コースを走ることが終わったら止まる
 	Off ( OUT_A + OUT_C );
 	PlaySound ( SOUND_LOW_BEEP );	
 
 }





*難しかったところ&工夫したところ [#c384cee6]
~1.初めは、センサーを黒線の上をたどるようにしたが、いったん黒線を外れると、元の位置に戻るのが難しかった。よって、黒線の外側にタッチセンサーがくるようにした。
~2.カーブするときタイヤを微妙に逆回転させることによって、黒線をたどるようにした。
~3.黒線をたどることはできたが、黒線から外れてしまった場合、元に戻すことが難しかった。そこで、五秒間直進した場合、ロボットにコースから外れたことを認識させ、黒線が見つかるまでバックし、黒線を見つけ次第、再び黒線をたどるようにした。
*コメントをどうぞ [#qa4f7958]
#comment

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