[[2006a/C2/課題2右]] *線をゆくロボットのプログラム -- No.1 [#e46c4fc7] Made by Itoshima **概要 [#b68548c7] 線をゆくロボットのプログラムを作成した。 マシンは詳しくは別ページ[[2006a/C2/LineMachine]]を参照していただきたいが、駆動に左右2つのモーター使用し、光センサーはトレースするラインの両側にくるように設計した。 また、対向車が来た場合、方向転換して進むことができるようにも工夫した。 線のトレース方法は 1.左右どちらかの光センサーが黒いラインを感知する。 2.感知したのとは逆側のモーターを逆回転させることで瞬時に回転して軌道修正する。 3.再び両モーターを正回転させ前進する。 4.以上を繰り返す。 である。 また、タッチセンサーをマシン前方に設置し、反応したら半回転させるようにした。 **苦労/修正点 [#xf5ee4ff] 当初は、速いモーター故に線を逸脱してしまう恐れから、SetPowerにより速度を落として行っていた。 しかし、コース中に1カ所ある急カーブに差し掛かった瞬間に、その急カーブゆえに両光センサーが同時に黒を感知してしまう弊害が生じてしまった。 そのため、速度を落とすことをやめるとともに、同時に黒を感知した場合についてもifによって記述した。 また、進行角度の修正に際して、当初は片方のモーターを静止させるようにプログラムを組んでいたが、実際にやってみると、回転が遅いために上記と同じ弊害が発生した。 これを解消するために、静止ではなく逆回転させることで、回転を素早く行うように工夫した。 **…実際にやってみた(ト○ビア風) [#pdddc31f] 成功! かなり高速で回ったので、危なげなく…という表現は合わないが、ともかくコースアウトせずに何周もすることができた。 ギアとの組合わせの関係上、そう高速では進まないが。。。 **気づいた点 [#u4796afd] プログラムの組み方も重要だが、マシンにおける光センサーの位置がかなり重要になってくると思った。 双方の光センサーが同時に黒を感知することを防ぐために光センサー間の距離を開けると、線上をゆくマシンの位置の誤差が大きくなってしまい、その都度違う動きをしていた。 逆に間隔を小さくすると、少しのカーブですぐに同時に黒を感知してしまった。 そのバランスがかなり重要であると思う。 **Program [#qf2bab15] 作成者:itos /* light7 */ #define THRESHOLD 40 // Decision Standard #define ROUND 20 // Round Standard task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); OnFwd(OUT_A+OUT_C); while (true) { if (SENSOR_1 < THRESHOLD ) { // Over the line from left Rev(OUT_A); if (SENSOR_1 < THRESHOLD ) { // 左の光センサーがラインに乗った場合 Rev(OUT_A); // 左のセンサーがラインを抜けるまで回転 until(SENSOR_1 > THRESHOLD); Fwd(OUT_A); } if (SENSOR_3 < THRESHOLD ) { // Over the line from right Rev(OUT_C); if (SENSOR_3 < THRESHOLD ) { // 右の光センサーがラインに乗った場合 Rev(OUT_C); // 右のセンサーがラインを抜けるまで回転 until(SENSOR_3 > THRESHOLD); Fwd(OUT_C); } if (SENSOR_3 < THRESHOLD && SENSOR_1 < THRESHOLD ) { // Over the line from right Rev(OUT_A); if (SENSOR_3 < THRESHOLD && SENSOR_1 < THRESHOLD ) // 左右両方の光センサーがラインに乗った場合 { Rev(OUT_A); // 左右両方の光センサーがラインから抜けるまで回転 until(SENSOR_3 > THRESHOLD && SENSOR_1 > THRESHOLD); Fwd(OUT_A); } if (SENSOR_2 == 1 ) if (SENSOR_2 == 1 ) // 対向車と衝突した場合 { Off(OUT_A+OUT_C); Off(OUT_A+OUT_C); // とりあえず停止して待機 Wait(50); OnFwd(OUT_C); OnFwd(OUT_C); // 180度回転する OnRev(OUT_A); Wait(191); Fwd(OUT_A); // Rev when I hit the machine running in front of me Fwd(OUT_A); // 逆方法に進行 } } }