- 追加された行はこの色です。
- 削除された行はこの色です。
編集中
#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