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

&ref(2018a-mission2.png);
**第2コース [#pe78aa3b]
    Aをスタート
    Bを右折
    Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
    JからKに向かい、Kを直進
    Lを直進
    Iを左折
    Hで一時停止の後、左折
    Gで一時停止の後、右折
    Fで一時停止の後、右折
    Eを直進
    Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
    Cで一時停止の後、直進
    Bを直進
    Aで停止
    
    (一時停止の指定がある場所は、1秒間停止すること)
*ロボットについて [#a1ef14c8]
3輪型のロボットにしました。前2輪がモーターA,Cで回転し、後ろの1輪は、くるくる回転するタイヤの構造にしました。(下図は後輪の画像)

&ref(後輪.jpg);

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

(写真参照)

&ref(DSC_0205.JPG);

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

&ref(アームの説明.jpg);
**苦労したところ [#g8abccdc]
急カーブを曲がったり、直角の角を曲がったりするときに、タイヤがバウンドしてしまってプログラム通りの細かい動きをしてくれなくなったときがあった。

タイヤを大きな細いタイヤから小さな太いタイヤに変えたら、少しはバウンドしてしまったが、プログラム通りに動いてくれるようになったので良かった。
*プログラム [#q3b54d82]
 #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);                        // フィニシュ

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

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

直角カーブの部分はターンを入れることでうまくトレースできるようにした。
**苦労したところ [#j849005a]
直角カーブを曲がるのがとても苦労した。

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

ターンとOnFwdの時間の調整が難しかった。
*感想 [#af5dc064]
課題1に比べてとても難しく大変だったが、その分、完成したときの達成感があった。

途中、音を加えてみた。

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

&ref(MOV_0200.mp4);
*動画URL [#r76b6dc5]
https://youtu.be/URsMHJ74iT8

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