#author("2019-11-22T16:22:36+09:00","jh1dmz","jh1dmz")
#author("2020-01-14T14:07:08+09:00","jh1dmz","jh1dmz")
*課題1 [#y4a9db38]
チームメイトの似顔絵を描くロボットを製作しなさい。

*ロボットについて [#c223c02c]
#ref(2019b/Member/jh1dmz/Mission1/DSC_0647.jpg,640px)
ロボットの全体図である。基本は最初に冊子通りに作ったロボットである。変更点は、コントローラーをキャスター側に移動させ、ペンの上げ下げに使うモーターの取り付け、ペンの取り付けである。

**コントローラーとモーターの取り付け [#ke896c67]
#ref(2019b/Member/jh1dmz/Mission1/DSC_0652.jpg,640px)
#ref(2019b/Member/jh1dmz/Mission1/DSC_0648.jpg,640px)
コントローラーとペンの上げ下げのモーターは試行錯誤しながら取り付けられるところに取り付けた。

**ペンの取り付けについて [#haff4a0f]
#ref(2019b/Member/jh1dmz/Mission1/DSC_0650.jpg,640px)
#ref(2019b/Member/jh1dmz/Mission1/DSC_0649.jpg,640px)
ペンは鉛筆で5Bの柔らかいものを使った。そのまま取り付けるのでは筆圧が足りなかったため重しとして超音波センサーと音センサーをつけている。ペンの固定は上部に鉛筆を取り囲むように部品を組み、輪ゴムで止めた。
#ref(2019b/Member/jh1dmz/Mission1/DSC_0653.jpg,640px)
また、プログラムを簡単にするためにペン先をタイヤの回転軸の中心にできる限り近づけた。このようにすることでロボットの軌跡がほぼそのまま線となって現れる。そして、ここの隙間が細かったためにペンが鉛筆に限られた。

*プログラムについて [#k532a05a]
**ペンの上げ下げ [#v5e6cfe0]
#define pen_up OnFwd(OUT_C,-20);Wait(300);Off(OUT_C);
#define pen_down OnFwd(OUT_C,20);Wait(400);Off(OUT_C);
 #define pen_up OnFwd(OUT_C,-20);Wait(300);Off(OUT_C);
 #define pen_down OnFwd(OUT_C,20);Wait(400);Off(OUT_C);

Difineでこのように定義した。ペンを下ろすときの待機時間を少し長くして確実にペン先が紙に接触するようにした。

**移動に関して [#d14b9e60]
 float GetAngle(float d)
 {
 const float diameter=5.45;
 const float pi=3.1415;
 const float distance=11.15;
 float ang=(distance*d)/diameter;
 return ang;
 }

授業中にやった練習問題のものを流用した。角度を打ち込むことでその向きに回転する。

 sub go_forward(int t,int s)
 {   OnFwd(OUT_AB,s);
     Wait(t);
     Off(OUT_AB);
 }

 sub turn_left(int l,int m)
 {   OnFwd(OUT_A,l);
     Off(OUT_B);
     Wait(m);
     Off(OUT_A);
 }  

go_forwardで直進の進む時間と速さを設定し、turn_leftで左方向に進む。

**プログラム本体 [#qb65577d]
     go_forward(600,50);
     turn_left(50,2900);
     go_forward(600,50);
     turn_left(50,2500);
輪郭を書いた。

     pen_up;
     go_forward(200,50);
     pen_down;
     int anglea=GetAngle(120.0);
     RotateMotorEx(OUT_AB,SPEED,anglea,-100,true,true);
髪の毛書きはじめの位置調整
    Wait(1000);
    go_forward(700,40);
    int angleb=GetAngle(65.0);
    RotateMotorEx(OUT_AB,SPEED,angleb,100,true,true);
    go_forward(200,40);
    int anglec=GetAngle(60.0);
    RotateMotorEx(OUT_AB,SPEED,anglec,100,true,true);
髪の毛を書いた。
髪の毛を書いた。途中で向きを変えることで髪の毛に変化を与え、リアリティを高めた。
    pen_up;
    int angled=GetAngle(80.0);
    RotateMotorEx(OUT_AB,SPEED,angled,100,true,true);
    go_forward(100,50);
    pen_down;
    go_forward(500,40);
    pen_up;
    go_forward(100,40);
    pen_down;
    go_forward(400,40);
髪の毛の終わりから位置調整して目を書いた。
    pen_up;
    int anglee=GetAngle(90.0);
    RotateMotorEx(OUT_AB,SPEED,anglee,-100,true,true);
    go_forward(400,40);
    int anglef=GetAngle(80.0);
    RotateMotorEx(OUT_AB,SPEED,anglef,-100,true,true);
    go_forward(300,40);
目を書き終わってから口までの移動。
    pen_down;
    go_forward(500,40);
    pen_up;
最後に口を書いて終了。
*完成した作品 [#k16608e0]
#ref(2019b/Member/jh1dmz/Mission1/01.jpg,640px)
輪郭の最後の部分がうまくつながらなかった。しかし、髪の毛の形状がしっかりできたのは良かったと思う。
*感想考察 [#oabfb74d]
最初はペンをどのように固定するか悩んだ。普通に固定したのでは薄くなってしまい、ところどころ消えることもあったため、重しをつけたり柔らかい鉛筆に変更したりした。その結果、軌跡がしっかりと書けるようになり良かったと思う。また、プログラムを書き始めた当初は何もうまくいかず福笑い状態になるかと思っていたが、人の顔であることがちゃんと分かる様になり、成功できたと思う。

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