[[2016a/Member]]

目次

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

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

僕はBコースを担当した。
*ロボット本体の説明 [#g5c2c820]

*プログラムの説明 [#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; // 続けて黒になった回数 (カウンタ)

   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; //カウンタをリセット
  }

   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; //カウンタをリセット

 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]

*感想 [#x58ca83b]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS