ボールをシュートする側 † #define BLACK_high 36 //一番黒いしきい値 #define BLACK_low 38 //少し黒いしきい値 #define WHITE_low 42 //少し白いしきい値 #define WHITE_high 44 //一番白いしきい値 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回する #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左カーブする #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //右カーブする #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回する #define go_fwd OnFwd(OUT_AC); //前進する #define short_break Off(OUT_AC); Wait(100); //小休止する #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る #define time2 10 //シュートしない側が交差点から一回目に前進する時間 #define time3 10 //シュートしない側が交差点から二回目に前進する時間 #define nMAX 300 //交差点と判断する基準 #define STEP 1 //ライントレース時の待ち時間 task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; int nCross=0; int counter=0; while (nCross < 2) { //交差点までのライントレース while (nOnline < nMAX) { if(SENSOR_1 < BLACK_high) { turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low) { turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける short_break; nCross++; nOnline=0; } turn_left_senkai; Wait(70); until(FastTimer(1) > 4500); CATCHBALL; turn_left_senkai; Wait(70); while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } nCross=0; turn_right_senkai; wait(70); until(FastTimer(1) > 6000); SHOTBALL; turn_left_senkai; Wait(70); while (nCross < 1){ while (nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low){ turn_right_kaiten; } else if (SENSOR_1 < WHITE_low){ go_fwd } else if (SENSOR_1 < WHITE_high){ turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; nCross++; nOnline=0; } while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } turn_right_senkai; Wait(70); until(FastTimer(1) > 7500); CATCHBALL; turn_left_senkai; Wait(70); while(counter < 1){ while(nOnline < nMAX){ if (SENSOR_1 < 38){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < 39){ turn_right_kaiten; } else if (SENSOR_1 < 42){ go_fwd; } else if (SENSOR_1 < 44){ turn_left_kaiten; } else { turn_left_senkai; } } nOnline=0; } Wait(STEP); } short_break; turn_left_senkai; Wait(150); go_rev; Wait(100); SHOTBALL; } ボールをシュートしない側 † #define BLACK_high 36 //一番黒いしきい値 #define BLACK_low 38 //少し黒いしきい値 #define WHITE_low 42 //少し白いしきい値 #define WHITE_high 44 //一番白いしきい値 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回する #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左カーブする #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //右カーブする #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回する #define go_fwd OnFwd(OUT_AC); //前進する #define short_break Off(OUT_AC); Wait(100); //小休止する #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る #define TURNSTEP 10 //横のセンサーを使う時の繰り返しの待ち時間 #define time2 10 //シュートしない側が交差点から一回目に前進する時間 #define time3 10 //シュートしない側が交差点から二回目に前進する時間 #define nMAX 300 //交差点と判断する基準 #define STEP 1 //ライントレース時の待ち時間 task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; int nCross=0; ClearTimer(0); while(nCross <= 1){ while(nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_left_senkai ; nOnline++ ; } else if(SENSOR_2 < BLACK_low){ turn_left_kaiten; } else if(SENSOR_2 < WHITE_low){ go_fwd; } else if(SENSOR_2 < WHITE_high){ turn_right_kaiten; } else { turn_right_senkai; } } nOnline == 0; nCross ++; short_break; cross_line; } nCross=0; go_fwd; Wait(500); OnRev(OUT_A); OnFwd(OUT_C); Wait(100); //ボールの方向を向く CATCHBALL; OnFwd(OUT_AC); Wait(200); //ボールを取る until(SENSOR_1 < BLACK_low){ turn_left_kaiten; } //コースに戻る while(nCross <= 1){ if(SENSOR_1 < BLACK_high){ turn_left_senkai; nOnline ++; } else if(SENSOR_2 < BLACK_low){ turn_left_kaiten; } else if(SENSOR_2 < WHITE_low){ go_fwd; } else if(SENSOR_2 < WHITE_high){ turn_right_kaiten; } else { turn_right_senkai; } } nCross=0; turn_left_senkai; Wait(70); until(FastTimer(1) > 4500); SHOTBALL; turn_right_senkai; Wait(70); while(nCross <= 1){ if(SENSOR_1 < BLACK_high){ turn_left_senkai; nOnline ++; } else if(SENSOR_2 < BLACK_low){ turn_left_kaiten; } else if(SENSOR_2 < WHITE_low){ go_fwd; } else if(SENSOR_2 < WHITE_high){ turn_right_kaiten; } else { turn_right_senkai; } } nCross=0; while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } turn_left_senkai; Wait(70); until(FastTimer(1) > 6000); CATCHBALL; turn_right_senkai; Wait(70); while (nCross < 1){ while (nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low){ turn_right_kaiten; } else if (SENSOR_1 < WHITE_low){ go_fwd } else if (SENSOR_1 < WHITE_high){ turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; nCross++; nOnline=0; } turn_left_senkai; Wait(70); until(FastTimer(1) > 7500); SHOTBALL; } ボールをシュートする側のプログラムの説明 † まずはライントレースを行う際ののしきい値と、ライントレース行う際にによく使う一連の動きを定義する。 さらにこの課題で重要な動きであるボールの発射と受け取りの動作を定義する。 最後に時間関係の定数を定義する。 定義 † #define BLACK_high 36 //一番黒いしきい値 #define BLACK_low 38 //少し黒いしきい値 #define WHITE_low 42 //少し白いしきい値 #define WHITE_high 44 //一番白いしきい値 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回する #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左カーブする #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //右カーブする #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回する #define go_fwd OnFwd(OUT_AC); //前進する #define short_break Off(OUT_AC); Wait(100); //小休止する #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る #define time2 10 //シュートしない側が交差点から一回目に前進する時間 #define time3 10 //シュートしない側が交差点から二回目に前進する時間 #define nMAX 300 //交差点と判断する基準 #define STEP 1 //ライントレース時の待ち時間 スタートから第一のパス † まずはスタート位置から二回交差点をこえるまでライントレースを行う。 二回目の交差点をこえたら左に旋回してパスをもらう準備をする。 スタートしてからの時間がある点をこえたときにパスをする。 そのままボールを持ちながら進む方向へと向きを変える。 task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; int nCross=0; int counter=0; while (nCross < 2) { //交差点までのライントレース while (nOnline < nMAX) { if(SENSOR_1 < BLACK_high) { turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low) { turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける short_break; nCross++; nOnline=0; } turn_left_senkai; Wait(70); until(FastTimer(1) > 4500); CATCHBALL; turn_left_senkai; Wait(70); 第一パスから第二パス † 第一パスを終えたらそのままライントレースを行い交差点まで行く。 交差点をこえた時から時間をはかり二つの交差点の中心までライントレースする。 中心についたら右に旋回してパスを待つ。 再びスタートしてからの時間がある点をこえたときにパスをする。 パスを打ち終わったら元の向きに戻る。 while (nCross < 1){ while (nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low){ turn_right_kaiten; } else if (SENSOR_1 < WHITE_low){ go_fwd } else if (SENSOR_1 < WHITE_high){ turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; nCross++; nOnline=0; } while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } nCross=0; turn_right_senkai; wait(70); until(FastTimer(1) > 6000); SHOTBALL; turn_left_senkai; Wait(70); 第二パスから第三パス † ここは第一から第二とほぼ同じ動きをする。 違うところは交差点から時間で進むときの距離が短いことである。 while (nCross < 1){ while (nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low){ turn_right_kaiten; } else if (SENSOR_1 < WHITE_low){ go_fwd } else if (SENSOR_1 < WHITE_high){ turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; nCross++; nOnline=0; } while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } turn_right_senkai; Wait(70); until(FastTimer(1) > 7500); CATCHBALL; turn_left_senkai; Wait(70); 第三パスからシュート † まずはゴール近くの交差点までひたすらライントレースを行う。 この交差点を基準にすることで時間指定するよりも誤差が減少し、シュート成功確率も上がる。 あとは左に旋回し、後ろに少し下がってからシュートを打つ。 後ろに下がるのは規定に「輪の中に入った状態でシュートをしてはいけない」とあるからである。 while(counter < 1){ while(nOnline < nMAX){ if (SENSOR_1 < 38){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < 39){ turn_right_kaiten; } else if (SENSOR_1 < 42){ go_fwd; } else if (SENSOR_1 < 44){ turn_left_kaiten; } else { turn_left_senkai; } } nOnline=0; } Wait(STEP); } short_break; turn_left_senkai; Wait(150); go_rev; Wait(100); SHOTBALL; } ボールをシュートしない側のプログラムの説明 † 定義 † #define BLACK_high 36 //一番黒いしきい値 #define BLACK_low 38 //少し黒いしきい値 #define WHITE_low 42 //少し白いしきい値 #define WHITE_high 44 //一番白いしきい値 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回する #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左カーブする #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //右カーブする #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回する #define go_fwd OnFwd(OUT_AC); //前進する #define short_break Off(OUT_AC); Wait(100); //小休止する #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る #define TURNSTEP 10 //横のセンサーを使う時の繰り返しの待ち時間 #define time2 10 //シュートしない側が交差点から一回目に前進する時間 #define time3 10 //シュートしない側が交差点から二回目に前進する時間 #define nMAX 300 //交差点と判断する基準 #define STEP 1 //ライントレース時の待ち時間 ここはシュートする側とほぼ同じである。 進む時間に微妙な違いがある。 スタートからボールを取るまで † まずは交差点までライントレースを行う。 交差点をこえたら一定時間直進をし、そのまま右に旋回しボールに向く。 ボールに向いたらそのまま直進しボールを取る。 task main(){ SetSensor(SENSOR_2,SENSOR_LIGHT); int nOnline=0; int nCross=0; ClearTimer(0); while(nCross <= 1){ while(nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_left_senkai ; nOnline++ ; } else if(SENSOR_2 < BLACK_low){ turn_left_kaiten; } else if(SENSOR_2 < WHITE_low){ go_fwd; } else if(SENSOR_2 < WHITE_high){ turn_right_kaiten; } else { turn_right_senkai; } } nOnline == 0; nCross ++; short_break; cross_line; } nCross=0; go_fwd; Wait(500); OnRev(OUT_A); OnFwd(OUT_C); Wait(100); //ボールに向く CATCHBALL; OnFwd(OUT_AC); Wait(200); //ボールを取る ボールを取ってから第一パスまで † ボールを取ったらラインを感知するまで左に進み、ラインに乗ったらライントレースを開始する。 交差点までライントレースを行い、交差点を感知したらコース内側を向いてパスの準備をする。 スタートしてからの時間がある点をこえたところでパスをして、そのまま元の向きに戻る。 until(SENSOR_1 < BLACK_low){ turn_left_kaiten; } //コースに戻る while(nCross <= 1){ if(SENSOR_1 < BLACK_high){ turn_left_senkai; nOnline ++; } else if(SENSOR_2 < BLACK_low){ turn_left_kaiten; } else if(SENSOR_2 < WHITE_low){ go_fwd; } else if(SENSOR_2 < WHITE_high){ turn_right_kaiten; } else { turn_right_senkai; } } nCross=0; turn_left_senkai; Wait(70); until(FastTimer(1) > 4500); SHOTBALL; turn_right_senkai; Wait(70); 第一パスから第二パス † 第一パスを終えたら再び時間指定付きライントレースを行う。 ここの距離は短いので誤差は少なくて済む。 ある点まですすんだらコース内側を向き、パスの準備をする。 スタートしてからの時間がある点をこえたところでパスをして、そのまま元の向きに戻る。 while (FastTimer(0) <= time2){ if(SENSOR_1 < BLACK_high) { turn_right_senkai; } else if (SENSOR_1 < BLACK_low) { back_turn_right_kaiten; } else if (SENSOR_1 < WHITE_low) { go_fwd; } else if (SENSOR_1 < WHITE_high) { back_turn_left_kaiten; } else { turn_left_senkai; } Wait(STEP); } turn_left_senkai; Wait(70); until(FastTimer(1) > 6000); CATCHBALL; turn_right_senkai; Wait(70); 第二パスから第三パス † 第二パスを終えたら次の交差点までライントレースを行う。 交差点をこえたら少し進んでから左に旋回してコース内側を向く。 スタートしてからの時間がある点をこえたところでパスをする。 while (nCross < 1){ while (nOnline < nMAX){ if(SENSOR_1 < BLACK_high){ turn_right_senkai; nOnline++; } else { if (SENSOR_1 < BLACK_low){ turn_right_kaiten; } else if (SENSOR_1 < WHITE_low){ go_fwd } else if (SENSOR_1 < WHITE_high){ turn_left_kaiten; } else { turn_left_senkai; } nOnline==0; } Wait(STEP); } PlaySound(SOUND_UP); short_break; nCross++; nOnline=0; } turn_left_senkai; Wait(70); until(FastTimer(1) > 7500); SHOTBALL; }