2015b/Member

課題2 ライントレース

今回の課題は下の図のB地点から出発し、P地点(右折)→Q地点(右折)→P地点(左折)→Q地点(左折)→Q地点(直進)→P地点(直進)→A地点と進むものである

2015b-mission2.png

製作したロボット

説明書に掲載されていたものをそのまま使用している。 B,Cの端子に接続したモーターでタイヤを動かし(Bが右輪、Cが左輪)、3の端子に接続した光センサーを本体の前部に取り付け、センサーの示す値によってライン上か否かを判定している。

プログラムを書くにあたっての当初の方針

制作にあたって発生した問題点

工夫点

プログラム

defineでの定義

変数

製作したプログラム

#define pow 25

#define ikiti_bb 30
#define ikiti_b 38
#define ikiti_w 52
#define ikiti_ww 60

#define tLim 350

#define migi_t OnRev(OUT_B,pow);OnFwd(OUT_C,pow);
#define migi Off(OUT_B);OnFwd(OUT_C,pow);
#define mae OnFwd(OUT_BC,pow);
#define hidari OnFwd(OUT_B,pow);Off(OUT_C);
#define hidari_t OnFwd(OUT_B,pow);OnRev(OUT_C,pow);

task main() {

    SetSensorLight(S3);

    int X = 0;
    long tt = CurrentTick();
    long t0 = CurrentTick();

    while (true){

         while ((CurrentTick() - t0 <= 16000)||(CurrentTick() - t0 >= 40000)&(CurrentTick() - t0 <= 70000)){

// プログラム起動〜16秒、40秒〜70秒
// ラインの左側をたどる処理

              if (SENSOR_3 < ikiti_bb) {
                   hidari_t;
              } else if (SENSOR_3 < ikiti_b) {
                   hidari;
              } else if (SENSOR_3 < ikiti_w) {
                   mae;
                   tt = CurrentTick();
              } else if (SENSOR_3 < ikiti_ww) {
                   migi;
                   tt = CurrentTick();
              } else {
                   migi_t;
                   tt = CurrentTick();
              }

              Wait(1);

// 一定時間以上左に曲がるか旋回していれば交差点と認識

              if (CurrentTick() - tt >= tLim) {
                   if(X == 0) {
// P地点を右折(右に旋回後、直進してラインから外れる)
                        Off(OUT_BC);
                        Wait(1000);
                        tt = CurrentTick();
                        migi_t;
                        Wait(500);
                        OnFwd(OUT_BC,pow);
                        Wait(500);
                        X = X + 1;
                   } else if(X == 1) {
// Q地点を右折(直進してラインから外れ、右に旋回してラインに近づける) 
                        Off(OUT_BC);
                        Wait(1000);
                        tt = CurrentTick();
                        OnFwd(OUT_BC,pow);
                        Wait(800);
                        migi_t;
                        Wait(500);
                        X = X + 1;
                   } else if(X == 3) {
// Q地点を左折(1度ラインを外れてからさらにラインを跨ぐまで左に旋回)
                        Off(OUT_BC);
                        Wait(1000);
                        hidari_t;
                        until(SENSOR_3 > ikiti_w);
                        until(SENSOR_3 < ikiti_b);
                        until(SENSOR_3 > ikiti_w);
                        tt = CurrentTick();
                        X = X + 1;
                   } else {
// P、Q地点を直進(直進して交差点を通過する)
                        Off(OUT_BC);
                        Wait(1000);
                        tt = CurrentTick();
                        OnFwd(OUT_BC,pow);
                        Wait(500);
                        X = X + 1;
                   }
              }
         }

// ラインの左から右に移る処理

         migi_t;
         until(SENSOR_3 < ikiti_b);
         Wait(200);

         while ((CurrentTick() - t0 >= 16000)&(CurrentTick() - t0 <= 35000)||(CurrentTick() - t0 >= 70000)){

// 16秒〜35秒、70秒〜(A地点到着まで)
// ラインの右側をたどる処理 ただし交差点は認識しない

              if (SENSOR_3 < ikiti_bb) {
                   migi_t;
              } else if (SENSOR_3 < ikiti_b) {
                   migi;
              } else if (SENSOR_3 < ikiti_w) {
                   mae;
                   tt = CurrentTick();
              } else if (SENSOR_3 < ikiti_ww) {
                   hidari;
                   tt = CurrentTick();
              } else {
                   hidari_t;
                   tt = CurrentTick();
              }

              Wait(1);
         }

         while ((CurrentTick() - t0 >= 35000)&(CurrentTick() - t0 <= 40000)){

// 35秒〜40秒
// ラインの右側をたどる処理

              if (SENSOR_3 < ikiti_bb) {
                   migi_t;
              } else if (SENSOR_3 < ikiti_b) {
                   migi;
              } else if (SENSOR_3 < ikiti_w) {
                   mae;
                   tt = CurrentTick();
              } else if (SENSOR_3 < ikiti_ww) {
                   hidari;
                   tt = CurrentTick();
              } else {
                   hidari_t;
                   tt = CurrentTick();
              }

              Wait(1);

// 一定時間右に曲がるか旋回していれば交差点と認識

              if (CurrentTick() - tt >= tLim) {
// P地点を左折する処理(左に旋回後、直進してラインから外れる)
                   Off(OUT_BC);
                   Wait(1000);
                   tt = CurrentTick();
                   hidari_t;
                   Wait(500);
                   OnFwd(OUT_BC,pow);
                   Wait(500);
                   X = X + 1;
              }
         }

// ラインの右から左に移る処理
 
         hidari_t;
         until(SENSOR_3 < ikiti_b);
         Wait(200);

    }
}

問題点・反省点

凹凸や周りの人の影などの紙面の状況によって交差点を認識するタイミングが変わってしまい、そのせいで上手く曲がることができないことが多かった。
閾値の設定を変えたり曲がる処理の部分でモーターを動かす時間を変えたりといった方法はあったはずだが、製作時間が足りなくなってしまい十分な調整ができなかった。


添付ファイル: file2015b-mission2.png 212件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-14 (日) 23:35:55