ユーザー名が『tadanobo』となっていますが、漢字で書くと『只野某』で、本当の読み方は『ただのなにがし』です。 目次 #contents *課題の説明 [#yb3b921b] 詳しい説明は[[2014a/Mission1]]を見てください。 &ref(2014a/Member/tadanobo/Mission1/ball2.png,20%); 私は上図のコースを左のゴールから右のスタートに向けて進みます。 なお、ボールは中央交差点と上の交差点の間のカーブ上(上図の青丸)に置かれています。 *ロボット本体 [#p31fe5db] **ドライブベース [#p763e815] ドライブベースは光センサーを2つのモーターの間に入れることでコンパクトにし、小回りを効きやすくしました。 **アーム [#t227c31b] アームはゲージを上から下ろすスタイルになっています。 *プログラム [#k9e1adf3] **定義文 [#ec25770d] #define THRESHOLD 40 //しきい値を40に設定 #define SPEED_H 50 //ハイスピード #define SPEED_L 35 //ロウスピード #define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_X,SPEED_X); //前進 #define spin_left OnRL(SPEED_L,-SPEED_L); //左旋回 #define turn_left OnRL(SPEED_L,0); //左に曲がる #define go_left OnRL(SPEED_H,SPEED_L); //左前進 #define go_right OnRL(SPEED_L,SPEED_H); //右前進 #define turn_right OnRL(0,SPEED_L); //右に曲がる #define spin_right OnRL(-SPEED_L,SPEED_L); //右旋回 #define nMAX 500 #define CROSS_TIME 300 //交差点通過時に前進する時間 #define cross_line go_forward;Wait(CROSS_TIME); //交差点通過 #define STEP 1 #define go_back OnRL(-SPEED_L,-SPEED_L); //後進 #define shoot_ball go_back;Wait(400);OnRev(OUT_B,50);Wait(400);\ go_back;Wait(1000);OnFwd(OUT_B,50);Wait(500);\ OnFwd(OUT_AC,50);Wait(150);OnRev(OUT_B,100);\ Wait(150);Off(OUT_AC); //ボールをゴールに打つ **ライントレース [#ea62200c] 基本的には、光センサーにより明るさを測って、明度の値により左右に曲がらせてライン上を進みます。 task main() { SetSensorLight(S3); //光センサーをセット SetSensorLowspeed(S1); //超音波センサーをセット int nOnline = 0; //左旋回の回数を数える int nCorner = 0; //直角部の数を数える int nCounter = 0; //以下各種カウンターをセット int nCounter2 = 0; int nCounter3 = 0; int SPEED_X = SPEED_H; //前進の速度を設定 while(nCorner < 6) { if(nOnline < nMAX) { //通常のライントレース if(SENSOR_3 < THRESHOLD -12) { spin_right; //ライン上の時右旋回 nOnline++; nCounter2=0; } else if(SENSOR_3 < THRESHOLD -7) { turn_right; //ライン上境界線よりの時右に曲がる nOnline++; nOnline=0; nCounter2=0; } else if(SENSOR_3 < THRESHOLD -3) { go_right; //境界線上ラインよりの時右前進 nCounter2=0; } else if(SENSOR_3 < THRESHOLD +4) { go_forward; //境界線上で前進 nOnline=0; nCounter2++; if(nCounter2 > 200) { SPEED_X = 30; //0.2秒以上前進したら減速する } } else if(SENSOR_3 < THRESHOLD +8) { go_left; //境界線上ライン外よりの時左前進 nCounter2=0; } else if(SENSOR_3 < THRESHOLD +12) { turn_left; //ライン外境界線よりの時左に曲がる nOnline=0; nCounter2=0; } else { spin_left; //ライン外の時左旋回 nOnline=0; nCounter2=0; } Wait(STEP); if(SensorUS(S1) <= 14) { nCounter++; if(nCounter == 300) { OnFwd(OUT_B,50);Wait(500); //超音波センサーが玉を認識しらアームを下ろす } } } 前進のとき勢いでコースアウトするのを防ぐため一定以上前進した時減速するようにしてあります。 **交差点を渡る・直角カーブを曲がる [#ud4897d3] task main() { if((nCorner%4 != 1)&&(nCounter3 != 3)) { //交差点の時 PlaySound(SOUND_UP); spin_left;Wait(nMAX*STEP); cross_line; //交差点を渡る nCounter3++; } else if((nCorner == 1)&&(nCounter3 != 3)) { //直角カーブの時 PlaySound(SOUND_LOW_BEEP); spin_right;until(SENSOR_3 > THRESHOLD +10) } else if(nCounter3 == 3) { //終着点についたら spin_left;Wait(nMAX*STEP); shoot_ball; //玉を打つ } nOnline=0; nCorner++; } } Off(OUT_AC); }