[[2016b/Member]] 目次 #contents * 課題1 [#kb53b3cc] A4の紙に今年の大学生活を表す漢字一文字を書くロボットを製作せよ。 7画以上の文字を選ぶこと。 文字は15cm四方に収まる大きさにすること。 ひとりにつき一つ以上のプログラムを作成すること。 ペン以外はキットに含まれる部品を使うこと。 キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。 改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。 * ロボット本体の説明 [#xdb411bb] ** 全体 [#b101ce6d] 講義で最初に作った形のロボットにペンをくくりつけるアームを乗せた。 ** アーム部分 [#lbcf563c] ** [#xa3434d5] * プログラムの説明 [#yff87e4a] ** プログラム内容 [#ha5a036d] #define turnleft() OnRev(OUT_AC);Wait(64);OnFwd(OUT_C);OnRev(OUT_A);Wait(80);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC); #define turnright() OnRev(OUT_AC);Wait(64);OnFwd(OUT_A);OnRev(OUT_C);Wait(80);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC); #define write(f) OnRev(OUT_B);Wait(17);Off(OUT_B);OnFwd(OUT_AC);Wait(f);Off(OUT_AC);OnFwd(OUT_B);Wait(20);Off(OUT_B); #define writer(p) OnRev(OUT_B);Wait(17);Off(OUT_B);OnRev(OUT_AC);Wait(p);Off(OUT_AC);OnFwd(OUT_B);Wait(20);Off(OUT_B); #define gofwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); #define gorev(u) OnRev(OUT_AC);Wait(u);Off(OUT_AC); #define turnrightf() OnRev(OUT_AC);Wait(64);OnFwd(OUT_A);OnRev(OUT_C);Wait(74);OnFwd(OUT_AC);Wait(60);Off(OUT_ABC); task main() { repeat(3){ write(50); turnleft(); } write(50); gorev(25); turnleft(); write(100); turnleft(); gorev(30); write(55); turnleft(); gofwd(30); turnleft(); write(55); turnright(); gofwd(50); turnrightf(); write(50); } ** プログラムの解説 [#s920302d] 今回「里」の文字を書くにあたり、まず「里」の四角形の部分を書いてから縦の直線を書き、最後に横の直線3本を書く、という順で書かせるようにプログラミングを行おうとした。 プログラミングを簡略化するためにマクロを用いて、アームを下げてペンを任意の時間走らせたあとにペンを上げるという動作、右または左に曲がる動作を定義した(それぞれ上記のプログラム中のwrite(),turnright(),turnleft()に当たる)。左右に曲がる動作に関して、ロボットの設計上旋回させた時にペンの位置が曲がる前と後でズレてしまうので、そのズレを解消するためにロボットが旋回する時にズレの分だけ縦方向と横方向で少しだけ余分に動くようにマクロに組み込んだ。 四角形の部分を書く時は簡略化するためループを用いてプログラミングした。 また、字を書く行程の後半になる程直線の角度がズレていったので、ズレを戻すために曲がる動作のマクロを新しく定義し使用した(プログラム中のturnrightf())。 * まとめ [#p763b898] 一番の反省点は、ロボットの挙動がバッテリーに大きく依存することだった。バッテリー残量によって、旋回時のズレの補正に必要な動作の時間(Wait()の数値)が変わるので、一度プログラムを実行させて字が書けていてもバッテリーが消耗した時に実行させると字が崩れてしまった。 これを解消するにはロボットの設計を考え直すことが一番最適と思った。他のグループが作っていたX軸とY軸の座標でペンの書く場所を指定し書かせるようなロボットの設計にすれば良かったと思う。 今回の課題で学んだことは、それぞれの課題に応じて適当な設計を行わないとプログラミングや実際に動かす時に苦労してしまうという事だった。