[[2016a/Member]]

*目次 [#re6d02ad]
#contents

*ロボット本体の説明 [#m01daee5]

*プログラム [#c67d1a25]
#ref(2016a/Member/Junnko/Mission2/image2.JPG,50%,ロボットの上から)
#ref(2016a/Member/Junnko/Mission2/image1.JPG,50%,ロボット裏面)
 元々は4輪だったものを写真のように前輪2輪だけにしました。そしてロボットの裏側に滑りやすくするために少し球面を帯びたパーツを取り付けました。これによって、少しだけ進むスピードが上がりました。

#define LIGHT 39
#define turn_left1 OnFwd(OUT_C); OnRev(OUT_A);
#define turn_left2 OnFwd(OUT_C); Off(OUT_A);
#define turn_right1 OnFwd(OUT_A); OnRev(OUT_C);
#define turn_right2 OnFwd(OUT_A); Off(OUT_C);
#define go OnFwd(OUT_AC);
#define sound PlaySound(SOUND_FAST_UP);
#ref(2016a/Member/Junnko/Mission2/image4.JPG,50%,ロボットの横から)
 光センサーはこの写真ぐらい紙からはなし、ロボット本体が作る陰がぎりぎり入らないようにしました。

sub fowerd()
{
  sound;
  OnFwd(OUT_AC);
  Wait(40);
  Off(OUT_AC);
}
*プログラムの説明 [#c67d1a25]

sub left()
{
  sound;
  turn_left1;
  Wait(30);
  Off(OUT_C);
}
このプログラムは黒線の左側をトレースするように書きました。

sub line()
{
int ch=0;
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
  while(ch==0)
  {
    if(FastTimer(0)>40)
    {
     Off(OUT_AC);
     Wait(100);
     ClearTimer(0);
     ch=1;
    }
 #define LIGHT 39
 #define turn_left1 OnFwd(OUT_C); OnRev(OUT_A);
 #define turn_left2 OnFwd(OUT_C); Off(OUT_A);
 #define turn_right1 OnFwd(OUT_A); OnRev(OUT_C);
 #define turn_right2 OnFwd(OUT_A); Off(OUT_C);
 #define go OnFwd(OUT_AC);
 #define sound PlaySound(SOUND_FAST_UP); 

	if (SENSOR_2 < LIGHT){
	turn_left1;
	}
    	else if (SENSOR_2 < LIGHT + 3){
	
	turn_left2;
	}
	else if (SENSOR_2 < LIGHT + 6){
	ClearTimer(0);
	go;
	}
	else if (SENSOR_2 < LIGHT + 9){
	ClearTimer(0);
	turn_right2;
	}
	else
	{
	ClearTimer(0);
	turn_right1;
	}
   Wait(3);
  }
}

task main()
{
   line();
   fowerd();
   line();
   fowerd();
   line();
   fowerd();
   line();
   left();
   line();
 sub fowerd()
 {
   sound;
   turn_right1;
   Wait(30);
   OnFwd(OUT_AC);
   Wait(150);
   Wait(40);
   Off(OUT_AC);
}
 }

 sub left()
 {
   sound;
   turn_left1;
   Wait(30);
   Off(OUT_C);
 }

黒線の真ん中の値(光センサーでの)を基準にし、最初は必ず左折するようにしました。また、ライントレースのサブルーチンを終わらせるために関数を使いました。ch=0の時にラインとレースを開始し、ch=1(交差点まで来たら)になったら終了するようにしました。交差点の識別は、黒色の部分が0,4秒続いたらそこを交差点とし、停止するようにしました。

 sub line()
 {
 int ch=0;
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(ch==0)
  {
    if(FastTimer(0)>40)
     {
      Off(OUT_AC);
      Wait(100);
      ClearTimer(0);
      ch=1;
     }
 
 	if (SENSOR_2 < LIGHT){
 	turn_left1;
 	}
     	else if (SENSOR_2 < LIGHT + 3){
 	turn_left2;
 	}
 	else if (SENSOR_2 < LIGHT + 6){
 	ClearTimer(0);
 	go;
 	}
 	else if (SENSOR_2 < LIGHT + 9){
 	ClearTimer(0);
 	turn_right2;
 	}
 	else
 	{
 	ClearTimer(0);
 	turn_right1;
 	}
    Wait(3);
   }
 } 

 task main()
 {
    line();
    fowerd();
    line();
    fowerd();
    line();
    fowerd();
    line();
    left();
    line();
    sound;
    turn_right1;
    Wait(30);
    OnFwd(OUT_AC);
    Wait(150);
    Off(OUT_AC);
 }

 
*感想 [#ge1b38df]

ライントレースをさせるだけなら簡単だったけど、そこに交差点を認識させるプログラムで、ClearTimerをどこに入れるかで悩みました。今回特に難しかったのがラインとレースを終わらせるところです。そのまま関数を使わずにいると、交差点は認識できても、ずっとライントレースの指示のまま動き続けます。まずそれに気づくのに時間がかかり、そこから関数を使おうと思うまですごく悩みました。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS