目次

課題

光を追いかけ、光の動きが止まれば、その方向にブロックを投げつける。

*正確に光の方向を向くこと。
*光の方向にブロックを飛ばすこと。 

ロボット

DSC_0155.jpg
ロボットの真上から。

#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])




#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])




#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])


#ref(): Usage:([pagename/]attached-file-name[,parameters, ... ][,title])




DSC_0159.jpg
ロボットの裏側。シンプルだが頑丈にできている。

DSC_0160.jpg
できるだけ車体に近いように、最低限の部品で作った。

プログラム

#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 );	

}

難しかったところ&工夫したところ

1.初めは、センサーを黒線の上をたどるようにしたが、いったん黒線を外れると、元の位置に戻るのが難しかった。よって、黒線の外側にタッチセンサーがくるようにした。

2.カーブするときタイヤを微妙に逆回転させることによって、黒線をたどるようにした。

3.黒線をたどることはできたが、黒線から外れてしまった場合、元に戻すことが難しかった。そこで、五秒間直進した場合、ロボットにコースから外れたことを認識させ、黒線が見つかるまでバックし、黒線を見つけ次第、再び黒線をたどるようにした。

コメントをどうぞ



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-07-01 (火) 19:27:42