目次
今回の課題のうち、CからAへのコースに挑戦した。 黒線の左側をなぞって動くプログラムを組んだ。
光センサーの両脇にアームを取り付け、その上の動作可能なアームでボールが飛び出ないようにふたをするようにした。 これで、多少距離があってもマシン本体にボールを引き寄せることが可能になった。シュートの際はアームを上に上げ、マシン全体で押し出す。アームの先についている車輪からゴムを外すことで、地面に着いた時の摩擦の軽減を狙った。また、コンピューターはパーツに空いている穴の関係でガチガチに固定できなかったので一部分を固定して後はモーターの上にのせた。 前輪と後輪が近いが、これは小回りを利かせるため。
複雑なプログラムになることが予想されたので、多くの定義づけをした。
#define THRESHOLD 40 #define speed1 50 #define speed2 20 #define Onrl(t,u) OnFwd(OUT_B,t);OnFwd(OUT_C,u); #define gost Onrl(speed1,speed1); #define turnleft1 Onrl(speed2,-speed2); #define turnleft2 Onrl(speed2,0); #define turnright1 Onrl(-speed2,speed2); #define turnright2 Onrl(0,speed2); #define step 1 #define nmax 300 #define shortstop Off(OUT_BC);Wait(2000); #define xtime 1000 #define xline Onrl(speed1,speed1);Wait(xtime);shortstop; #define armdown OnFwd(OUT_A,30);Wait(500);Off(OUT_A); #define armup OnRev(OUT_A,30);Wait(500);Off(OUT_A);
光センサーとカウンターをセットした。カウンターは黒を検出した回数をカウントし、連続でnmax以上の回数を検出したときを交差点と認識する。
task main() { SetSensorLight(S3); int kuro=0; while(true){ while(kuro < nmax){ if(SENSOR_3 < THRESHOLD-7) { turnleft1; kuro++; } else { if(SENSOR_3 < THRESHOLD-3) { turnleft2; } else if (SENSOR_3 < THRESHOLD+3) { gost; } else if (SENSOR_3 < THRESHOLD+7) { turnright2; } else { turnright1; } kuro=0; } Wait(step); }
以下は交差点を検出した時のプログラム。turnright1をはさむことで交差点上をまっすぐ通過することに成功した。
shortstop; turnright1; Wait(250); Off(OUT_BC); armdown; xline;
タイマーをセットする。10秒後にシュートに移行。
long time1 = CurrentTick(); kuro=0; while(CurrentTick()-time1 <= 10000){ if(SENSOR_3 < THRESHOLD-7) { turnleft1; kuro++; } else { if(SENSOR_3 < THRESHOLD-3) { turnleft2; } else if (SENSOR_3 < THRESHOLD+3) { gost; } else if (SENSOR_3 < THRESHOLD+7) { turnright2; } else { turnright1; } kuro=0; } Wait(step); }
シュートするプログラム。腕をあげて、ボディ本体で押し出した。
armup; gost; Wait(1000); Off(OUT_BC); } } }
ボールを捉える機構はかなり安定性の高いものができた。 また、可動する腕はボールにふたをするように動くので、シュートはボディで押し出すだけの泥臭いものになってしまった。それはそれで安定性の高いものではあるが、ロボットアームではじき出すようなシュートもできればいいなと思った。 プログラミングでの定義づけが多すぎて逆に混乱してしまった節がある。自分のなかで整理できていなかったことも、反省点の一つだ。 ただ、自分としても驚くほど安定性の高いものが出来上がったのでよかったと思う。