[[2016a/MemberOnly]]
*課題 [#m3e4be69]
LEGOのプログラミングロボットを使って班の中の一人の顔を紙の上に描く。

*機体の説明 [#t03a0b47]
全体像
~&ref(./ロボティクス.jpg,25%,aaa);
~顔を描くときは、目や鼻などにおいて一筆書きしないようにするのが適切である。写真のように、一方にモーターをつけ、ペンを上げ下げできるアームを取り付けることで、一筆書きせずにすむ構造がとれた。
*プログラム解説1【直線動作の定義】 [#n8078a74]
~『単位あたり(1秒)の移動距離』=おおよそ11.6cm から考えて、Wait(t)の(t)に秒数を入れて調節し、以下の定義を作成した。
~(※実際の動作の順番上、#defineのあとのアルファベットが乱雑になってしまいました。)
        #define d OnFwd(OUT_AC);Wait(5);Off(OUT_AC); //1cm前進
        #define c OnFwd(OUT_AC);Wait(18);Off(OUT_AC); //2cm前進
        #define a OnFwd(OUT_AC);Wait(35);Off(OUT_AC); //4cm前進
        #define f OnFwd(OUT_AC);Wait(40);Off(OUT_AC); //5.5cm前進
        #define b OnFwd(OUT_AC);Wait(70);Off(OUT_AC); //8cm前進
        #define g OnFwd(OUT_AC);Wait(88);Off(OUT_AC); //9.5cm前進
        #define e OnFwd(OUT_AC);Wait(105);Off(OUT_AC); //13.5cm前進
~※以下の2動作は、一旦線を引き終え、書き終えた位置から、角度を変えて再び同じ所から書き始めるための調整用の直線動作である。
        #define x OnFwd(OUT_AC);Wait(85);Off(OUT_AC); //10cm前進
        #define y OnRev(OUT_AC);Wait(85);Off(OUT_AC); //10cm後進
*プログラム解説2【回転動作の定義】 [#r471cd18]
        #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC); //右に回転(A前進、C後退)
        #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_AC); //左に回転(A後退、C前進)
~Aは左車輪、Cは右車輪を操作することから左右の回転を定義した。
*プログラム解説3【ペン上げ下げ動作の定義】 [#ub43c3c6]
~ペンの上げ下げは目や鼻、口といった一筆書きできないところへの対策である。
~上げ下げは早いので1秒の動作とした。
        #define down_the_pen OnFwd(OUT_B);Wait(100);Off(OUT_B); //ペンを下げる
        #define lift_the_pen OnRev(OUT_B);Wait(100);Off(OUT_B); //ペンを上げる
*実際の動作 [#zed71e30]
�.撻鵑魏爾欧憧蕕領愕圓鯢舛�始める
(4cm移動し、顎の中央からペンを置く→横4cm縦8cmの縦長長方形を描く)
    a;
    down_the_pen;
    a;
    lift_the_pen;
    x;
    turn_left(109) →90°左に回転
    y;
    down_the_pen;
    b;
    lift_the_pen;
    x;
    turn_left(109)
    y;
    down_the_pen;
    b;
    lift_the_pen;
    x;
    turn_left(109)
    y;
    down_the_pen;
    b;
    lift_the_pen;
    x;
    turn_left(109)
    y;
    down_the_pen;
    a;
�∈能蕕防舛�始めたところにもどってくる→ペンをあげたまま口を書く動作にむかう
    lift_the_pen;
    x;
    turn_left(109)
    a;
    turn_left(109)
    y;
�2叱�き正三角形(1辺4cm)の口の、上辺中央から半時計回りに描き始める
    down_the_pen;
    c;
    lift_the_pen;
    x;
    turn_left(145) →120°左に回転
    y;
    down_the_pen;
    a;
    lift_the_pen;
    x;
    turn_left(145)
    y;
    down_the_pen;
    a;
    lift_the_pen;
    x;
    turn_left(145)
    y;
    down_the_pen;
    c;
�せ鯵僂鯢舛�始めた位置に戻って鼻と目(どちらも縦1cmの直線)を描く動作に移る
    lift_the_pen;
    x;
    turn_right(109) →90°右回転
    y;
    d;
�ド,鯢舛�
    down_the_pen;
    d;
    lift_the_pen;
    x;
    turn_left(109)
    c;
    turn_right(109)
    y;
��左目を描く
    down_the_pen;
    d;
    lift_the_pen;
    x;
    turn_right(109)
    a;
    turn_right(109)
    y;
�Пμ椶鯢舛�
    down_the_pen;
    d;
��髪の輪郭を描く動作に移る
    lift_the_pen;
    x;
    turn_left(109)
    a;
    turn_left(109)
    y;
��右目を描き終わった位置から、縦長長方形の右外側で、垂直に4cmはなれたところから髪の輪郭を半時計回りに描き始める。
    down_the_pen;
    a;
    lift_the_pen;
    x;
    turn_left(109)
    y;
    down_the_pen;
    e;
    lift_the_pen;
    x;
    turn_left(109)
    y;
    down_the_pen;
    f;
    lift_the_pen;
    x;
��150°左に回転して縦長長方形の左下端に移る
    turn_left(182) →150°左に回転
    y;
    down_the_pen;
    a;
    lift_the_pen;
    x;
    turn_right(73) →30°右に回転
��端に移ったら今度は長方形の下辺に沿って右端に移る(8cm移動)
    b;
    turn_right(73)
��一旦バックして再び髪の輪郭を描き始める
    y;
    down_the_pen;
    a;
    lift_the_pen;
    x;
��150°左に回転して髪の輪郭を描き始めた位置に戻る
    turn_left(182)
    y;
    down_the_pen;
    g;
��ペンを上げて終了。
    lift_the_pen;
}

*結果と反省点 [#nd50d007]
~プログラムの作成は予想をたてて組んだものの、やはり秒数の誤差があったり、用紙との摩擦などの影響で食い違うところが相次ぎ、顔ができるまでには至ることができなかった。
~&ref(./index7.jpeg,50%,aaa);
~これが完成予想図であるが、
~&ref(./index8.jpeg,50%,aaa);
~結果は上図のように、もはやめちゃくちゃである。
~また、顔の輪郭を円型にしておけばより簡単に、定義もよりわかりやすく書けたと思い、反省しました。

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