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

反省・感想

  • スタート位置やロボの電池残量などでタイマーの値が毎回変わってしまい、調整するのが大変だった。
  • 前回ロボットを製作し始めるのが遅く、後々苦労したので今回は早めにロボットを完成させることができてよかった。しかし、プログラムが難しくて結果的に授業以外でやることになってしまった。
  • プログラムをもう少し工夫すれば、もう少し簡単なプログラムができたと思うので残念だった。

コメント

  • バッテリの残量が減って多少スピードが遅くなっても正確な動きをするようにプログラムを改良しましょう。 -- 松本 2011-06-24 (金) 14:55:15


添付ファイル: filesugahara.JPG 222件 [詳細] filekidera.JPG 252件 [詳細] file03.JPG 229件 [詳細] file02.JPG 224件 [詳細] file01.JPG 208件 [詳細]

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