[[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);   // 逆方法に進行            
            
        
        }
    }
    
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS