下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
次のコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。 自分は以下の第1コースを担当した。
コップをつかむアームを図のように作った。片方のアームにギアをつけてモーターにつなぐことで動かし、挟むようにした。
コップをつかむアーム部分を車体の前に出し、取りやすくした。
トレースのための光センサは車体とアームの間につけ、小回りが利くようにした。
トレースが安定する光センサの位置を探し、図の高さにつけることにした。
#define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C);//右旋回 #define rightMAGARU OnFwd(OUT_A);Off(OUT_C);//右折 #define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A);//左旋回 #define leftMAGARU OnFwd(OUT_C);Off(OUT_A);//左折 #define middle 41 //閾値 #define ch OnFwd(OUT_B);Wait(10);Off(OUT_B);//コップをつかむ #define re OnRev(OUT_B);Wait(5);Off(OUT_B);//コップを放す #define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//t秒前進 #define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//t秒後退 #define cross_stop Off(OUT_AC);Wait(100);//交差点停止
基本的なラインの右側トレースを以下のように定義した。また、左右を逆にしたものをl()として左側トレースも定義した。また、連続して黒線上の右旋回の経過時間を測定し、0.2以上になった時には交差点と判断させた。
sub r() { SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサを端子2にセット ClearTimer(0); //タイマーリセット while(FastTimer(0)<=20) //0.2秒以内黒の線を連続して感知した場合ループ、それ以上は次の動作へ { if(SENSOR_2>middle+5) //閾値より5大きい時左旋回 { leftSENKAI ClearTimer(0); } else if(SENSOR_2>middle+3) //閾値より3大きい時左折 { leftMAGARU ClearTimer(0); } else if(SENSOR_2>middle) //閾値の時直進 { OnFwd(OUT_AC); ClearTimer(0); } else if(SENSOR_2>middle-3) //閾値より3小さい時右折 { rightMAGARU ClearTimer(0); } else { rightSENKAI //上記の条件以外の時右旋回 } //この時タイマーをリセットしていないので右旋回の時間が0.2以上で交差点と判断。 } Off(OUT_AC); }
task main () {r(); //AB間 cross_stop; //一時停止 go(35); //位置合わせ r(); //BC間 cross_stop; //一時停止 leftSENKAI; //位置合わせ Wait(30); r(); //CF間 cross_stop; //一時停止 go(35); //位置合わせ r(); //FE間 cross_stop; //一時停止 go(25); //ラインの左側へ移動 l(); //ER間 cross_stop; //一時停止 rightSENKAI; //位置合わせ Wait(30); l(); //RP間 cross_stop; //一時停止 ch; //コップをつかむ go(25); //位置合わせ l(); //PQ間 go(20); //ラインの右側へ移動 r(); //QS間 cross_stop; //一時停止 go(30); //位置合わせ r(); //円Yの外周 cross_stop; //一時停止 go(50); //位置合わせ leftSENKAI; //ラインの左側へ移動 Wait(65); l(); //SF間 cross_stop; //一時停止 ch; //コップの持ち直し leftSENKAI; //コップを円に入れる Wait(160); re; //コップを放す back(45); //後退 rightSENKAI; //元に戻す Wait(160); r(); //FC間 cross_stop; //一時停止 rightSENKAI; //Dに入るため回転 Wait(90); go(90); //ゴール }
ライントレースにおいて重要な役割を果たす光センサーの位置調整に苦労したが、本番ではうまくいった。アームの力が少し弱かったため何度かつかむプログラムを入れたが途中で放してしまって残念だった。ミッションを成功させることができてよかった。