#define THRESHOLD 47 // 閾値 #define SPEED_H 50 // 通常時の速度 #define SPEED_L 30 // 旋回時の速度 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H, SPEED_H); // 前進する #define turn_left1 OnRL(SPEED_L, -SPEED_L); // 左旋回する #define turn_left0 OnRL(SPEED_L, 0); // 左折する #define turn_right0 OnRL(0, SPEED_L); // 右折する #define turn_right1 OnRL(-SPEED_L, SPEED_L); // 右旋回する #define STEP 1 // 1回の判断で動作させる時間 #define nMAX 250 //通常のカーブとして認識できる回数のの最大値 #define short_break Off(OUT_BC); Wait(100); // 少し止まる #define CROSS_TIME 600 // 交差点を渡る時間 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //T字路を渡る #define shoot_back OnRL(-SPEED_L,-SPEED_L);Wait(CROSS_TIME);short_break; //シュート位置の調整のための後退 #define ball_lock OnFwd(OUT_A,-40);Wait(500) //ボールをロックする #define shoot_ball OnFwd(OUT_A,70);Wait(1); //ボールをシュートする task main() { SetSensorLight(S3); int black_count=0; // 続けて黒になった回数 (カウンタ) int cross_count=0; // T字路を認識した回数 long startTime; // 競技が始まった時間 long cross1Time; // 1回目のT字路を認識し渡り終わった時間 startTime = CurrentTick(); //競技が始まった時間を記録させる go_forward //ボールの位置まで前進する Wait(500); Off(OUT_BC); ball_lock; //ボールをロックする Off(OUT_A); turn_right0;Wait(1500); //ラインに戻るように右折する Off(OUT_BC); while (cross_count < 2) { while(CurrentTick() - startTime < 12000){ // 競技が始まってから12秒間T字路を認識せず進む if (SENSOR_3 < THRESHOLD-12) { // センサーの値が35より低いとき左に旋回 turn_left1; } else { if (SENSOR_3 < THRESHOLD-7) { // センサーの値が36〜39の場合、左に旋回 turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { // センサーの値が41〜53の場合、前進する go_forward; } else if (SENSOR_3 < THRESHOLD+15) { // センサーの値が54〜61の場合、右旋回する turn_right1; } else { // どの条件にも合わない場合右旋回する turn_right1; } Wait(STEP); } while ((black_count < nMAX)&&(cross_count < 1)){ // T字路を認識するプログラムで動く if (SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る cross_count++; // T字路を認識したカウンターを1増やす black_count=0; // カウンタをリセット cross1Time = CurrentTick(); // 1回目のT字路を渡り終わった時間を記録する while (CurrentTick() - cross1Time < 16000){ // T字路を渡ってから16秒間T字路を認識せず進む if(SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } while (black_count < nMAX){ // T字路を認識するプログラムで進む if (SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る cross_count++; black_count=0; //カウンタをリセット if(cross_count == 2){short_break; // 2回目のT字路を認識したらシュートする shoot_back; shoot_ball; Off(OUT_BC); } } }
このプログラムは左図の赤い矢印のようにラインの左側をトレースを行うプログラムである。
初めは簡単に課題をクリアできると思っていたけれど、実際に課題に取り組んでみるとロボット自体を大幅に改良する必要があり、アームの構造を考え形にすることは思っていたよりかなり難しかった。プログラムも考えは思いついたもののそれを実際にプログラムとして書くことはなかなかできなくとても苦労した。プログラムが書けた後もライトセンサの値など調整をする必要があり課題をクリアするのには時間がかかった。しかし、相方とうまく時間を合わし協力して課題に取り組むことができたので無事課題をクリアでき満足のいくロボットを作ることができた。 上手くいかないところもあったが、自分が思っていた通りにロボットが動いた時はとてもう嬉しく、達成感がすごくあった。 次の課題も上手くいくように頑張ろうと思う。