2010b

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

課題概要

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

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

メンバー紹介

  • こっちの松本
  • 貴トラマンヒロ

ポイント

  • ロボットは、移動以外に「弾送り」、「射出」にモーターを使うので、移動にはモーターは1つしか使えないので、ディファレンシャルギアを用いることで、モーターの回転方向を変えて、ロボット左右のタイヤを交互に前進させることで、進む。
  • 逃げるロボットから発せられる光を検出するには、光の最大値を求めるようなプログラムを入れる。ただし、この時まわりの光は具体的な関数として表すことはできないので、2つの数値を比較することで、最大値を決定する。

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

ロボット紹介

マシン全体

DSCN0470.JPG
DSCN0471.JPG
DSCN0456.JPG
  • 色々搭載したらこんなサイズになった。どのチームよりもでかい自信がある。
  • 何よりカッコよい!!

駆動部

DSCN0466.JPG

弾送り機構

DSCN0459.JPG
  • 箱の間にシャフトを噛ませた。
    DSCN0467.JPG

砲撃機構

DSCN0465.JPG
  • 光センサーで反応して発射できるようにした。
  • 打ちだす機構はモーターにプレートを取り付け、プロペラみたいにした。

コース紹介

DSCN0450.JPG
  • 課題2でお馴染みのこれ!!

プログラミング紹介

  • 逃げる側のプログラミング(ライントレース)
#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;   //左に曲がる
				}
		}        //これを繰り返す。
}
  • 追いかける側のプログラミング(追跡なしver)
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);
}

感想

  • 貴トラマンヒロ
    今回のマシンはとても大型になった。
    ブロックの接合等、工夫すべき点はいくつかあったようにも思えたが、思うように動いたのでよしとしたい。
    今回も、他のチームに比べて後れをとってしまう形になった。ロボコンの時はもっと頑張りたい。

コメントをお願いします

  • まだ途中みたいなので、またあとで見ます -- FI? 2011-02-08 (火) 01:31:17


添付ファイル: fileDSCN0450.JPG 209件 [詳細] fileDSCN0469.JPG 98件 [詳細] fileDSCN0467.JPG 201件 [詳細] fileDSCN0466.JPG 163件 [詳細] fileDSCN0465.JPG 175件 [詳細] fileDSCN0460.JPG 85件 [詳細] fileDSCN0459.JPG 166件 [詳細] fileDSCN0458.JPG 86件 [詳細] fileDSCN0456.JPG 221件 [詳細] fileDSCN0457.JPG 88件 [詳細] fileDSCN0455.JPG 81件 [詳細] fileDSCN0454.JPG 104件 [詳細] fileDSCN0471.JPG 171件 [詳細] fileDSCN0470.JPG 219件 [詳細]

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