2013b/Member

課題

 今回の課題は、図の決められたコースをライントレースしながら、コース中に設置された空き缶をどかして、最終的に入った線から出ていくというものだ。

図

ロボットの説明

 初め、タイヤは4つ付いていたが、2つのほうが格段に交差点を渡りやすいことがわかり、2つにした。腕はそれぞれ大型のビーム2本で構成されたシンプルなものである。しかし、それだけだとロボットが回転して缶を運んでいる間に、缶がロボットの腕をすべって飛び出してしまうことがわかり、それを防止するために先端につめを付けた。

図1

プログラム

#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);                                            // タイマーをリセット

  While (FastTimer(1) <= 1000) {              // 10秒間は
    line_trace();                                           // ライントレース
    if (SENSOR_1 >= 48) {                                   // ただしセンサーが空き缶を感知すれば
    go_forward1;                                            // 前進
    u-turn1;                                                // 右旋回で空き缶を移動
    go_back;                                                // 空き缶を置いて後退
    u-turn2;                                                // 左旋回で進行方向に戻る
    }
 }

   ClearTimer(0);                                   // タイマーをリセット                 
   ClearTimer(1);                                           // タイマーをリセット

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

苦労した点 

 ライントレースができるようになるまでも苦労したが、一番苦労したのは缶をどけることである。缶をどけられるようにタッチセンサーを付けたのはいいのだが、缶があまりにも軽くて、タッチセンサーがまったく反応しない!そこで考えたのが光センサーを使うことだ。物体がセンサーに近づけば当然、センサーが感知する光は暗くなる。そこで、ある光センサーが感知するある一定の数値を超えると、ロボットが回転して物体をどけるようにしたのである。

図2

これなら移動させる物体が重かろうと軽かろうと関係ない。

反省

 物体をどけることはできるようになったが、厳密に言うと元の場所まで戻せていない。また、今の段階では、腕はあの程度の構造でも用が足りるが、最終的には閉じたり開いたりする腕が作れなければ、多様な状況に対応できない。


添付ファイル: file1386250023549.jpg 239件 [詳細] file1386250018828.jpg 264件 [詳細] fileDCIM0213.JPG 243件 [詳細]

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