*目次 [#q0beaeb0] #contents *課題の説明 [#ib723224] &ref(./img.jpeg,20%); -画像のようなコースを作成し、与えられた条件を満たしてゴールせよ。 ***条件 [#ndfbf27e] +A,B,Cのいずれかから、それぞれ指定された場所までコースに沿って移動する。(AからB,BからA,CからA) +交差点は曲がらずに通過する。 +途中に設置されたボールをゴールまで持っていく。(可能ならシュートする) *ロボットの説明 [#bd77b578] **本体 [#s425d79f] &ref(./image[2].jpeg,20%); これが今回私たちのチームが制作したロボットです。 アームでボールを囲み、ゴールまで運びます。 **アーム [#ie485727] ***アーム1 [#wf712d8e] &ref(./image.jpeg,13%); 本体の下部にあり、ボールをキャッチし外に出ないようにする役割をもちます。 ***アーム2 [#peeefd4c] &ref(./image[6].jpeg,15%); 本体の上部にあり、最初は開いています。 ボールが射程範囲に入るころに閉じ、ゴールまで運べるようにプログラムしてあります。 シュートのときは再度開きます。 *コンセプト [#a317f46d] 光センサの値が低い(黒〜灰色)ときは右に、高い(灰色〜白)ときは左に曲がります。 そのためラインの左側に沿ってゴールまで移動していきます。 光センサの値が低い場合が続いたら交差点と判断し、突破用のプログラムが作動します。 光センサの値が高い場合が続いたらゴール前だと判断し、シュートして動作を終了します。 ボールは上で書いたように、2つのアームを使って運びます。 シュートはアーム2を開き、体当たりすることで行います。 *プログラム [#ye3fb51e] **マクロ [#y9ccd10e] #define THRESHOLD 39 //光センサの基準値 #define SPEED_H 30 //直線に進むときのスピード #define SPEED_L 20 //曲線に進むときのスピード #define downtime 10000 //ボールが射程範囲に入る時間で、この時間あたりでアーム2を下げる #define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(300); //アーム2を下げる #define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300); //アーム2を上げる #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 #define nMAX 300 //光センサの値が低い状態がこの時間だけ続いたら、交差点突破プログラムを発動する #define CROSS_TIME 200 //交差点突破に必要な時間 #define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500);\ up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); //シュートするプログラム **サブルーチン [#mc07ce40] sub short_break(long s) { int a=0; while(a<1000) { Off(OUT_BC); Wait(STEP); if(CurrentTick()-s<=downtime+1.0 && downtime<=CurrentTick()-s) { down; } a++; } } sub cross_line(long t) { int b=0; while(b<CROSS_TIME) { OnRL(SPEED_L,SPEED_L); Wait(STEP); if(CurrentTick()-t<=downtime+1.0 && downtime<=CurrentTick()-t) { down; } b++; } } sub c_direction(long u) { int c=0; while(c<nMAX) { turn_left1; Wait(STEP); if(CurrentTick()-u<=downtime+1.0 && downtime<=CurrentTick()-u) { down; } c++; } } **メイン [#a1376baa] ***開始から10秒まで [#i2b8cf80] task main() { SetSensorLight(S3); int nOnline=0; long t0=CurrentTick(); int g=0; while (CurrentTick()-t0<10000) { while (nOnline < nMAX) { if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0) { down; } if (SENSOR_3 < THRESHOLD-8) { turn_right1; nOnline++; } else { if (SENSOR_3 < THRESHOLD-5) { turn_right0; } else if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+8) { turn_left0; } else { turn_left1; } nOnline=0; } Wait(STEP); } short_break(t0); c_direction(t0); cross_line(t0); nOnline=0; } ***開始から10秒以降 [#c297922f] while(CurrentTick()-t0>10000.0 && CurrentTick()-t0<10000000.0) { while (nOnline < nMAX) { if(CurrentTick()-t0<=downtime+1 && downtime<=CurrentTick()-t0) { down; } if (SENSOR_3 < THRESHOLD-8) { turn_right1; nOnline++; g=0; } else if (SENSOR_3 >= THRESHOLD+8) { turn_left1; g++; nOnline=0; if(g==nMAX) { nOnline=nMAX; } } else { if (SENSOR_3 < THRESHOLD-5) { turn_right0; } else if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+8) { turn_left0; } nOnline=0; g=0; } Wait(STEP); } if(g<nMAX) { short_break(t0); c_direction(t0); cross_line(t0); nOnline=0; } else if(g==nMAX) { short_break(t0); turn_right1; Wait(nMAX*STEP); goal; t0-=10000000; } } } *結果 [#e41fff56] *苦労したところ・反省点 [#h7ce2d02] **苦労したことと解決法 [#b65b839b] **反省点 [#o868e8fc] *感想 [#f439ae4e]