[[2017b/Member]] #contents *初めに [#x9fc1f52] 今回の課題は、自分が住んでいたことのある地名をロボットに書かせる、というものであった。A4用紙に収まる大きさで、2文字以上であることが条件だった。 *ロボットについて [#v1974f8a] 自分たちの班では、x軸方向(横方向)とy軸方向(縦方向)に動くロボットに分け、y軸方向に動くロボット(以降y軸ロボットと呼ぶ)を土台にした。そのy軸ロボットにレールを取り付け、筆を動かすロボット(以降筆ロボットと呼ぶ)を取り付けたx軸方向に動くロボット(以降x軸ロボットと呼ぶ)がレールの上を走るようにした。 #ref(2017b/Member/arso/Mission1/DSCN1131.jpg,70%,ロボットの全体) **y軸ロボット [#h4a385bb] y軸ロボットはモーターを縦に取り付けたため、全体的に位置が高くなり、筆ロボットの腕を長くせざるを得ず、字を書く時の誤差が大きくなったり、全体的に安定し難くなった。加えて、モーターの反対側(x軸ロボットが乗るレールの先端)にタイヤを付けたが、モーターから離れている上にモータと直接つなげたりしていなかったので、モーターの動き出しよりも若干後からタイヤが動くことになり、字の誤差が大きくなってしまった。また、コントローラーを後から取り付けるようにしたために、必要以上に固定に部品を使うことになり、ロボットが重くなってしまった。 #ref(2017b/Member/arso/Mission1/DSCN1138.jpg,70%,y軸ロボット) **x軸ロボット [#u8a60710] x軸ロボットもあとから筆ロボットを取り付けるようにしたが、うまく固定できずやはり無駄に部品が多くなってしまった。また、レールから落ちないような工夫をしなかったため、稀にだが脱輪することがあった。 #ref(2017b/Member/arso/Mission1/DSCN1139.jpg,80%,x軸ロボット) **筆ロボット [#reaef9a4] 筆ロボットは筆が接地するようにモータに腕を取り付けただけだが、上記の通り長い腕が必要となったために、字を書くときに誤差がでたり、筆の上下による跳ねができることがあった。まだしも、腕を短くして筆と用紙が垂直になるようにすべきだったと考える。 #ref(2017b/Member/arso/Mission1/DSCN1130.jpg,80%,筆ロボット) *プログラムについて [#sf279d06] 自分は「大分」を書かせることにした。正しい書き順で書けるようなプログラムにした。 プログラムではモーターA,B,Cは以下のように対応している。 OUT_A//y軸ロボット OUT_B//x軸ロボット OUT_C//筆ロボット x軸、y軸ロボットはモーターの強さが正のとき軸の正方向(ロボットから見て右方向と前方向)に動き、筆ロボットは強さが正のとき筆を持ち上げる。 以下はモーターの強さの定義である。しかし、時間を調節するだけではうまくいかなかった部分もあり、全てをこの強さで書くことはできなかった。 #define PLUSX_POWER 15//x軸ロボットを前方に進める強さ #define MINUSX_POWER -15//x軸ロボットを後方に進める強さ #define PLUSY_POWER 20//y軸ロボットを前方に進める強さ #define MINUSY_POWER -20//y軸ロボットを後方に進める強さ 下記の二つはそれぞれ筆を上下に動かすプログラムと、斜めの移動をさせるプログラムである。a,b,cはそれぞれA,B,Cのモーターの強さを、s,tは動作時間を示している。しかし、サブルーチンをこのように設定したため、プログラムを書くのは楽だったが、筆の上下や斜めの移動がどの方向であるかがわかりにくくなってしまった点は失敗だった。 sub move_pen(int c,int s) { OnFwd(OUT_C,c); Wait(s); Off(OUT_C); } sub go_slant(int a,int b,int t) { OnFwd(OUT_A,a); OnFwd(OUT_B,b); Wait(t); Off(OUT_AB); } 以下はメインルーチンである。定義やサブルーチンを上記のものだけで済ましてしまったので全体が長々とし見づらくなってしまった。 task main() { move_pen(14,270); OnFwd(OUT_B,20); Wait(1900); Off(OUT_B); Wait(500);//一時停止 move_pen(-18,250); ここまでが「大」の1画目である。 OnFwd(OUT_B,-18); Wait(980); Off(OUT_B); OnFwd(OUT_A,PLUSY_POWER); Wait(400); Off(OUT_A); ここまでは移動のプログラム。 move_pen(14,270); OnFwd(OUT_A,MINUSY_POWER); Wait(350); Off(OUT_A); go_slant(-20,-15,200); go_slant(-20,-16,200); go_slant(-20,-17,200); go_slant(-20,-18,200); go_slant(-20,-19,200); go_slant(-20,-20,200); move_pen(-18,250); ここまでが「大」の2画目である。 go_slant(19,18,1050); ここまでは移動のプログラム。 move_pen(14,270); go_slant(-20,15,1200); Wait(500);一時停止 OnFwd(OUT_B,PLUSX_POWER); Wait(500); Off(OUT_B); move_pen(-18,250); ここまでが「大」の3画目である。 OnFwd(OUT_B,-16); Wait(1800); Off(OUT_B); OnFwd(OUT_A,MINUSY_POWER); Wait(200); ここまでは移動のプログラム。 move_pen(14,270); go_slant(-20,-16,200); go_slant(-20,-17,200); go_slant(-20,-18,200); go_slant(-20,-19,200); move_pen(-18,250); ここまでが「分」の1画目である。 go_slant(20,19,800); OnFwd(OUT_B,PLUSX_POWER); Wait(600); Off(OUT_B); ここまでは移動のプログラム。 move_pen(14,270); go_slant(-20,17,800); OnFwd(OUT_B,PLUSX_POWER); Wait(250); Off(OUT_B); move_pen(-18,250); ここまでが「分」の2画目である。 OnFwd(OUT_B,MINUSX_POWER); Wait(1900); Off(OUT_B); OnFwd(OUT_A,MINUSY_POWER); Wait(50); Off(OUT_A); ここまでは移動のプログラム。 move_pen(14,270); OnFwd(OUT_B,PLUSX_POWER); Wait(1600); Off(OUT_B); go_slant(-20,-13,300); go_slant(-20,-12,300); go_slant(-20,-11,300); Wait(400);//一時停止 go_slant(20,-15,300); move_pen(-18,250); ここまでが「分」の3画目である。 OnFwd(OUT_A,PLUSY_POWER); Wait(500); Off(OUT_AB); ここまでは移動のプログラム。 move_pen(14,270); go_slant(-20,-15,130); go_slant(-20,-16,130); go_slant(-20,-17,130); go_slant(-20,-18,130); go_slant(-20,-19,130); move_pen(-18,250); } ここまでが「分」の4画目である。 見れば気づくと思うが、初めに定義したモーターの強さが何度も数字のままで書かれてもいるし、違う強さも出ている。試行錯誤の結果ではあるが、これでは定義した意味がなくなってしまっている。工夫した点を挙げるとすれば、「大」の2画目及び「分」の1画目と4画目の左はらいの横方向を細かく分け増減させたことと、部分によってわずかだが動かない時間を作ったことだ。しかし、前者は短い時間の間に1%ずつしか強さを変えなかったので、上手く変化がつくこともそうでないこともあり、プログラムを組んだ自分としても成功しているとは言えない工夫だった。後者はそれなりに意味があったようで、初めのころに組んだプログラムで試行したときよりは跳ねを減らすことに成功した。 *結果 [#tafec1cc] 発表を行ったときの結果は下の写真のようになった。何を書いているかはわかると思うが筆が当たったり離れたりしてしまっている。これはプログラムの問題ではなく、始めるときに筆の固定が斜めになっていたようだった。 #ref(2017b/Member/arso/Mission1/DSCN1160.jpg,80%,発表会での結果) 発表会の4日前に、最後に試したほぼ同じプログラム(違いは「分」の4画目の前に左方向への移動が入っていること)で行ったときは下の写真のようになった。重なっている部分もあり少し見づらいが赤線で囲まれているほうである。ところどころ跳ねや跳んでいる点もあるが、「大分」と読めるはずである。 #ref(2017b/Member/arso/Mission1/DSCN1150.jpg,80%,発表会前最後の試行結果) *感想と反省 [#u6f9b72c] 結果だけを見ると、筆の位置のずれに気づかなかったことが失敗である。しかし、プログラムを優先しロボットの質を下げてしまったことが最大のミスであると考える。実際に、電池を変えたときに動きが速くなりすぎて字がはみ出しそうになったり、タイヤのゴムが別の部品に引っかかって字が歪んでしまうなど途中で何度も修正することになった。プログラムについても、必要な定義などは少なく済んだが、その分引数の設定やメインルーチンの中がごちゃごちゃしてしまった。定義やマクロ、関数をうまく使えなかった結果である。プログラムを少なくまとめることの大切さや、それに基づいて実際に動くロボットの重要性をよく理解することができた。