#contents
*課題内容 [#oe2da1f2]
今回の課題はライントレースをしながら、十字路を指定されたように曲がるというものである。
+一回目に交差点にさしかかったときは左折
+二回目は右折
+三回目は左折
+四回目は直進
+五回目は直進 → ゴールへ

*ロボット本体 [#l62d6e51]
ロボット本体は元となる車の状態に、光センサを取り付けた簡単な造りである。
#ref(./IMAG0706.jpg,100%)

*プログラム [#s121a47f]
**プログラム概要 [#v078fddd]
まずは普通にライントレースをしていき、交差点に差し掛かったところで左折・右折・直進のいずれかの動作をするので、その繰り返しのようなプログラムになっている。

交差点の判定は、連続で何回黒を認識したかによって行う。
**プログラム内容 [#d752db11]

以下のように定義する

 #define THRESHOLD (66+36)/2   //白と黒の取りうる値の最大値の平均値(しきい値)
 #define SPEED_H 35
 #define SPEED_L 20
 #define OnRL(speed_R,speed_L) OnFwd(OUT_B,speed_R);OnFwd(OUT_C,speed_L);
 #define go_forward OnRL(SPEED_H,SPEED_H);    //直進
 #define turn_left0 OnRL(SPEED_L,0);          //左旋回
 #define turn_left1 OnRL(SPEED_L,-SPEED_L);   //左回転
 #define turn_right0 OnRL(0,SPEED_L);         //右旋回
 #define turn_right1 OnRL(-SPEED_L,SPEED_L);  //右回転
 #define STEP 1       //1ステップの待ち時間
 #define nMAX 270     //十字路と判別する連続ステップ数
 #define ds 7         //しきい値との差(小)
 #define dl 12        //しきい値との差(大)

センサの設定

 task main()
 {
  SetSensorLight(S1);    //センサ1は光センサ
  int nOnline=0;         //nOnlineを定義、初期値は0



 while(nOnline < nMAX){
 	if(SENSOR_1 < THRESHOLD-dl){
 		turn_left1;
 		nOnline++;
 	}else{
 		if(SENSOR_1 < THRESHOLD-ds){
 			turn_left0;
 		}else if(SENSOR_1 < THRESHOLD+ds){
 			go_forward;
 		}else if(SENSOR_1 < THRESHOLD+dl){
 			turn_right0;
 		}else{
 			turn_right1;
 		}
 		nOnline=0;
 	}
 	Wait(STEP);
 }                                         //十字路までライントレース
 turn_left0;
 until(SENSOR_1 > THRESHOLD+(dl+ds)/2);    //白を検出するまで左旋回
 nOnline=0;                                //nOnlinoの初期化

#ref(./IMAG0707.jpg,100%)

 while(nOnline < nMAX){
 	if(SENSOR_1 < THRESHOLD-dl){
 		turn_left1;
 		nOnline++;
 	}else{
 		if(SENSOR_1 < THRESHOLD-ds){
 			turn_left0;
 		}else if(SENSOR_1 < THRESHOLD+ds){
 			go_forward;
 		}else if(SENSOR_1 < THRESHOLD+dl){
 			turn_right0;
 		}else{
 			turn_right1;
 		}
 		nOnline=0;
 	}
 	Wait(STEP);
 }                                         //十字路までライントレース
 repeat(2){
 turn_right0;
 until(SENSOR_1 > THRESHOLD+(dl+ds)/2);
 turn_right0;
 until(SENSOR_1 < THRESHOLD-(dl+ds)/2);
 }                                         //白→黒→白→黒の順に検出するまで右旋回
 nOnline=0;                                //nOnlineの初期化

#ref(./IMAG0708.jpg,100%)

 while(nOnline < nMAX){
 	if(SENSOR_1 < THRESHOLD-dl){
 		turn_left1;
 		nOnline++;
 	}else{
 		if(SENSOR_1 < THRESHOLD-ds){
 			turn_left0;
 		}else if(SENSOR_1 < THRESHOLD+ds){
 			go_forward;
 		}else if(SENSOR_1 < THRESHOLD+dl){
 			turn_right0;
 		}else{
 			turn_right1;
 		}
 		nOnline=0;
 	}
 	Wait(STEP);
 }                                          //十字路を検出するまでライントレース
 turn_left1;
 until(SENSOR_1 > THRESHOLD+(dl+ds)/2);     //白を検出するまで左旋回
 nOnline=0;                                 //nOnlineの初期化

#ref(./IMAG0710.jpg,100%)

 repeat(2){
 while(nOnline < nMAX){
 	if(SENSOR_1 < THRESHOLD-dl){
 		turn_left1;
 		nOnline++;
 	}else{
 		if(SENSOR_1 < THRESHOLD-ds){
 			turn_left0;
 		}else if(SENSOR_1 < THRESHOLD+ds){
 			go_forward;
 		}else if(SENSOR_1 < THRESHOLD+dl){
 			turn_right0;
 		}else{
 			turn_right1;
 		}
 		nOnline=0;
 	}
 	Wait(STEP);
 }                                         //十字路までライントレース
 turn_left0;                               //誤作動を減らすための調整
 Wait(100);
 turn_right0;
 until(SENSOR_1 > THRESHOLD+(dl+ds)/2);
 turn_right0;
 until(SENSOR_1 < THRESHOLD-(dl+ds)/2);    //白→黒の順に検出するまで右旋回
 nOnline=0;                                //nOnlineの初期化
 }


&ref(./IMAG0711.jpg,100%);&ref(./IMAG0712.jpg,100%);

 while(true){
 	if(SENSOR_1 < THRESHOLD-dl){
 		turn_left1;
 	}else if(SENSOR_1 < THRESHOLD-ds){
 		turn_left0;
 	}else if(SENSOR_1 < THRESHOLD+ds){
 		go_forward;
 	}else if(SENSOR_1 < THRESHOLD+dl){
 		turn_right0;
 	}else{
  		turn_right1;
 	}
 	Wait(STEP);
 	}
 }                           //最後は普通のライントレース



*反省・考察 [#pbed8de9]
サブルーチンを用いて短いプログラムにしようと試みたが、上手くいかず、動作の割に長いプログラムになってしまった。
サブルーチン等を用いて短いプログラムにしようと試みたが、上手くいかず、動作の割に長いプログラムになってしまった。

しっかり完走することはできるが、若干電池残量に影響を受けてしまうことが分かった。

次回は、簡潔で外的要因の影響を受けにくいプログラムを作りたい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS