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」のように、変数に演算子を使用した形でプログラミングし、
修正する場合に変更する値を少なくしています。