[[2015b/Member]]

目次
#contents
*課題内容 [#kfaf69dd]
#ref(./2015b-mission2.png,65%,ロボット全体図)
 課題は上図の黒線にそって動くライントレースロボットを制作するというものです。ライントレースをする際には、光センサを1つ用います。

 地点A→Bまたはその逆からスタートし、ライントレースしていきます。私は、地点Aから地点Bへと進むプログラムを組みました。ここで条件があり、地点A → P直進 → Q直進 → Q右折 → P右折 → Q左折 → P左折 → 地点Bというような動きをするロボットにしなければなりません。また、地点P,Qは交差点と判断し、そこで1秒間停止してから、次の行動に移るようにしなければなりません。そして、なるべく早く動くロボットするというのが条件になります。

*ライントレースとは? [#he44cd7b]
ライントレースというのは、床面に描かれた線をロボットがセンサで読み取り、線に沿って動くことを言います。

*ライントレースロボット [#of50aded]
**ロボット全体図 [#ya86efcb]
#ref(./DSC_0221.JPG,40%,ロボット全体図)
 上の写真のものが、今回の課題で制作したライントレースロボットの全体像になります。特徴として、急なカーブも曲がり切れるように車体を小さくしています。

**光センサについて [#icca71bd]
#ref(./DSC_0222.JPG,40%,センサ位置)
 上の写真の赤丸で囲ってあるものが光センサになります。光センサは、ライントレースする際に白か黒(明暗)かの判断をするためにあります。このロボットは光センサとモーター(タイヤ)を近くにしてます。そうすることで、光センサの判断がされてからすぐにモーター(タイヤ)が動き、誤動作が少なくなると考えたからです。

*ロボットの動作 [#gb308690]
ロボットが走行するために、モーターを2つ使用しています。それぞれが独立して動作するので、直進や回転させることができます。

今回のライントレースは光センサが1つだけということもあり、黒線に沿って動くよりも、白と黒の中間にそって動くロボットの方が効率が良いので、そのように動くようにしました。

白と黒のちょうど中間に当たるところを読み取る時に、直進するようにしました。


*プログラム [#d4fb4ffe]


 #define THRESHOLD 39

 #define START SetPower(OUT_A,7);SetPower(OUT_C,7);OnFwd(OUT_AC);Wait(120);

 #define TR SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_A);Wait(1);OnRev(OUT_C);Wait(1);
 #define TL SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_C);Wait(1);OnRev(OUT_A);Wait(1);
 #define TRL SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_A);Wait(1);
 #define TLL SetPower(OUT_A,1);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_C);Wait(1);
 #define ST SetPower(OUT_A,5);SetPower(OUT_C,5);Off(OUT_AC);OnFwd(OUT_AC);Wait(1);

 #define TR2 SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_A);Wait(1);OnRev(OUT_C);Wait(1);
 #define TL2 SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_C);Wait(1);OnRev(OUT_A);Wait(1);
 define TRL2 SetPower(OUT_A,1);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_A);Wait(1);
 #define TLL2 SetPower(OUT_A,1);SetPower(OUT_C,1);Off(OUT_AC);OnFwd(OUT_C);Wait(1);

 #define PQ_ST SetPower(OUT_A,2);SetPower(OUT_C,2);Off(OUT_AC);OnFwd(OUT_AC);Wait(30);
 #define CCW SetPower(OUT_A,4);SetPower(OUT_C,4);Off(OUT_AC);OnFwd(OUT_C);Wait(11);OnRev(OUT_A);Wait(11);

 #define GOAL SetPower(OUT_AC,4);Off(OUT_AC);OnFwd(OUT_A);Wait(5);OnRev(OUT_C);Wait(5);OnFwd(OUT_AC);Wait(100);

 #define Do 1047
 #define LaF 831
 #define SiF 932
 #define Si 988

 int c_point;

 sub crossing()
 {
     Off(OUT_AC);
     Wait(100);
     c_point+=1;
 }

 sub music()
 {
     PlayTone(Do,20);
     Wait(30);
     PlayTone(Do,20);
     Wait(30);
     PlayTone(Do,20);
     Wait(30);
     PlayTone(Do,60);
     Wait(62);
     PlayTone(LaF,60);
     Wait(62);
     PlayTone(SiF,60);
     Wait(62);
     PlayTone(Do,20);
     Wait(42);
     PlayTone(Si,20);
     Wait(22);
     PlayTone(Do,90);
     Wait(92);
 }       

 task main ()
 {  
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    
    START;
    
    ClearTimer(0);
    
    ClearTimer(1);
    
    c_point=0;
    
    while (true)
    {
		  while((FastTimer(0)<10)&&(c_point<=3))
		  {
		     if(SENSOR_2>THRESHOLD+8)
		      {
		              TL;
		              ClearTimer(0);
		      }        
		     else if(SENSOR_2>THRESHOLD+7)
		      {
		              TLL;
		              ClearTimer(0);
		      }
		     else if(SENSOR_2>THRESHOLD)
		      {
		              ST;
		              ClearTimer(0);
		      }
		     else if(SENSOR_2>THRESHOLD-2)
		      { 
		              TRL;
		              ClearTimer(0);
		      }
		     else
		      {     
		              TR;
		      }
		  }
    
					    while((FastTimer(0)<10)&&(c_point>=4))
					    {
					        if(SENSOR_2>THRESHOLD+8)
					         {
					                 TR2;
					                 ClearTimer(0);
					         }        
					        else if(SENSOR_2>THRESHOLD+7)
					         {
					                 TRL2;
					                 ClearTimer(0);
					         }
					        else if(SENSOR_2>THRESHOLD)
					         {
					                 ST;
					                 ClearTimer(0);
					         }
					        else if(SENSOR_2>THRESHOLD-2)
					         { 
					                 TLL2;
					                 ClearTimer(0);
					         }
					        else
					         {     
					                 TL2;
					         }
					     }
     
										     if((FastTimer(1)>1400)&&(c_point==0))
										      {
										       crossing();
										       PQ_ST;
										       ClearTimer(0);
										      }
										       else
										        {
										            ClearTimer(0);
										        }
										      
										     if((FastTimer(1)>2100)&&(c_point==1))
										      {
										         crossing();
										         CCW;
										         PQ_ST;
										         ClearTimer(0);
										      }
										        
										     if((FastTimer(1)>2800)&&(c_point==2))
										      {
										        crossing();
										        ClearTimer(0);
										        ClearTimer(1);
										      }
										     
										     if((FastTimer(1)>500)&&(c_point==3))
										      {
										         crossing();
										         PQ_ST;
										         ClearTimer(0);
										         ClearTimer(1);
										      }
										      
										     if((FastTimer(1)>2060)&&(c_point==4))
										      {
										         crossing();
										         ClearTimer(0);
										         ClearTimer(1);
										      }
										      
										     if((FastTimer(1)>500)&&(c_point==5))
										      {
										        crossing();
										        ClearTimer(0);
										      }
										      
										     if((FastTimer(1)>1300)&&(c_point==6))
										      {
										        crossing();
										        GOAL;
										        Off(OUT_AC);
										        Wait(50);
										        music();
										        Off(OUT_AC);
										        Wait(10000);
										      }       
   }
 }
*反省・感想 [#c72d73f0]

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