2011a

課題2 黒い線上を動くロボット

2011a/練習問題

メンバー紹介

製作したロボット

今回のロボットは、シンプルな作りにして車体をコンパクトにした。

01.JPG

今回走るコースには、急カーブや直角に曲がる箇所があるため、小回りが効くように車体をコンパクトにした。コンパクトにしたことで、紙からはみださず曲がることができた。

02.JPG

光センサーも高さや幅の調節がしやすいよう、簡単な作りに仕上げた。

03.JPG

プログラムとコース

きでら

コース(右回り、90度)

kidera.JPG

プログラム

#define THRESHOLD 45                           //閾値は45
#define migi OnFwd(OUT_A);Off(OUT_C);     //右カーブ    
#define hidari OnFwd(OUT_C);Off(OUT_A);    //左カーブ
#define mae OnFwd(OUT_A+OUT_C);        //前身
#define tomaru Off(OUT_A+OUT_C);        //停止
#define migi2 OnFwd(OUT_A);OnRev(OUT_C);    //右急カーブ
#define hidari2 OnFwd(OUT_C);OnRev(OUT_A);   //左急カーブ
#define fal PlayTone(698,5) ;         //ファ
#define sol PlayTone(784,5) ;         //ソ            
#define lal PlayTone(880,5) ;         //ラ
 
task main()
{ 
	SetSensor(SENSOR_1, SENSOR_LIGHT);
	SetSensor(SENSOR_3, SENSOR_LIGHT);
	ClearTimer(0);
	while(FastTimer(0)<=300)          //スタート時
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) <= 1350)          //急カーブ
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari2;}
	}
	while(FastTimer(0) <= 1650)          //ロータリー侵入
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{hidari;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) <= 2100)          //ロータリー内に留まる
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi2;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) <= 3000)          ロータリー外へ
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{hidari;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari2;}
	}
	while(FastTimer(0) <= 3300)            //点線をスルーし、直角カーブ〜ロータリー
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) <= 3600)             //ロータリー内
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{hidari;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) <= 4900)             //ロータリー脱出〜十字路
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{hidari;}
	}
	while(FastTimer(0) > 4900)               //ゴール!!停止
	{
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{mae;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{tomaru;}
		if(
		(SENSOR_1 > THRESHOLD)&&
		(SENSOR_3 < THRESHOLD))
		{migi;}
		if(
		(SENSOR_1 < THRESHOLD)&&
		(SENSOR_3 > THRESHOLD))
		{tomaru;               //ファンファーレ
		lal;Wait(15);
		lal;Wait(15);
		lal;Wait(15);
		lal;Wait(45);
		fal;Wait(45);
		sol;Wait(45);
		lal;Wait(30);
		sol;Wait(15);
		PlayTone(880,90) ;Wait(200);}
	}
}

すがはら

コース(左回り、ショートカット)

sugahara.JPG

プログラム

今回のプログラムは2個のセンサー(センサー1、センサー3)を使い、
(黒,黒)…直進、T字路で右折または左折
(黒,白)…左に微調整
(白,黒)…右に微調整
(白,白)…直進
の四つでコースを走らせた。(黒,黒)のみロータリーで特定の方向に曲がるようプログラムした。また、急カーブが曲がりきれないことがあったため、(黒,白)で今までより大きく左に調整するようにした。その他は変えていない。

#define THRESHOLD 40   //閾値を40に設定

task main ()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);	//光センサー1を点ける
	SetSensor(SENSOR_3,SENSOR_LIGHT);	//光センサー3を点ける

	PlaySound(SOUND_DOWN);	//効果音

	//スタート〜ロータリーまで
ClearTimer(0);
	while (FastTimer(0)<=1280)  //約13秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))	//両方ともライン の外のとき

	  {OnFwd(OUT_A+OUT_C);}					//直進

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))	//3のみライン上のとき
	  
	  {OnFwd(OUT_A);  Off(OUT_C);}				//右に微調整

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))	//1のみライン上のとき

	  {OnFwd(OUT_C);Off(OUT_A);}				//左に微調整

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//交差点上のとき

	  {OnFwd(OUT_A+OUT_C);}					//直進
       }

	//ロータリーを走る(1/4)
ClearTimer(1);
	while (FastTimer(1)<=100)  //1秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//ロータリーのT字上のとき

	  {OnFwd(OUT_A);  OnRev(OUT_C);}			//右に向きを変える
	}

	//ロータリーを走る(2/4)
ClearTimer(2);
	while (FastTimer(2)<=250)  //2.5秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//ロータリーのT字上のとき

	  {OnFwd(OUT_C);  OnRev(OUT_A);}			//左に向きを変える
	}

	//ロータリーを走る(2.5/4)
ClearTimer(1);
	while (FastTimer(1)<=300)  //3秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//ロータリーのT字上のとき

	  {OnFwd(OUT_A);  OnRev(OUT_C);}			//右に向きを変える
	}

	//ロータリー〜点線まで
ClearTimer(1);
	while (FastTimer(1)<=60)  //0.6秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  OnRev(OUT_C);}
	}

	//実線から点線へ(ショートカット)
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(90);		//90度右に回る
	Off(OUT_A+OUT_C);

	//点線上を走る
ClearTimer(3);
	while (FastTimer(3)<=222)   //約2秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}
	}

	//点線から実線へ(ショートカット終わり)
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(90);		//90度右に回る
	Off(OUT_A+OUT_C);

	//点線(終点)〜ロータリーまで
ClearTimer(1);
	while (FastTimer(1)<=380)  //3.8秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}
	}

	//実線からロータリーへ
	OnFwd(OUT_A);
	OnRev(OUT_C);
	Wait(60);		//60度右に回る
	Off(OUT_A+OUT_C);

	//ロータリーを走る(3/4)
ClearTimer(1);
	while (FastTimer(1)<=280)  //2.8秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//ロータリーのT字上のとき

	  {OnFwd(OUT_C);  OnRev(OUT_A);}			//左に向きを変える
	}

	//ロータリーを走る(4/4)
ClearTimer(1);
	while (FastTimer(1)<=310)  //約3秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A); Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C); Off(OUT_A);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//ロータリーのT字上のとき

	  {OnFwd(OUT_A); OnRev(OUT_C);}				//右に向きを変える
	}

	//ロータリー〜ゴールまで(急カーブ)
ClearTimer(0);

	while (FastTimer(0)<=1040)  //約10秒間while内を繰り返し
	{
	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_A+OUT_C);}

	 if ((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD))

	  {OnFwd(OUT_A);  Off(OUT_C);}

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))

	  {OnFwd(OUT_C);  OnRev(OUT_A);}                        //急カーブのため左に大きく調整

	 if ((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))	//交差点上のとき

	  {OnFwd(OUT_A+OUT_C);}					//直進
	}

	//ゴール!!
	Off(OUT_A+OUT_C);
	PlaySound(SOUND_UP);
}

反省・感想

コメント



添付ファイル: filesugahara.JPG 321件 [詳細] filekidera.JPG 360件 [詳細] file03.JPG 350件 [詳細] file02.JPG 321件 [詳細] file01.JPG 319件 [詳細]

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