各チームで作成したコースを3周するロボットを製作。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)
2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
ただし、
・速さと正確さを追求すること
・コースを3周したら自動的に止まること
Ds ロボット、プログラム2担当
はいじ プログラム1担当
今回はなるべく小型になるようにしました
タイヤをなるべく近くに寄せて小型化を図る。
出来た結果がこれ↓
またバンパーに突起物を付けて反応しやすいように設計。
ところが、このタイヤだと小回りが利かないためタイヤを変えることに。
タイヤを小型のものにして、小回りが利くように設計。
ところがギアをうまく組むことが出来ず、やむなく後輪駆動に。
(見づらいですが後輪駆動になってます)↓
このときから、紙パックを運ぶための角(?)をつけた。
ところが今度は前輪の力がないため、カーブを曲がりきれないため、またしても改良。
モーターを後ろに取り付けることでギアの問題を解決。
ところがこれだと後ろに重心がいってしまうので、補助タイヤを設置。
また、バンパーがうまく作動しないことがわかったので、さらに改良。
(写真だと牛乳パックになってますが、紙パックの間違いです(^^;))
できたのがコレ↓
今度はバンパーが反応しすぎるため、再度改良。
無駄にデカイ…が、てこの原理を利用しております。
後にバンパーの補助輪のゴムを取り外し、紙パックのみに反応するようにしました(ゴムを付けとくと摩擦でちょくちょく反応してしまうため)。
余談ですが、バンパーが重かったせいか、スピードが極端に落ちてしまいました。(電池切れもありましたが…)
なお光センサーは↓のように車体前部に設置
なにも言うことはあるまい・・・。
見てのとおりです。
強いていうなら右上と左下のカーブが少々きつい位ですかね。
障害物に当たったらそれを次の交差点まで運ぶプログラム(つまり2番のプログラム)。
先にライントレースの基礎部分を書いたが、その後障害物に対するプログラムを作るのに一苦労(ToT)
(運搬プログラムは途中経過です)
#define BORDER 40 //閾値を設定 #define TIME 500 //タイマーの時間を設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); //それぞれのセンサーを指定 int flag=0; while(flag<12){ //交差点を12回またぐ(3周する)まで繰り返します。 if(SENSOR_1>BORDER) {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} //センサーが両方白なら直進 else {OnFwd(OUT_A);OnRev(OUT_C);} //右が黒なら右折 } else{ if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} //左が黒なら左折 else{OnFwd(OUT_A+OUT_C);flag++;} //両方黒ならflagを1足して直進。 } if(SENSOR_2==1) //紙パックにぶつかったら運搬プログラム開始 {OnFwd(OUT_A+OUT_C);Wait(90);flag++; //交差点を通り越してflagを1足して、 until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER)){ if(SENSOR_1>BORDER){ if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} else {OnFwd(OUT_A);OnRev(OUT_C);} } else{ if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} } } //交差点までライントレース OnRev(OUT_A+OUT_C);Wait(60); //少し下がって OnFwd(OUT_A);Wait(50); //右を向いて OnFwd(OUT_C);Wait(140); //進んで OnRev(OUT_A);Wait(100); //左向いて OnFwd(OUT_A);Wait(140); //また進んで OnRev(OUT_C);Wait(50); //もう一回進んで OnRev(OUT_A);Wait(70); //ちょっと下がって紙パックを交差点に押し戻し、 flag++; //flagを1足す。そしてライントレース再開。 } } ClearTimer(0); while(Timer(0)<=TIME) {if(SENSOR_1>BORDER) {if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);} else {OnFwd(OUT_A);OnRev(OUT_C);} } else {if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);} else {OnFwd(OUT_A+OUT_C);} } } Off(OUT_A+OUT_C);} //12回交差点を通ったら、元の位置まで進んで終了!!
タッチセンサーの感度に踊らされ、運送プログラムの設定に頭を悩まされた。というより確認が出来なかった。
#define THRESHOLD 40 //閾値設定 task main() { int i; i=0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); while(i<12){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ OnFwd(OUT_A+OUT_C); //線上を直進 }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ Off(OUT_A); OnFwd(OUT_C); //左折 }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ Off(OUT_C); OnFwd(OUT_A); //右折 }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ OnFwd(OUT_A+OUT_C); //交差点に来た時 i=i++; //最後にiに1を足す } if(SENSOR_2==1){ //障害にぶつかった時 turn(); //サブルーチンturnを発動 } ClearTimer(0); while(Timer(0)<=500){ if(i==12){ OnFwd(OUT_A+OUT_C); Off(OUT_A+OUT_C); //3周して5秒したら止まる }} }} sub turn() //障害にぶつかった時の反応 { OnRev(OUT_A+OUT_C); Wait(150); Off(OUT_A+OUT_C); Wait(200); //一旦下がって待つ OnFwd(OUT_A); Off(OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); Off(OUT_A); Wait(100); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_C); Off(OUT_A); Wait(100); OnFwd(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); Off(OUT_C); Wait(100); //回り込む }
思ったより早い段階でライントレースのプログラムだけは作れることが出来た。また、今回はロボットも様々な工夫(タッチセンサーやロボットの小型化等)をこらすことが出来たので良かった。byDs
タッチセンサーを如何に反応させるかが今回最大の問題点だった。そのために運搬プログラムに時間がかかってしまった。別口で運搬プログラムを作れば良かったかもしれない。
また、ロボット自体は小型化できたが、バンパーが大きくなってしまったのは残念だった。
途中電池が弱くなり、モーターやセンサーの調子が悪くなり、そのままやっていた時期があったので、もしかしたらバンパーを変える必要はなかったかもしれない。byDs
プログラムに時間がかかってしまいました。今回もロボットが任せきりになってしまってすみません(泣 byはいじ