[[2013b/Member]]
* 課題 [#c25c8819]
 今回の課題は、図の決められたコースをライントレースしながら、コース中に設置された空き缶をどかして、最終的に入った線から出ていくというものだ。
#ref(./DCIM0213.JPG,640x480,図)
* ロボットの説明 [#daa68f1b]
 初め、タイヤは4つ付いていたが、2つのほうが格段に交差点を渡りやすいことがわかり、2つにした。腕はそれぞれ大型のビーム2本で構成されたシンプルなものである。しかし、それだけだとロボットが回転して缶を運んでいる間に、缶がロボットの腕をすべって飛び出してしまうことがわかり、それを防止するために先端につめを付けた。
#ref(./1386250023549.jpg,640x480,図1)
* プログラム [#z4ba5336]
 #define THERESHOLD 46                                        // しきい値
 #define HIESTPOWER 7                     // 缶を運ぶ力
 #define HIPOWER 2
 #define LOWPOWER 0
 #define set_power_HEST SetPower(OUT_AC,HIESTPOWER);
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_forward set_power_H; OnFwd(OUT_AC);
 #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A);  // 左旋回
 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A);    // 左折
 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C);   // 右折
 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 右旋回
 #define STEP 1                                               // 1回の判断で動作させる時間     
 #define nMAX 35                                              // 通常のカーブとして許容できる最大時間
 #define short_break Off(OUT_AC); Wait(100);         // 小休止
 #define CROSS_TIME 20                    // 交差点通過にかかる時間
                                /* 交差点を渡る */
 #define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break;
 #define go_forward1 OnFwd(OUT_AC); Wait(50);
 #define u-turn1 set_power_HEST; OnRev(OUT_A); OnFwd(OUT_C); Wait(150);
 #define u-turn2 set_power_HEST; OnRev(OUT_C); OnFwd(OUT_A); Wait(150);
 #define go_back OnRev(OUT_AC); Wait(50);
  
  
 sub line_trace()
 {
  if (SENSOR_2 < THERESHOLD -3) {
        turn_right1;
        } else {
          if (SENSOR_2 < THERESHOLD -1) {
            turn_right0;
          } else if (SENSOR_2 < THERESHOLD +1) {
            go_forward;
          } else if (SENSOR_2 < THERESHOLD +3) {
            turn_left0;
          } else {
            turn_left1;
          }
       Wait(STEP)
      }
 }
 
 
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   SetSensor(SENSOR_1,SENSOR_LIGHT);
 
   ClearTimer(1);                                            / タイマーをリセット
   ClearTimer(1);                                            // タイマーをリセット
 
   While (FastTimer(1) <= 1000) {              / 10秒間は
     line_trace();                                           / ライントレース
     if (SENSOR_1 >= 48) {                                   / ただしセンサーが空き缶を感知すれば
     go_forward1;                                            / 前進
     u-turn1;                                                / 右旋回で空き缶を移動
     go_back;                                                / 空き缶を置いて後退
     u-turn2;                                                / 左旋回で進行方向に戻る
   While (FastTimer(1) <= 1000) {              // 10秒間は
     line_trace();                                           // ライントレース
     if (SENSOR_1 >= 48) {                                   // ただしセンサーが空き缶を感知すれば
     go_forward1;                                            // 前進
     u-turn1;                                                // 右旋回で空き缶を移動
     go_back;                                                // 空き缶を置いて後退
     u-turn2;                                                // 左旋回で進行方向に戻る
     }
  }
 
    ClearTimer(0);                                   / タイマーをリセット                 
    ClearTimer(1);                                           / タイマーをリセット
    ClearTimer(0);                                   // タイマーをリセット                 
    ClearTimer(1);                                           // タイマーをリセット
 
    While (FastTimer(1) <= 2800) {                           / 28秒間は
    While (FastTimer(1) <= 2800) {                           // 28秒間は
                               /* 黒を続けてnMAX/100秒繰り返さない間、通常のライントレースをする */
      WHILE (FastTimer(0) < nMAX) {
        if (SENSOR_2 < THERESHOLD -3) {
        turn_right1;
        } else {
          if (SENSOR_2 < THERESHOLD -1) {
            turn_right0;
          } else if (SENSOR_2 < THERESHOLD +1) {
            go_forward;
          } else if (SENSOR_2 < THERESHOLD +3) {
            turn_left0;
          } else {
            turn_left1;
          }
          ClearTimer(0);                   // 黒を続けてnMAX/100秒繰り返さない時間を測るタイマをリセット
       }
       Wait(STEP)
      }
                                                              /* 黒を続けてnMAX/100秒繰り返した場合 */
      short_break;                                            // 小休憩
      turn_left1; Wait(nMAX*STEP);                            // 進行方向修正
      cross_line;                                             // 交差点を渡る
      ClearTimer(0);                                          // 黒を続けてnMAX/100秒繰り返さない時間を測るタイマをリセット
  }
 
    ClearTimer(0);                                            // タイマをリセット
    ClearTimer(1);                                            // タイマをリセット
 
   While (true) {
                                                              /* 交差点を感知しないようにして、出口から出ていけるようにライントレース */
     line_trace();
  }
 }





* 苦労した点  [#tb525a24]
 ライントレースができるようになるまでも苦労したが、一番苦労したのは缶をどけることである。缶をどけられるようにタッチセンサーを付けたのはいいのだが、缶があまりにも軽くて、タッチセンサーがまったく反応しない!そこで考えたのが光センサーを使うことだ。物体がセンサーに近づけば当然、センサーが感知する光は暗くなる。そこで、ある光センサーが感知するある一定の数値を超えると、ロボットが回転して物体をどけるようにしたのである。
#ref(./1386250018828.jpg,640x480,図2)
これなら移動させる物体が重かろうと軽かろうと関係ない。
* 反省 [#h8a8afce]
 物体をどけることはできるようになったが、厳密に言うと元の場所まで戻せていない。また、今の段階では、腕はあの程度の構造でも用が足りるが、最終的には閉じたり開いたりする腕が作れなければ、多様な状況に対応できない。

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