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