下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールは1x16のビーム1本、1x8のビーム2本、およびそれらを接続するためのプレートを使用し、コの字に組み合わせて作る。
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
A地点からB地点へ (P三叉路およびQ交差点はともに直進) B地点からA地点へ (Q交差点では直進、P三叉路では直進) C地点からA地点へ (Q交差点では直進、P三叉路では右折) そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。
ボールの吸収のため、機体の前方にタイヤを横にして釣ったものを左右に設置して、左右のタイヤの間にボールが入るようにした。さらに、右側のタイヤは左回転、左側のタイヤは右回転させた。これにより左右のタイヤがそれぞれ機体の内側に回転しているので、ボールは内部に流れ込み、一度入れば逃げられないようにした。 ボールの放出は、ボールを吸収した左右のタイヤの回転を逆にすることでボールを加速させつつ放出できる。
はじめ、センサーが上手く機能していなかったようで、先生のアドバイスを受け、さらに下方にせんさーを取り付けた。また、機体の後方にセンサーを取り付けた場合、機体の長さゆえに、センサーが働くのが機体がコースから大幅に出てあとになってしまい、進路の修正が面倒になるのでセンサーは前方に取り付けた。
タイヤは左右でそれぞれ一つのモータで動く、計四輪。
機体の前方に多くのパーツを付けたので重心が前方になってしまい、安定して走行できなかったのでおもりを設置した。(特大タイヤ)
左右の動きを繰り返してライントレースを行うので機体が大きく揺さぶられたため特に安定しなかったボールの吸収を行う部分をしっかり固定させた。
A: 左タイヤを動かすモータ
B: 右タイヤを動かすモータ
C: ボールを吸収する車輪を回すモータ
2: ライトセンサー
C から A へ
#define THRESHOLD 48 // 明るさの基準値 int x=0; // 線上にいるとカウントされる変数。 // xが多くカウントされれば線上にいる時間が長い、つまり交差点か三叉路に遭遇したということ int y=0; // 交差点または三叉路に遭遇した回数をカウントする変数 task main() { OnFwd(OUT_C); // ボール吸収 SetSensor(SENSOR_2,SENSOR_LIGHT); while (x<10){ if (SENSOR_2<THRESHOLD-11){ OnFwd(OUT_A);Off(OUT_B); x=x+1; } // 線上なら右旋回 if (SENSOR_2>=THRESHOLD-11&&SENSOR_2<=THRESHOLD-3){ OnFwd(OUT_B);Off(OUT_A); x=0; } // 線上と外の間なら左旋回 if (SENSOR_2>THRESHOLD-3){ OnFwd(OUT_B);OnRev(OUT_A); x=0; } // 線外なら左へ回転 } while (x>=10){ // 線上にいる時間が長いとき while (y<1){ // 1番目は交差点 OnRev(OUT_A);Off(OUT_B);Wait(73); // 直進するための方向へ向き直す OnFwd(OUT_AB);Wait(20); // 交差点を直進 x=0; y=y+1; } // 交差点は一つしかないのでこの動作は一度きり while (y>=1){ if(y>=1&&y<2){ // 二番目のP三叉路はそのままライントレース x=0; y=y+1; }else{ // 三番目はゴール地点 OnRev(OUT_A);Off(OUT_B);Wait(73); // ゴールの方向へ向き直す Off(OUT_AB); // 機体の移動終了 OnRev(OUT_C);Wait(200);Off(OUT_C); // ボール発射 } } } }
センサーが観測する光の値のある値で基準を設定し、定義した。別の動作をする光の条件をその基準の値から調節した。
接触不良や断線などのアクシデントがあって苦労した。 今回のような指定のコースしか走れないプログラムでも作るのは難しかった。 機体の固定はデザイン性に欠け、雑な感じが否めないが、面白い設計になり楽しく製作できた。