2016a/Member

目次

はじめに

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

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

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

ロボティクスコース.png

ロボット本体の説明

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

ロボ本体.JPG

プログラムの説明

定義

#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);
}

苦労した点

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

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

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

2016a-mission2.png

感想

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

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


添付ファイル: file2016a-mission2.png 196件 [詳細] fileロボ本体.JPG 241件 [詳細] fileロボティクスコース.png 150件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-07 (木) 01:30:05