編集中 #contents *ハード設計 [#u0e00523] **形状 [#k00cbc2b] 今回は二輪車型を採用した。ラインという道路を走るので、この形状が一番適しているのはいうまでもない。 **アーム [#l05776ac] ボールをうまく掴むために、今回は以下のような機構を用意した。~ &ref(A.jpeg); 左右両側から覆うような構造にしたため、動作中で多少角度にブレが生じても、ボールを捕捉できる確率が高くなるようにした。 この気候は、ボールを話した状態ではボールを弾いてキックすることもできる。 &ref(B.jpeg); **工夫点 [#td425d48] +本体とラインセンサーの距離を「近くに置いた」。~ プログラムの項目で説明するが、これは加減が重要で、前回私が作成した文字を書くロボットのペン先の位置と同様に、回転軸の中心にラインセンサーを置いたのでは、プログラム設計上の問題が生じる。プログラムを計画通りに動かすには、回転軸中心の少し前方にラインセンサーを置かなくてはならない。 +比重の高いギアを採用した。~ プログラムを作成していくうちに、一連の課題を「早く」終了するためには、「速い動き」ではなく、「正確な動き」である必要があるとわかった。要するに、安定性のためには低速である必要があるということである。 *プログラム全文 [#w34c4c3b] #define BLACK 37 #define BLACKandGLAY 45 #define GLAYandWHITE 55 #define WHITE 60 #define go OnRev(OUT_BC,35); #define turn_leftFwd OnRev(OUT_B,35);Off(OUT_C); #define turn_rightFwd Off(OUT_B);OnRev(OUT_C,35); #define turn_left OnRev(OUT_B,35);OnFwd(OUT_C,35); #define turn_right OnFwd(OUT_B,35);OnRev(OUT_C,35); #define short_break Off(OUT_BC);Wait(1000); #define back OnFwd(OUT_BC,35); sub Rside_trace() { long t0 = CurrentTick(); while(CurrentTick()-t0<150) { if (SENSOR_3 < BLACK) { turn_right; } else if (SENSOR_3 < BLACKandGLAY) { t0=CurrentTick();turn_rightFwd; } else if (SENSOR_3 < GLAYandWHITE) { t0=CurrentTick();go; } else if (SENSOR_3 < WHITE) { t0=CurrentTick();turn_leftFwd; } else { turn_left;t0=CurrentTick(); }} Off(OUT_BC); } sub Lside_trace() { long t0 = CurrentTick(); while(CurrentTick()-t0<150) { if (SENSOR_3 < BLACK) { turn_left; } else if (SENSOR_3 < BLACKandGLAY) { t0=CurrentTick();turn_leftFwd; } else if (SENSOR_3 < GLAYandWHITE) { t0=CurrentTick();go; } else if (SENSOR_3 < WHITE) { t0=CurrentTick();turn_rightFwd; } else { turn_right;t0=CurrentTick(); }} Off(OUT_BC); } sub Rcross_line() { OnRev(OUT_C,60);Wait(800); Off(OUT_BC); } sub Lcross_line() { OnRev(OUT_B,60);Wait(800); Off(OUT_BC); } sub cross_line() { OnRev(OUT_BC,50);Wait(350); Off(OUT_BC); } task main() { SetSensorLight(S3); while(SENSOR_3>BLACKandGLAY){ go;} go;Wait(800);//AーBへ直進 Rside_trace();//B~Cを右端走行 PlaySound(SOUND_CLICK);//Cを斜め横断する合図 Lcross_line();//Cを左斜めに横断 Lside_trace();//C~Dを左側走行 short_break;//Dで一時停止 PlaySound(SOUND_CLICK);//Dを横断する合図 cross_line();//Dをまっすぐ渡る Lside_trace();//D~Gを左側走行 PlaySound(SOUND_CLICK);//横断する合図 OnFwd(OUT_B,30);OnRev(OUT_C,60);Wait(1300); int n=0;//円周上で横断する回数を定義 while(n<2){ //H,Iで二回。Jで違う挙動を取りたい。 Rside_trace();//円周を右側(外側)走行 n++;//交差点通過時にカウントを1追加 PlaySound(SOUND_CLICK);//横断する合図 OnRev(OUT_B,60);Wait(500);;//交差点通過 } Rside_trace();//円周を右側(外側)走行 PlaySound(SOUND_CLICK);//横断する合図 OnFwd(OUT_B,30);OnRev(OUT_C,70);Wait(900);//JKの右側へ出る Rside_trace();//J~Kを右側走行 PlaySound(SOUND_CLICK);//横断する合図 OnFwd(OUT_C,30);OnRev(OUT_B,70);Wait(1300);//KLの左側へ出る int a=0; int b=0; while((a<2000)&&(b<2500)){ if (SENSOR_3 < BLACK) { b++;turn_left; } else if (SENSOR_3 < BLACKandGLAY) { a++;b++;turn_leftFwd; } else if (SENSOR_3 < GLAYandWHITE) { a++;go; } else if (SENSOR_3 < WHITE) { a++;b++;turn_rightFwd; } else { b++;turn_right;}}//K~Lを左側走行(回数指定で距離を制限) Off(OUT_BC);OnFwd(OUT_A,100);Wait(700);Off(OUT_A);// turn_left OnRev(OUT_B,35);OnFwd(OUT_C,35);Wait(300); Rside_trace();//L~Mを右側走行(白の場合右回転なので方向修正の回転もこれに含まれる) cross_line();//Kを横断 Rside_trace();//K~Mを右側走行 short_break;//Mで一時停止 OnRev(OUT_A,100);Wait(700);Off(OUT_A);//ボールを離す OnRev(OUT_BC,-100);Wait(1000);Off(OUT_BC);//後退 OnRev(OUT_A,-100);Wait(700);Off(OUT_A);//アームもどす OnRev(OUT_BC,100);Wait(1000);Off(OUT_BC);//前進 OnRev(OUT_A,100);Wait(700);Off(OUT_A);//ボールを撃つ OnRev(OUT_BC,100);Wait(500);Off(OUT_BC);//進む } *完成!!!! [#d9fa0eec] https://youtu.be/Uj9U_WkvzWQ