B地点からA地点へ(Q交差点では直進、P三叉路では直進)黒い線にそって動くロボットを作成する。途中(P地点とQ地点)の間においたボールを目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止する。
アームは上げた状態でスタート。 ボールを扱う前後は小休止をはさむことで安定性を増した。
#define BLACK 40 //以下は黒
#define WHITE 45 //以上は白
#define go_forward OnFwd(OUT_AC); //直進
#define turn_right OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define turn_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 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE )// 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット }
if (true) //黒を続けてnMAX回繰り返さない間、通常のライントレースをする { while (nOnline <nMAX) { if (SENSOR_2 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE) // 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); }
交差点、ボール捕球
short_break; //小休止 turn_right;Wait(35); //方向修正 short_break; //小休止 DOWN; //アームを下げ捕球 turn_left;Wait(30); //方向修正 short_break; //小休止 cross_line; //交差点を渡る nOnline=0; //カウンタリセット
Q地点→P地点→A地点
if (true) //黒を続けてnMAX回繰り返さない間、通常のライントレースをする
{ while (nOnline <nMAX) { if (SENSOR_2 < BLACK) // 線上なら { turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE )// 境界付近なら { go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット }
B地点、シュート
short_break; //小休止 turn_right;Wait(35); //方向修正 short_break; //小休止 UP; //アームを上げる shot; //車体でボールを押し、シュート Off(OUT_AC); //停止 nOnline=0; //カウンタをリセット }
}