[[2015a/MemberOnly]]
*ライントレース [#g3231d40]
**課題 [#k1a5b0b0]
&ref(./2015a-mission2.png,75%);

A地点からB地点へ (P三叉路およびQ交差点はともに直進)黒い線にそって動くロボットを作成する

そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止する。


可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。

**ロボットの構成 [#eea9b114]

&ref(./IMG_1372[1].jpg,15%);

**プログラム [#d1b6340a]
#define IN 40                                               //40以下は線上
#define OUT 45                                              //45以上は線外
#define go_forward OnFwd(OUT_AC);                           //直進
#define right OnRev(OUT_C); OnFwd(OUT_A);                   //右まわり
#define left OnFwd(OUT_C); OnRev(OUT_A);                    //左まわり
#define STEP 1                                              // 一回の判定で進む時間
#define short_break Off(OUT_AC); Wait(200);                 // 小休止
#define CROSS_TIME 20                                       // 交差点通過にかかる時間
#define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る
#define nMAX 8                                             //通常のカーブとして許容できる繰り返しの最大値
#define DOWN OnFwd(OUT_B);Wait(40);Off(OUT_B);              //籠を下ろす
#define UP OnRev(OUT_B);Wait(40);Off(OUT_B);               //籠を上げる
#define shot go_forward;Wait(100);                         //シュート

task main()
{ SetSensor(SENSOR_2, SENSOR_LIGHT);
 int nOnline=0; // 続けて線上になった回数

 A地点→Q地点
if (true) {                                                    //線上を続けてnMAX回繰り返さない間、通常のライントレースをする
        while (nOnline <nMAX) {
                      if (SENSOR_2 < IN){                        // 線上なら
                               right;                     // 右へ
                               nOnline++;                  //カウンタ増やす
                              } 
                                       else {
                         if (SENSOR_2 < OUT){                    // 境界付近なら
                                   go_forward;         // 直進
                                  } 
                                              else { 	                              //線から外れれば
                            left;                             //左へ
                            }
                         nOnline=0;                             //カウンタリセット
                                             }			
                    Wait(STEP);
                   }
        nOnline=0;		                                              //カウンタリセット
         }
     if (true) {	                                                              //線上を続けてnMAX回繰り返さない間、通常のライントレースをする
                while (nOnline <nMAX) {
                                        if (SENSOR_2 < IN){                           // 線上なら
                                                            right;                    // 右へ
                                                            nOnline++;                //カウンタ増やす
                                                          } 
                                         else {
                                               if (SENSOR_2 < OUT){                   // 境界付近なら
                                                                    go_fo             // 直進
                                                                   }
                                                else { 	    	                      //線から外れれば
	                                                left;	                      //左へ
                                                      }
                                               nOnline=0;                             //カウンタリセット
                                              }			
                                        Wait(STEP);
                                        }

交差点、ボール捕球
                 short_break;	      //小休止
                 right;Wait(35);   //方向修正
                 short_break;      //小休止  
                 DOWN;          //籠を下げ捕球
                 left;Wait(30);    //方向修正
                 short_break;       //小休止
                 cross_line;		 //交差点を渡る
                 nOnline=0;		 //カウンタリセット
                }

Q地点→B地点
if (true) {                                                                   //黒を続けてnMAX回繰り返さない間、通常のライントレースをする
          while (nOnline <nMAX) {
                                 if (SENSOR_2 < IN){                          // 線上なら
                                                    right;                    // 右へ
                                                    nOnline++;		      //カウンタ増やす
                                                   } 
                                  else {
                                        if (SENSOR_2 < OUT){                  // 境界付近なら
                                                            go_forward;       // 直進
                                                           }
                                        else { 	                              //線から外れれば
	                                       left;	                      //左へ
                                             }
                                         nOnline=0;                           //カウンタリセット
                                        }			
                                  Wait(STEP);
                                  }

B地点、シュート
            short_break;		//小休止
            right;Wait(35); 	//方向修正
            short_break;         //小休止
            UP;              //籠を上げる
            shot;            //車体でボールを押し、シュート
            Off(OUT_AC);	        //停止
            nOnline=0;		        //カウンタをリセット
           }      
 }

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