2018a/Member

課題2

ライントレースをして空き缶を移動させるという課題でした。 第1コースと第2コースからコースをペアで別々のコースを選択するというもので、第2コースを走らせました。

2018a-mission2.png

第2コース

   Aをスタート
   Bを右折
   Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
   JからKに向かい、Kを直進
   Lを直進
   Iを左折
   Hで一時停止の後、左折
   Gで一時停止の後、右折
   Fで一時停止の後、右折
   Eを直進
   Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
   Cで一時停止の後、直進
   Bを直進
   Aで停止
   
   (一時停止の指定がある場所は、1秒間停止すること)

ロボットについて

3輪型のロボットにしました。前2輪がモーターA,Cで回転し、後ろの1輪は、くるくる回転するタイヤの構造にしました。(下図は後輪の画像)

後輪.jpg

缶を掴む部分の構造は、アームを下げることによって缶を捕まえ、運んでいくという構造にしました。

(写真参照)

DSC_0205.JPG

アームの上げ下げはモーターBが回転することによってゴムが引っ張られ、ゴムの張力よってアームが上げ下げされるという構造にしました。

アームの説明.jpg

苦労したところ

急カーブを曲がったり、直角の角を曲がったりするときに、タイヤがバウンドしてしまってプログラム通りの細かい動きをしてくれなくなったときがあった。

タイヤを大きな細いタイヤから小さな太いタイヤに変えたら、少しはバウンドしてしまったが、プログラム通りに動いてくれるようになったので良かった。

プログラム

#define RUN_TIME 3   // トレースする時間(単位 1/10 秒) 
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C);      // 右に曲がる
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A);       // 左に曲がる
#define OTO_1 PlaySound(SOUND_DOUBLE_BEEP);
#define OTO_2 PlaySound(SOUND_UP);
#define SO 784

下のサブルーチンは黒線の右側をライントレースするプログラム.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.

sub follow_line()
{
ClearTimer(0);                    // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME) 
 {                               // タイマー0がRUN_TIME(0.3秒)以下の時に繰り返す
   if (SENSOR_2 < 38) 
    {                                       // 黒線上にいるとき
     TURN_RIGHT;
    } 
     else if (SENSOR_2 < 43) 
      {                                         // 灰色で直進
       OnFwd(OUT_A+OUT_C);
       ClearTimer(0);
      }
       else 
         {                                     // 黒線から外れたとき
          TURN_LEFT;
          ClearTimer(0);
         }
 }
}

下のサブルーチンは黒線の左側をライントレース.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.

sub follow_linetwo()
{
 ClearTimer(0);                    // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME) 
 {                                // タイマー0がRUN_TIME(0.5秒)以下の時に繰り返す
   if (SENSOR_2 < 38) 
    {                                       // 黒線上にいるとき
     TURN_LEFT;
    } 
     else if (SENSOR_2 < 43) 
      {                                         // 灰色で直進
       OnFwd(OUT_A+OUT_C);
       ClearTimer(0);
      }
       else 
         {                                     // 黒線から外れたとき
          TURN_RIGHT;
          ClearTimer(0);
         }
 }
}

ライントレースは黒や白ならタイヤを両方回転させて曲がり,黒と白の間ならまっすぐ進むといったプログラムになっている.

task main ()
{
 OnFwd(OUT_A+OUT_C); Wait(100);                 // スタート
 SetSensor(SENSOR_2, SENSOR_LIGHT);

最初はまっすぐ進むことでライントレースするところまで行く.

 follow_line();                  // 黒線右側をライントレース
 TURN_RIGHT; Wait(100);          // Bで右に曲がる
 Off(OUT_A+OUT_C);
 follow_line();                 // Jまで行く
 Off(OUT_AC);
 TURN_LEFT; 
 Wait(20);
 Off(OUT_AC);                  // JでYに真っ直ぐになるように左回転して調整する
 OnFwd(OUT_AC);
 Wait(100); 
 Off(OUT_AC);                // 空き缶のところまで行く
 OnRev(OUT_B); 
 Wait(300); 
 Off(OUT_B);                 // 空き缶掴む
 OnRev(OUT_AC); 
 Wait(100);
 Off(OUT_AC);               // 軌道に戻る
 TURN_LEFT; 
 Wait(140); 
 Off(OUT_AC);               // Jで左回転
 OnFwd(OUT_AC); 
 Wait(100); 
 Off(OUT_A+OUT_C);          // 少し前に出る
 follow_linetwo();          // JからKまで 黒線左側をライントレース
 TURN_RIGHT; 
 Wait(50);
 OnFwd(OUT_AC);
 Wait(25);
 Off(OUT_AC);               // Kで左側に行かないように黒線を乗り越える
follow_linetwo();           // KからLまで 黒線左側をライントレース
Off(OUT_AC);
TURN_RIGHT;
Wait(20);  
Off(OUT_AC);
OnFwd(OUT_AC); 
Wait(50);
Off(OUT_AC);               // Lで左側に行かないように黒線を乗り越える
follow_linetwo();          // LからIまで 黒線左側をライントレース                   
Off(OUT_AC);
TURN_LEFT;
Wait(100);
Off(OUT_AC);               // Hの方向に体を向ける
follow_linetwo();          // 黒線左側をライントレース
Off(OUT_AC); 
Wait(300);                 // IからHまで、Hで3秒停止
TURN_LEFT; 
Wait(30);                  // Hで左回転
follow_linetwo();          // 黒線左側をライントレース
Off(OUT_AC);
TURN_LEFT;
Wait(30);                  // Gの下の直角カーブを左回転して曲がる
follow_linetwo();          // 黒線左側をライントレースしてGまで行く
Off(OUT_AC); 
Wait(300);                      // Gで3秒間一時停止
TURN_RIGHT; 
Wait(200);                 // Gで右回転
OnFwd(OUT_AC);
Wait(20);                 // 黒線右側をライントレースできるように少し前に進んで調整
follow_line();            // 黒線右側をライントレース
Off(OUT_AC);
Wait(300);                       // GからFまで行き、Fで3秒間停止
TURN_RIGHT; 
Wait(30);                        // Fで右回転
follow_line();                   // 黒線右側をライントレース FからEまで行く
Off(OUT_AC);
TURN_LEFT;
Wait(20);                       
OnFwd(OUT_AC);
Wait(30);                        // Eで右側に行かないように黒線を乗り越える
follow_line();                  // 黒線右側をライントレース EからDまで行く
Off(OUT_AC);
Wait(300);                       // Dで3秒間停止
TURN_LEFT;
Wait(250);
Off(OUT_AC);                     // Dで左回転
OnFwd(OUT_AC);
Wait(70);
Off(OUT_AC);                     // Xまで行く
OnFwd(OUT_B);
Wait(300);
Off(OUT_B);                     // 持っていた缶をXで放す
OnRev(OUT_AC);
Wait(120);
Off(OUT_AC);                     // Dに戻る
TURN_RIGHT;
Wait(410);
OnFwd(OUT_AC);
Wait(40);
Off(OUT_AC);                    // Dで180°回転した後,少し前に進む
follow_line();                  // 黒線右側をライントレース
Off(OUT_AC);  
TURN_RIGHT; 
Wait(70);                      // Dの上の直角カーブを右へ曲がる
follow_line();                // 黒線右側をライントレース DからCへむかう
Off(OUT_AC); 
Wait(300);                       // Cで3秒間停止
TURN_LEFT;
Wait(20);
OnFwd(OUT_AC);
Wait(30);                      // Cで右側へ行かないように黒線を乗り越える
follow_line();                // 黒線右側をライントレース
Off(OUT_AC); 
Wait(300);                        // フィニシュ
}

工夫したところ

急カーブをうまく曲がれるようにするため、細かい動きでライントレースをしていけるように左右のタイヤ両方を回転させた。

しかし、これだと前に進まないため、白と黒の間をトレースしたときだけまっすぐ進むようにプログラムした。

直角カーブの部分はターンを入れることでうまくトレースできるようにした。

苦労したところ

直角カーブを曲がるのがとても苦労した。

ターンとOnFwdを組み合わせてなんとか曲がることができた。

ターンとOnFwdの時間の調整が難しかった。

感想

課題1に比べてとても難しく大変だったが、その分、完成したときの達成感があった。

途中、音を加えてみた。

音を入れて楽しみながらプログラムしました。

動画URL

https://youtu.be/URsMHJ74iT8


添付ファイル: file2018a-mission2.png 15件 [詳細] file後輪.jpg 11件 [詳細] fileアームの説明.jpg 10件 [詳細] fileDSC_0205.JPG 13件 [詳細] file作ったロボット.課題2.jpg 10件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-13 (月) 16:23:39 (375d)