[[2016a/Member]]

目次
#contents

*はじめに [#p359eff2]
今回の課題は、ロボットに光センサーを取り付け、紙に書いた線のうちの決められたコースをロボットが走れるようにする、というものだった。

ただライントレースをさせるだけでなく、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止することが課題となってくる。

僕は画像のBコースを担当した。

#ref(ロボティクスコース.png)
*ロボット本体の説明 [#g5c2c820]

画像のように、ロボット本体の前方に光センサーを取り付けた。
他に特筆することは無い。

#ref(ロボ本体.JPG)

*プログラムの説明 [#r352a901]
定義
 #define THRESHOLD 53
 #define SPEED_H 40  // 直線用のスピード
 #define SPEED_L 20  // カーブのスピード
 #define OnRL(speedR,speedL) \
   OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 #define go_forward OnRL(SPEED_H,SPEED_H); // 直進
 #define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回
 #define turn_left0 OnRL(SPEED_L,0);       // 左折
 #define turn_right0 OnRL(0,SPEED_L);      // 右折
 #define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回
 #define STEP 1 // 1回の判断で動く時間
 #define nMAX 260  // 通常のカーブとして許容できる繰り返しの最大値 (調整する)
 #define short_break Off(OUT_BC); Wait(1000); // 小休止
 #define CROSS_TIME 400  // 交差点通過にかかる時間
  /* 交差点を渡る */
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;

メイン

 task main()
 {
   SetSensorLight(S1);
    Long t0 = CurrentTick();
   int nOnline=0; // 続けて黒になった回数 (カウンタ)

0〜1000s(交差点で右折)
    while (CurrentTick()-t0 <= 1000) {
     while (nOnline < nMAX) {
       if (SENSOR_1 < THRESHOLD-15) {
         turn_right1;
         nOnline++;  // カウンタを増やす
      } else {
        if (SENSOR_1 < THRESHOLD-10) {
          turn_right0;
        } else if (SENSOR_1 < THRESHOLD) {
          go_forward;
        } else if (SENSOR_1 < THRESHOLD+6) {
          turn_left0;
        } else {
          turn_left1;
        }
        nOnline=0;  // カウンタをリセット
      }
    Wait(STEP);
   }
    short_break; // 小休憩
    PlaySound(SOUND_UP);
    turn_right1; // 右折 
    nOnline=0; //カウンタをリセット
  }

1000〜20000s(交差点で直進)
   while (CurrentTick()-t0 <= 20000) {
    while (nOnline < nMAX) {
      if (SENSOR_1 < THRESHOLD-15) {
        turn_right1;
        nOnline++;  // カウンタを増やす
      } else {
        if (SENSOR_1 < THRESHOLD-10) {
          turn_right0;
        } else if (SENSOR_1 < THRESHOLD) {
          go_forward;
        } else if (SENSOR_1 < THRESHOLD+6) {
          turn_left0;
        } else {
          turn_left1;
        }
        nOnline=0;  // カウンタをリセット
      }
    Wait(STEP);
   }
    short_break; // 小休憩
    PlaySound(SOUND_UP);
    turn_left1; Wait(nMAX*STEP);  // 進行方向修正
    cross_line;   //  交差点を渡る
    nOnline=0; //カウンタをリセット

20000〜55000s(交差点で右折)
 while (CurrentTick()-t0 <= 55000) {
    while (nOnline < nMAX) {
      if (SENSOR_1 < THRESHOLD-15) {
        turn_right1;
        nOnline++;  // カウンタを増やす
      } else {
        if (SENSOR_1 < THRESHOLD-10) {
          turn_right0;
        } else if (SENSOR_1 < THRESHOLD) {
          go_forward;
        } else if (SENSOR_1 < THRESHOLD+6) {
          turn_left0;
        } else {
          turn_left1;
        }
        nOnline=0;  // カウンタをリセット
      }
    Wait(STEP);
   }
    short_break; // 小休憩
    PlaySound(SOUND_UP);
    turn_right1; // 右折
    nOnline=0; //カウンタをリセット
  }

車庫入れ
 turn_left1;
 Wait(500);
 go_foward;
 Wait(1400)
 Off(OUT_BC);
 }

*苦労した点 [#j0325639]
時間で交差点での対応を変えるプログラムにしたから、とにかく調節が大変だった。

nMAXや交差点の通過時間も微調整が必要で、そこにかなり時間を取られた。

ロボットが図の赤丸の部分を安定して交差点と認識せず、スピードを調節して認識できるようにするのにかなり苦労した。

#ref(2016a-mission2.png)

*感想 [#x58ca83b]
何回も試行錯誤を繰り返してやっと完成したから、達成感がすごかった。

次の課題は2班が協力して行うから、積極的に班に貢献していきたい。

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