2010b

第三回課題〜ライントレースと砲撃〜

課題概要

1.光センサーを一つだけ用いて、ライントレースして逃げつづける。その際、ロボット後部にはもう一つセンサーをつけ、常に光を発するようにする。

2.前者のロボット後部の光センサーから発せられる光を検出し逃げるロボットを追いかけて、届くところまで着たら弾代わりの黄色いホイールを逃げるロボットめがけて投げつける。

メンバー紹介

ポイント

つまり、最初に検出した光の強さを仮の最大値とし、ロボットを回転させる、そこで、もし次に検出された光の値が仮の最大値よりも大きかった場合には、最初に決定した仮の最大値を次に出てきた光の強さの値に入れ替える。これを一回転やることで、最大値を決定する。

ロボット紹介

マシン全体

DSCN0470.JPG
DSCN0471.JPG
DSCN0456.JPG

駆動部

DSCN0466.JPG

弾送り機構

DSCN0459.JPG

砲撃機構

DSCN0465.JPG

コース紹介

DSCN0450.JPG

プログラミング紹介

#define right OnFwd(OUT_A);Wait(search_time);Off(OUT_A);    //右に曲がる動きを定義
#define left OnRev(OUT_A);Wait(search_time);Off(OUT_A);   //左に曲がる動きを定義
#define search_time 2           //左右に首を振る時間を0.02秒と定義
#define THRESHOLD 45            //閾値を45と定義

task_main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサー1を光センサーと宣言
	SetSensor(SENSOR_3,SENSOR_LIGHT);   //センサー2を光センサーと宣言
 	while(true)
		{
			if(SENSOR_1<THRESHOLD)   //センサー1の値が閾値より小さい、すなわち黒線上の場合…↓
				{
					right;   //右に曲がる
					until(SNESOR_1>THRESHOLD);  //センサー1が閾値より大きい、すなわち黒線外になったら…↓
					left;   //左に曲がる
				}
		}        //これを繰り返す。
}
int Light_max;           //Light_maxという変数を定義


sub tamaokuri_tobasu()              //弾を装填して飛ばすサブルーチン
{
	SetPower(OUT_B,1);         //モーターBの馬力を1(最小)に設定
	SetPower(OUT_C,7);                  //モーターCの馬力を7(最大)に設定
	while(true)
	{
		if(SENSOR_1 == Light_max)    //センサー1がLight_maxの値をとったとき
		{
			OnFwd(OUT_B);      //モーターB(ベルトコンベアー)を回転して弾を装填
			until(SENSOR_3 > 38);  //センサー3が弾に反応したら…↓
			Off(OUT_B);              //モーターBを停止(弾装填停止)
		}
		else              //センサー1がLight_maxではないとき
		{
			Off(OUT_B);       //ベルトコンベアーを1秒間停止
			Wait(100); 
		}
		if(SENSOR_3 < 38)       //センサー3が閾値より小さい値の時(弾がない時)
		{
			Off(OUT_C);      //モーターCを停止(打ち出しアームを停止)
		}
		else              //センサー3が閾値より大きい値の時(弾があるとき)
		{
			OnRev(OUT_C);     //モーターC(打ち出しアーム)を半回転して弾を打ち出し
			Wait(11);
			Off(OUT_C);            //そのまま停止
		}
	}                    //以上を繰り返す
}


task main ()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);      //センサー1を光センサーと定義(閾値35)
	SetSensor(SENSOR_3,SENSOR_LIGHT);      //センサー2を光センサーと定義(閾値38)
	ClearTimer(0);                //タイマをリセット
	Light_max = 0;              //変数をリセット
	while(true)
	{
	while(Timer(0)<=48)            //4.8秒間whileの中を実行する
		{
			OnFwd(OUT_A);				//右回りをして各部分の光量を計測
			if(SENSOR_1 > Light_max)         //もしセンサー1よりLight_maxが大きかったら…↓
				{
					Light_max = SENSOR_1;       //その値をセンサー1とする
				}
		}
	OnFwd(OUT_A);
	until((SENSOR_1==Light_max));       //センサー1がLight_maxの値になる場所まで右回転する
	Off(OUT_A);
	tamaokuri_tobasu();
	}                                             //以上を繰り返す。
}
sub tamaokuri_tobasu()

{

	SetPower(OUT_B,1);         //モーターB(ベルトコンベア)のトルクを1に設定
 	SetPower(OUT_C,7);         //モーターC(打ち出しのアーム)のトルクを7に設定
	SetSensor(SENSOR_1,SENSOR_LIGHT); //閾値35
	SetSensor(SENSOR_3,SENSOR_LIGHT); //閾値38

	while(true)
	{

		if(SENSOR_1 ==Light_max)
		{
 
			OnFwd(OUT_B);

			Wait(100);
			Off(OUT_B);     //ベルトコンベアでホイールを運搬

			OnRev(OUT_C);

			Wait(11);

			Off(OUT_C);     //打ち出し用アームでホイール打ち出し

		}     //光センサーが相手のマシンを見つけたらベルトコンベアで砲撃用のホイールを運び出し、打ち出す。
		else
		{

			Off(OUT_B+OUT_C);

			Wait(100);

		}     //相手のマシンが見当たらない時はベルトコンベアも打ち出しアームも静止させておく。

	}

}
 
task main()
{
	int Light_max=0;		//光の最大値用の変数
	ClearTimer(0);		//Timer(0)をリセット
	while(Timer(0)<=300)
	{
 		if(SENSOR_1<THRESHOLD){		//最初にライン上(黒)の場合
		OnFwd(OUT_C);Wait(15);		//左に逸らす
	if(SENSOR_1>THRESHOLD)
	{
		OnRev(OUT_C);Wait(15);	//右に逸らす
	}
}
	if(SENSOR_3>60)
	{
		Light_max=SENSOR_3;			// Light_maxに観測値を代入
		if(SENSOR_3>Light_max)
		{
					Light_max=SENSOR_3;	// Light_maxに観測値lを代入(Light_maxを更新)
				}
			}
		}
		if(SENSOR_3>=(Light_max)){	//SENSOR_3がLight_max(相手の光)を感知したら…↓
			repeat(16){			//5秒間追跡する
				OnFwd(OUT_C);Wait(15);
				OnRev(OUT_C);Wait(15);
			}
			tamaokuri_tobasu();		//弾を打つ
		}
	}
	Off(OUT_C);
}

感想

コメントをお願いします



添付ファイル: fileDSCN0450.JPG 336件 [詳細] fileDSCN0469.JPG 145件 [詳細] fileDSCN0467.JPG 319件 [詳細] fileDSCN0466.JPG 280件 [詳細] fileDSCN0465.JPG 272件 [詳細] fileDSCN0460.JPG 142件 [詳細] fileDSCN0459.JPG 262件 [詳細] fileDSCN0458.JPG 153件 [詳細] fileDSCN0456.JPG 314件 [詳細] fileDSCN0457.JPG 130件 [詳細] fileDSCN0455.JPG 19件 [詳細] fileDSCN0454.JPG 165件 [詳細] fileDSCN0471.JPG 273件 [詳細] fileDSCN0470.JPG 318件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-02-13 (日) 21:03:22