2011a/A3/課題1左

takaのプログラム紹介

設計図

設計図

プラグラム

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);\
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);\
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);\
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);\
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);\
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秒に設定
   TURN_TIME = 175 ;    // TURN_TIME を1.75秒に設定
   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/2」のように、変数に演算子を使用した形でプログラミングし、

修正する場合に変更する値を少なくしています。


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