[[2016a/Member]]

*課題1:お絵かきロボット [#z09c56f4]

**目次 [#c54588ba]
#contents


**ロボット本体の説明 [#c3774e4b]
モーターはAが右タイヤ,Bがペン、Cが左タイヤのモーターに対応している。
ロボットに関してはタイヤとタイヤの間にペン先が来るようになっており、たとえばその場で回転してもほとんどずれないようになっている。
モーターBに関しては回転の方向を変えることで上げ下げできるようにした。この部分を作るのに部品を使ったため最初の形の部品が足りなくなったので本体も別の部品で対応している。
また、ペンの上げ下げに関してもほぼ90度回転させることでできるようになっている。
後輪に関してはあると後輪の方向にずれてしまう事例が多かったのでなくした。

#ref(./robo3f.png)
#ref(./robo4f.png)
#ref(./robo5f.png)
#ref(./robo6f.png)


**プログラムの説明 [#ieee5e20]
まず、完成予想図はこのような絵である

図1
#ref(./robo1f.png)

このような絵を作るために最終的にできたプログラミングが以下のものである。

 task main()
 #define turn_right(t) OnFwd(OUT_C,75); OnRev(OUT_A,75); Wait(t); Off(OUT_AC);
 #define turn_left(t) OnFwd(OUT_A,75); OnRev(OUT_C,75); Wait(t); Off(OUT_AC);
 #define go_fwd(t) OnFwd(OUT_AC,75); Wait(t); Off(OUT_AC);
 {
    RotateMotor(OUT_B,50,90);    //筆下げる
    RotateMotor(OUT_A,75,1600);    //丸い顔の輪郭を作る
    turn_left(400);
    repeat(3){
    go_fwd(150);
    turn_left(400);
    go_fwd(150);
    turn_right(400);
    }    //3回ザグザグさせる
    RotateMotor(OUT_B,-50,90);    //筆を上げる
    go_fwd(300);    //目のラインへの移動
    turn_right(950);    //目のラインへ入る
    go_fwd(300);
    RotateMotor(OUT_B,50,90);    //目ひとつ目スタート 筆下げる
    go_fwd(150);   //ひとつめ終わり
    RotateMotor(OUT_B,-50,90);    //筆上げる
    go_fwd(150);
    RotateMotor(OUT_B,50,90);    //ふたつ目スタート 筆下げる
    go_fwd(150);
    RotateMotor(OUT_B,-50,90);    //目終了 筆上げる
    turn_left(900);   //鼻のラインへ
    go_fwd(200);
    RotateMotor(OUT_B,50,90);    //鼻スタート 筆下げる
    go_fwd(150);
    turn_right(600);
    go_fwd(150);
    RotateMotor(OUT_B,-50,90);    //鼻終了 筆上げる
    go_fwd(200);    //口のラインへ移動
    turn_left(1000);
    RotateMotor(OUT_B,50,90);    //口スタート 筆下げる
    go_fwd(200);
    RotateMotor(OUT_B,-50,90);    //筆上げる
 }

***定義の説明 [#y7f25058]
・#define turn_right(t) OnFwd(OUT_C,75); OnRev(OUT_A,75); Wait(t); Off(OUT_AC);
は右回転のプログラムを定義したものである。()内の数字を変えることで回転角の角度を変えることができる。これにより、一度に3行の短縮になる。
・#define turn_left(t) OnFwd(OUT_A,75); OnRev(OUT_C,75); Wait(t); Off(OUT_AC);
は左回転のプログラムを定義したものである。()内の数字を変えることで回転角の角度を変えることができる。これにより、一度に3行の短縮になる。
・#define go_fwd(t) OnFwd(OUT_AC,75); Wait(t); Off(OUT_AC);
は前に進むプログラムを定義したものである。()内の数字をかえることで進む距離を変えることができる。これにより、一度に2行の短縮になる。


***{}内の説明 [#qde1cdac]
簡単に説明すると図1のおける,納崑里魄豌鹽召気惨蕕領愕圓鮑遒襦
△納崑里鬟ザギザ動かしながら髪の毛を作る。
では△留洞舛悩埜紊鵬鹽召垢襪燭瓩修譴鰺用し、筆をあげたまま一度輪郭からはみ出し、目のラインへ動かす。
い任鷲を上げ下げしながら目を描いていく。
イ任呂修里泙淺,離薀ぅ鵑慍鵑衂,鯢舛つつ口のスタート地点まで動く。
そしてΔ埜を描くというものである。


***工夫した点 [#u90d040a]
最初の方はほぼ同じ内容のプログラムにも関わらず上のものより2倍ほどの長さのプログラムになっていたのをrepeatやdefineを用いることで見やすくした。
一番意識したのは前髪のギザギザだ。はみ出て紙の上で描くのが難しくなったり角度などがずれたり課題は多かったがこれだけはこだわりたかったので頑張った。またrepeatを使ったためギザギザを描き終えた後回転を余分にしてしまうのだが、これを目のラインへ入る事前動作として活用することでプログラムの一部とした。


***問題点 [#hd70bd0f]
ここで、プログラミングを組むにあたってまず最初にぶつかった壁が筆の上げ下げの幅である。これに関してはRotateMotorを用い90度ほぼぴったり回すことで解消した。
そして、大きな壁となったのは電池の残り具合で変わる気まぐれな動作である。
電池の残量に比例して動きが鈍くなっていくのに苦戦した。
ここでは、ずれると致命傷になる輪郭はRotateMotorを用いることでズレを抑えたが、他の部分も時間をかけてでもRotateMotorで作るべきだったと少し後悔した。



**完成した絵 [#q9943966]

下の絵が授業で描いた本番の絵である。
#ref(./robo2f.png)

外の丸が輪郭であり、ギザギザしているのが前髪、上側の日本の直線が目、>の形が鼻、下の直線が口である。

事前にテストしたときはきれいに描けていたが、やはり電池の減りには勝てず、かなりずれたため応急処置として直前に時間の長さを変化させることでなんとか対応した。

***良かった点 [#zff2768b]
パーツごとの形はかなり想像通りにいった。
また、ペンを下ろしたままで回転した場合もタイヤの間に筆をおいたことによりぶれをだいぶと防げた。
顔の輪郭が小さいため顔のパーツをすべて輪郭の中に納めきれるか心配だったが全部入ったのは良かった。


***反省点 [#i16b5043]
上でも書いたが、パーツごとの位置が予想図とかなりずれてしまったため、やはり無理矢理にでもRotateMotorを使うなどして、できるだけ電池の影響を受けにくいプログラミングにしても良かったのかなと思った。
また、本番の床や紙の影響もあり事前の練習とは違った動きをしたことにより、ずれるはずのない方向にずれたりもした。極力本番と近い状況で作業できた方が良かったかもしれない。



**まとめ [#rb1d65e7]
完成図を見たときある意味芸術的な絵になっているなという感想をもった。
総合的に見ればまぁまぁ顔には見えたし、パーツごとの形はだいたい予想通りになったので成功したと思う。

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