1.光センサーを一つだけ用いて、ライントレースして逃げつづける。その際、ロボット後部にはもう一つセンサーをつけ、常に光を発するようにする。
2.前者のロボット後部の光センサーから発せられる光を検出し逃げるロボットを追いかけて、届くところまで着たら弾代わりの黄色いホイールを逃げるロボットめがけて投げつける。
つまり、最初に検出した光の強さを仮の最大値とし、ロボットを回転させる、そこで、もし次に検出された光の値が仮の最大値よりも大きかった場合には、最初に決定した仮の最大値を次に出てきた光の強さの値に入れ替える。これを一回転やることで、最大値を決定する。
#define right OnFwd(OUT_A);Wait(search_time);Off(OUT_A); //右に曲がる動きを定義 #define left OnRev(OUT_A);Wait(search_time);Off(OUT_A); //左に曲がる動きを定義 #define search_time 2 //左右に首を振る時間を0.02秒と定義 #define THRESHOLD 45 //閾値を45と定義 task_main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと宣言 while(true) { if(SENSOR_1<THRESHOLD) //センサー1の値が閾値より小さい、すなわち黒線上の場合…↓ { right; //右に曲がる until(SNESOR_1>THRESHOLD); //センサー1が閾値より大きい、すなわち黒線外になったら…↓ left; //左に曲がる } } //これを繰り返す。 }
int Light_max; //Light_maxという変数を定義 sub tamaokuri_tobasu() //弾を装填して飛ばすサブルーチン { SetPower(OUT_B,1); //モーターBの馬力を1(最小)に設定 SetPower(OUT_C,7); //モーターCの馬力を7(最大)に設定 while(true) { if(SENSOR_1 == Light_max) //センサー1がLight_maxの値をとったとき { OnFwd(OUT_B); //モーターB(ベルトコンベアー)を回転して弾を装填 until(SENSOR_3 > 38); //センサー3が弾に反応したら…↓ Off(OUT_B); //モーターBを停止(弾装填停止) } else //センサー1がLight_maxではないとき { Off(OUT_B); //ベルトコンベアーを1秒間停止 Wait(100); } if(SENSOR_3 < 38) //センサー3が閾値より小さい値の時(弾がない時) { Off(OUT_C); //モーターCを停止(打ち出しアームを停止) } else //センサー3が閾値より大きい値の時(弾があるとき) { OnRev(OUT_C); //モーターC(打ち出しアーム)を半回転して弾を打ち出し Wait(11); Off(OUT_C); //そのまま停止 } } //以上を繰り返す } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義(閾値35) SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2を光センサーと定義(閾値38) ClearTimer(0); //タイマをリセット Light_max = 0; //変数をリセット while(true) { while(Timer(0)<=48) //4.8秒間whileの中を実行する { OnFwd(OUT_A); //右回りをして各部分の光量を計測 if(SENSOR_1 > Light_max) //もしセンサー1よりLight_maxが大きかったら…↓ { Light_max = SENSOR_1; //その値をセンサー1とする } } OnFwd(OUT_A); until((SENSOR_1==Light_max)); //センサー1がLight_maxの値になる場所まで右回転する Off(OUT_A); tamaokuri_tobasu(); } //以上を繰り返す。 }
sub tamaokuri_tobasu() { SetPower(OUT_B,1); //モーターB(ベルトコンベア)のトルクを1に設定 SetPower(OUT_C,7); //モーターC(打ち出しのアーム)のトルクを7に設定 SetSensor(SENSOR_1,SENSOR_LIGHT); //閾値35 SetSensor(SENSOR_3,SENSOR_LIGHT); //閾値38 while(true) { if(SENSOR_1 ==Light_max) { OnFwd(OUT_B); Wait(100); Off(OUT_B); //ベルトコンベアでホイールを運搬 OnRev(OUT_C); Wait(11); Off(OUT_C); //打ち出し用アームでホイール打ち出し } //光センサーが相手のマシンを見つけたらベルトコンベアで砲撃用のホイールを運び出し、打ち出す。 else { Off(OUT_B+OUT_C); Wait(100); } //相手のマシンが見当たらない時はベルトコンベアも打ち出しアームも静止させておく。 } } task main() { int Light_max=0; //光の最大値用の変数 ClearTimer(0); //Timer(0)をリセット while(Timer(0)<=300) { if(SENSOR_1<THRESHOLD){ //最初にライン上(黒)の場合 OnFwd(OUT_C);Wait(15); //左に逸らす if(SENSOR_1>THRESHOLD) { OnRev(OUT_C);Wait(15); //右に逸らす } } if(SENSOR_3>60) { Light_max=SENSOR_3; // Light_maxに観測値を代入 if(SENSOR_3>Light_max) { Light_max=SENSOR_3; // Light_maxに観測値lを代入(Light_maxを更新) } } } if(SENSOR_3>=(Light_max)){ //SENSOR_3がLight_max(相手の光)を感知したら…↓ repeat(16){ //5秒間追跡する OnFwd(OUT_C);Wait(15); OnRev(OUT_C);Wait(15); } tamaokuri_tobasu(); //弾を打つ } } Off(OUT_C); }
今回のマシンはとても大型になった。 ブロックの接合等、工夫すべき点はいくつかあったようにも思えたが、思うように動いたのでよしとしたい。 今回も、他のチームに比べて後れをとってしまう形になった。ロボコンの時はもっと頑張りたい。