各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)
2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい)
ただし、速さと正確さを追求すること コースを3周したら自動的に止まること
↓↓最初のコース
交差点が直角じゃないとうまくライントレースできないと思い... コース変更!
うまくライントレースするようになりました。
まずは光センサーについて
ななめから...
この位置に光センサーを付けました。
正面から...
1個ではなく、2個でラインを挟むように付けました。
下からの図...
うまくライントレースできます。
次はタッチセンサーについて
まずは斜めから...
紙パックをつかむようにしたのですがうまくいかず、単純に押すようにしました。
正面から...
この長さが、ちょうど紙パックに反応する長さだった。これ以上長くすると、走っているときに振動でタッチセンサーが発動してしまいます。
#define gofront(t) OnFwd(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); #define goback(t) OnRev(OUT_A+OUT_C);Wait(t);Float(OUT_A+OUT_C); #define gostraight OnFwd(OUT_A+OUT_C); #define close OnRev(OUT_B);Wait(40);Off(OUT_B); #define open OnFwd(OUT_B);Wait(40);Off(OUT_B); #define THRESHOLD 40 int x = 0; task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); SetPower(OUT_A,5); SetPower(OUT_C,5); while (true) { gostraight OnFwd(OUT_B);
if (SENSOR_1 < THRESHOLD) { //左の光センサー黒い線の上にあるとき OnRev(OUT_A); Wait(3); OnFwd(OUT_A); } else if (SENSOR_3 < THRESHOLD) { //右のセンサー黒い線のにあるとき OnRev(OUT_C); Wait(3); OnFwd(OUT_C); } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //交差点のにあるとき gofront(20) x = x + 1;
}else if (SENSOR_2 == 1) { //牛乳パックにぶつかったとき ClearTimer(0); goback(110) gofront(70)
} else if (( Timer(0) <= 55) && (SENSOR_2 == 1)) { Float(OUT_A+OUT_C+OUT_B); close OnRev(OUT_B); gofront(120) OnFwd(OUT_C);OnRev(OUT_A); Wait(200); Float(OUT_A+OUT_C); Off(OUT_B); open goback(70); OnFwd(OUT_A);OnRev(OUT_C); Wait(130); } else if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD) && (x ==2)){ Float(OUT_A+OUT_C); break; } } }
#define THRESHOLD 45 //しきい値を決める int flag = 0; //ループを抜け出すためのフラグ用変数 task main () { SetSensor (SENSOR_1, SENSOR_LIGHT ); //センサー1を光センサーに SetSensor (SENSOR_2, SENSOR_TOUCH ); //センサー2をタッチセンサーに SetSensor (SENSOR_3, SENSOR_LIGHT ); //センサー3を光センサーに While ( flag < 19 ){ //交差点を19回通ったら停止(3周なので) if ( SENSOR_2 == 1 ){ //タッチセンサーが発動したら OnRev(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); OnRev(OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); Wait(250); OnRev(OUT_A); OnFwd(OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); Wait(250); OnFwd(OUT_A); OnRev(OUT_C); Wait(50); //紙パックを避けるプログラム } else{ //タッチセンサーが発動してない場合 if ( SENSOR_1 > THRESHOLD ){ //右センサーは白で、 if ( SENSOR_3 > THRESHOLD ){ //左センサーも白なら OnFwd(OUT_A+OUT_C); //直進 } else { //左センサーは黒なら OnFwd(OUT_A); Off(OUT_C); //左のほうに曲がる } } else { //右のセンサーは黒で if ( SENSOR_3 > THRESHOLD ){ //左センサーは白なら、 Off(OUT_A); OnFwd(OUT_C); //右のほうに曲がる } else { //左センサーも黒なら OnFwd(OUT_A+OUT_C);直進 flag++; //交差点カウンター+1 } } } } Off(OUT_A+OUT_C); //終わり!!
ちょうど3周したときに止まるにはどうすればいいかをすごく悩みましたが、交差点を通った数にするようにしました。ロボットも工夫したので、見てほしいです。(naoto)