清原 雅司 (kiyo)
須藤 海志 (sudo)
今まで使っていたドライブベースにセンサーをつけたまんまモーターを単純に接続しました。結果、前方に大きく伸びた形で、カブトムシみたいにになりました。
アームに付いたかごを下ろすことでピンポン玉を取ります。衝撃でアームが壊れないように穴あきの黒くて長いブロックで補強しました。ロボットの動くときにかごの中でピンポン玉が動き回っていましたが、何とかキープできそうだったのでそのままにしました。
みんなと同じことをやるのはつまらないと思い、黒い線の縁でトレースするのではなく、 線上でトレースして走るようにプログラミングしました。
結果、交差点でのプログラムが必要ないので割と単純なプログラムになりました。 しかしこれだと交差点のプログラムを入れていないので評価が落ちるのではないか、 と途中で思いましたがこのまま続けることにしました。
#define BLACK 40 // 黒と認識する閾値を"40"とする。 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); // 左のタイヤを前に回し、右のタイヤを後ろに回して右に回転する。 #define turn_left OnFwd(OUT_C);OnRev(OUT_A); // 右のタイヤを前に回し、左のタイヤを後ろに回して左に回転する。 #define right_time 20 // 右に回転する時間を"20"センチ秒にする。 #define down OnRev(OUT_B);Wait(12);Off(OUT_B); // アームを下げる。 #define step1 358 // スタートからピンポン玉をとる直前までの時間を"358"センチ秒とする。 #define step2 2470 // ピンポン球をとった後からシュートする直前までの時間を"2470"センチ秒とする。 sub go() // "進む"というサブルーチンのプログラム。 { if (SENSOR_2 < BLACK) { // SENSOR_2の値が黒の閾値以下であり、黒と認識すれば、 OnFwd(OUT_AC); // 左右のタイヤの両方を前に回し前に進む。 } else if (SENSOR_2 > BLACK){ // SENSOR_2の値が黒の閾値以上であり、黒でないと認識すれば、 turn_right; // 右回転を始める。 ClearTimer(1); // タイマー1を0にする。 while (FastTimer(1) <= right_time){ // タイマー1が右に回転する時間を数えるまでに、 if (SENSOR_2 < BLACK){ // SENSOR_2の値が黒の閾値以下であり、黒と認識すれば、 Wait(15); // 15センチ秒だけさらに回転し、 Off(OUT_AC); // 左右のタイヤを止める。 } } turn_left; // 黒と認識せずに右に回転する時間をタイマー1が数えたら、 until (SENSOR_2 < BLACK); // SENSOR_2の値が黒の閾値以下であり、黒と認識するまで待ち、 Float(OUT_AC); // 左右のタイヤを浮かしながら止める。 } } sub get() // "ピンポン球をとる"というサブルーチンのプログラム。 { Off(OUT_AC);Wait(20); // 左右のタイヤを止め、20センチ秒待つ。 turn_right;Wait(20); // 右に回転して角度を調整する。 Off(OUT_AC);Wait(20); // 左右のタイヤを止め、20センチ秒待つ。 down; // アームを下げてピンポン球をとる。 } sub shoot() // "ピンポン球をシュートする"というサブルーチンのプログラム。 { Off(OUT_AC);Wait(100); // 左右のタイヤを止め、1秒待つ。 turn_right; // 右に回転してゴールを狙う。 Wait(55); // 55センチ秒回転する。 Off(OUT_AC);Wait(100); // 左右のタイヤを止め、1秒待つ。 OnFwd(OUT_ABC); // 左右のタイヤを前に回し前進しながらアームを上げ始める。 Wait(11); // 11センチ秒待つ。 Off(OUT_ABC); // 全てのモーターを止める。 } task main() // メインのプログラム。 { OnFwd(OUT_B);Wait(10);Off(OUT_B); // 初めにアームを上げる。 SetSensor(SENSOR_2, SENSOR_LIGHT); // 光センサーをSENSOR_2にセットする。 ClearTimer(0); // タイマー0を0にする。 while (FastTimer(0) <= step1) { // step1までの間、 Off(OUT_B); // アームを保持する。 go(); // "進む" } get(); // "ピンポン球をとる" ClearTimer(0); // タイマー0を0にする。 while (FastTimer(0) <= step2) { // step2までの間、 go(); // "進む" } shoot(); // "ピンポン球をシュートする" }