[[2011a/A3/課題1左]]

*takaのプログラム紹介 [#x7aa5e07]

**設計図 [#kccfba33]

#ref(2011a/A3/課題1左/P5200531.jpg,100%,設計図)

**プラグラム [#n459b571]

 int MOVE_TIME ; //変数 MOVE_TIME 定義
 int TURN_TIME ; //変数 TURN_TIME 定義
「MOVE_TIME」,「TURN_TIME」2つの変数を定義します。

「MOVE_TIME」は輪郭の縦,「TURN_TIME」は90°回転に使用。
 #define TURN_LEFT_90 
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME);OnRev(OUT_A);OnRev(OUT_C);
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);\
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME);OnRev(OUT_A);OnRev(OUT_C);\
 Wait(40);Off(OUT_A+OUT_C);Wait(30);                                                           //90°左に旋回
 #define TURN_RIGHT_90
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);
 OnFwd(OUT_A);OnRev(OUT_C);Wait(TURN_TIME);OnRev(OUT_A);OnRev(OUT_C);
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);\
 OnFwd(OUT_A);OnRev(OUT_C);Wait(TURN_TIME);OnRev(OUT_A);OnRev(OUT_C);\
 Wait(40);Off(OUT_A+OUT_C);Wait(30);                                                           //90°右に旋回
 #define TURN_LEFT_120
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME*2/3);OnRev(OUT_A);OnRev(OUT_C);
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);\
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME*2/3);OnRev(OUT_A);OnRev(OUT_C);\
 Wait(45);Off(OUT_A+OUT_C);Wait(30);                                                           //120°左に旋回
 #define TURN_LEFT_135
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME/2);OnRev(OUT_A);OnRev(OUT_C);
 Off(OUT_A+OUT_C);Wait(30);OnFwd(OUT_A);OnFwd(OUT_C);Wait(30);\
 OnRev(OUT_A);OnFwd(OUT_C);Wait(TURN_TIME/2);OnRev(OUT_A);OnRev(OUT_C);\
 Wait(40);Off(OUT_A+OUT_C);Wait(30);                                                           //135°左に旋回
 #define EYE repeat(3) {OnFwd(OUT_A+OUT_B+OUT_C);Wait(MOVE_TIME/4);Off(OUT_B);TURN_LEFT_90;};
 OnFwd(OUT_A+OUT_B+OUT_C);Wait(MOVE_TIME/4);Off(OUT_A+OUT_B+OUT_C);
 Wait(30);OnRev(OUT_A+OUT_C);Wait(MOVE_TIME/4);
 TURN_LEFT_135;OnFwd(OUT_A+OUT_C);Wait(35);Off(OUT_A+OUT_C);
 OnFwd(OUT_B);Wait(100);Off(OUT_B);OnFwd(OUT_A+OUT_C);
 #define EYE repeat(3) {OnFwd(OUT_A+OUT_B+OUT_C);Wait(MOVE_TIME/4);Off(OUT_B);TURN_LEFT_90;};\
 OnFwd(OUT_A+OUT_B+OUT_C);Wait(MOVE_TIME/4);Off(OUT_A+OUT_B+OUT_C);\
 Wait(30);OnRev(OUT_A+OUT_C);Wait(MOVE_TIME/4);\
 TURN_LEFT_135;OnFwd(OUT_A+OUT_C);Wait(35);Off(OUT_A+OUT_C);\
 OnFwd(OUT_B);Wait(100);Off(OUT_B);OnFwd(OUT_A+OUT_C);\
 Wait(35);TURN_LEFT_135;                                                                       //目
90°,120°,135°の回転と目の部分は繰り返しが多いので定義づけし、マクロとして使用します。

120°と135°の回転時間はそれぞれ「TURN_TIME*2/3」,「TURN_TIME/2」と

90°の回転時間「TURN_TIME」を基準とし、変数に演算子を使って設定しています。

また、回転動作によって生じる誤差を改善するため、

ペンをあげた状態で回転前に前進、回転後に後退をし誤差を最小限に抑えています。

回転を続けて行った場合に角度がズレてしまうので回転のの前後に0.3秒の停止時間を入れることで、改善しました。

*目は、まず90°の回転を繰り返すことで正方形を描き、一度バックしてから135°の回転により対角線上を進み、途中で点を打つ作業をしています。

 task main()             //似顔絵
 {OnFwd(OUT_B);
    MOVE_TIME = 180 ;    // MOVE_TIME を1.8秒に設定       ←輪郭
    MOVE_TIME = 180 ;    // MOVE_TIME を1.8秒に設定
    TURN_TIME = 175 ;    // TURN_TIME を1.75秒に設定
    OnFwd(OUT_B);        //ペン降下
    OnFwd(OUT_B);        //ペン降下                     ←輪郭
    OnFwd(OUT_A);        //MOVE_TIME秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME);
  repeat(2){             //2回繰り返し
    Off(OUT_B);          //ペン上昇
    TURN_LEFT_120;       //120°左に旋回
    OnFwd(OUT_B);        //ペン降下
    OnFwd(OUT_A);        //1.15秒前進
    OnFwd(OUT_C);
    Wait(115);
  }
    Off(OUT_B);          //ペン上昇
    TURN_LEFT_120;       //120°左に旋回
    OnFwd(OUT_B);        //ペン降下
    OnFwd(OUT_A);        //MOVE_TIME秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME);
    Off(OUT_B);          //ペン上昇
    TURN_LEFT_90;        //90°左に旋回
    OnFwd(OUT_A);        //MOVE_TIME÷8秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME/8);
    EYE;                 //目                            ←右目
    OnFwd(OUT_B);        //ペン降下
    OnFwd(OUT_A);        //MOVE_TIME÷4秒前進            ←眼鏡フレーム
    OnFwd(OUT_C);
    Wait(MOVE_TIME/4);
    Off(OUT_B);          //ペン上昇
    EYE;                 //目                            ←左目
    TURN_LEFT_90;        //90°左に旋回
    OnFwd(OUT_A);        //MOVE_TIME×5÷8秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME*5/8);
    TURN_LEFT_90;        //90°左に旋回
    OnFwd(OUT_A);        //MOVE_TIME×3÷8−0.2秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME*3/8-20);
    Off(OUT_A+OUT_C);    //停止
    OnFwd(OUT_B);        //ペン1秒降下                   ←左の鼻の穴
    Wait(100);
    Off(OUT_B);          //ペン上昇
    OnFwd(OUT_A);        //0.4秒前進
    OnFwd(OUT_C);
    Wait(20);
    Off(OUT_A+OUT_C);    //停止
    OnFwd(OUT_B);        //ペン1秒降下                   ←右の鼻の穴
    Wait(100);
    Off(OUT_B);          //ペン上昇
    OnRev(OUT_A);        //0.2秒後退
    OnRev(OUT_C);
    Wait(20);
    OnFwd(OUT_A);        //MOVE_TIME÷4秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME/4);
    TURN_RIGHT_90;       //90°右に旋回
    OnFwd(OUT_A);        //MOVE_TIME×3÷8秒前進
    OnFwd(OUT_C);
    Wait(MOVE_TIME*3/8);
    TURN_RIGHT_90;       //90°右に旋回
    OnFwd(OUT_B);        //ペン降下
    OnFwd(OUT_A);        //MOVE_TIME÷4秒前進            ←口
    OnFwd(OUT_C);
    Wait(MOVE_TIME/4);
    Off(OUT_B);          //ペン上昇
    Off(OUT_A+OUT_C);    //停止
 }
「MOVE_TIME」を180,「TURN_TIME」を175に設定し、
「MOVE_TIME」を180,「TURN_TIME」を175に設定しました。

直線動作の中では主に「MOVE_TIME/2」のような変数に演算子を使用した形で
直線動作の中では主に「MOVE_TIME/2」のように、変数に演算子を使用した形でプログラミングし、

プログラミングを修正する場合に変更する値を少なくしています。
修正する場合に変更する値を少なくしています。


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