A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する.
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること.
小さなカーブも回れるように,出来るだけ小型化しようとしたが,最終的には,最初のものと同じものになってしまった.
コース上の色の識別が正確にできるように,地面すれすれの場所に取り付けた.
今回最も苦労したのがアームの部分だった.写真の通り,モーターが回転すると,隣り合う歯車に回転が伝わり,アームが動く仕組みである.ボールを持ち上げて運ぶのは大変そうだったので,アームで掴んだ後,引きずって運ぶことにした.シュートをする時は,ロボットを急停止させることで,慣性力を利用した.
光センサーによって感知する色を黒(<39),黒っぽい灰色(>39),灰色(>42),白っぽい灰色(>45),白(>48)の5段階に分けた.
また、プログラミングを簡略化するために以下の定義を用いた。
#define turn_right OnFwd(OUT_B,25);OnRev(OUT_A,25); //右回り
#define turn_left OnFwd(OUT_A,25);OnRev(OUT_B,25); //左回り
#define right OnFwd(OUT_B,25); //右曲がり
#define left OnFwd(OUT_A,25); //左曲がり
直角の交差点は,カーブに比べて,黒い部分に滞在する時間が長くなるので,その時間差を利用して認識する.試行錯誤した後,0.22秒間で直角の交差点で止まり,カーブでは進み続けることが分かった.
void follow_line() {
SetSensorLight(S3); long t0=CurrentTick();
while(CurrentTick()-t0<220) //CurrentTick()-t0が0,22秒未満の限り続ける if(SENSOR_3>48){ turn_right; t0=CurrentTick(); //CurrrentTickをt0に戻す }else if(SENSOR_3>45){ right; t0=CurrentTick(); //CurrrentTickをt0に戻す }else if(SENSOR_3>42){ OnFwd(OUT_AB,100); t0=CurrentTick(); //CurrrentTickをt0に戻す }else if(SENSOR_3>39){ left; t0=CurrentTick(); //CurrrentTickをt0に戻す }else{ turn_left; CurrentTick(); } Off(OUT_AB);
}
sub kousaten() {
SetSensorLight(S3); long t0=CurrentTick();
while(CurrentTick()-t0<220) if(SENSOR_3>48){ turn_right; t0=CurrentTick(); }else if(SENSOR_3>45){ right; t0=CurrentTick(); }else if(SENSOR_3>42){ OnFwd(OUT_AB,100); t0=CurrentTick(); }else if(SENSOR_3>39){ left; t0=CurrentTick(); }else{ turn_left; CurrentTick(); }
right; //向きを修正 Wait(500); OnFwd(OUT_BC,30); //交差点を進む Wait(300);
}
task main() {
OnRev(OUT_C,30); //アームを閉じる Wait(400);
}
task main() {
M~K
follow_line();
K~L
right; //機体を真っ直ぐにする Wait(1200); OnFwd(OUT_AB,30); Wait(1500);
ボールを掴む
OnRev(OUT_C,30); Wait(400);
L~K
OnRev(OUT_AB,30); Wait(2500); follow_line(); left; //曲がる Wait(1000);
K~J
follow_line(); left; //曲がる Wait(1800);
J~I
follow_line(); right; //曲がる Wait(500);
I~H
follow_line(); right; //曲がる Wait(500);
H~F
follow_line(); left; //直角に曲がる Wait(3000);
F~E
follow_line(); left; //直角に曲がる Wait(1500);
E~D
follow_line(); OnFwd(OUT_AB,30); //交差点を進む Wait(300);
D~C
follow_line(); OnFwd(OUT_AB,30); //交差点を進む Wait(300);
C~B
follow_line();
シュート
OnRev(OUT_AB,30); //一旦戻って助走をつける Wait(500); OnFwd(OUT_C,30); //アームを開く Wait(200); OnFwd(OUT_AB,30); Wait(500);
}
今回のプログラミングでは,大カーブや交差点の通過をすることが出来たが,結局,小カーブのライントレースは出来なかった.なので,最初から最後まで自動的に進むプログラミングを作成出来ず残念だった.まだまだ改善点はあったと思うので、次回の課題3では,きちんとしたプログラミングを作成出来るよう,頑張りたい.