[[2015b/Member]] #contents *課題 [#na5f6bce] &size(20){書道ロボットの作成}; 書道ロボットを作成し、七画以上の文字を書く。 注意点 -マクロや関数、サブルーチンなどを使い、main関数がなるべく単純になるようにプログラムを作ること。 -定数名やマクロなどは分かりやすい名前を用いること。 -余裕をもってA4の紙の中に収まる大きさにすること。読める範囲ならばいくら小さくてもよい。 -ペン以外はキットの部品を使うこと。 -輪ゴムは切れやすく高価なので慎重に扱い、張力がかかりすぎないようにすること。 今回は &size(18){「佑」}; という字を書くことを目標とする。 &size(20){ペア:[[A.T.9「樹」:http://yakushi.shinshu-u.ac.jp/robotics/?2015b%2FMember%2FA.T.9%2FMission1]]}; *ロボット [#oc042f75] これが私たちが作成したロボットである。 #ref(2015b/Member/velocity/Mission1/view.jpg,50%,ロボット) **仕組み [#s9718552] それぞれ3つのモーターを使い、x軸,y軸,z軸の三方向に独立して移動するように作られている。それぞれの移動について以下に示す。 ***x軸 [#f25cb0e5] タイヤを使い本体ごと移動させる。 #ref(2015b/Member/velocity/Mission1/x.jpg,50%,x動作) ***y軸 [#g133b08e] モーターは本体に固定し、アームを使い前後にペンを移動させる。 #ref(2015b/Member/velocity/Mission1/y.jpg,50%,y動作) ***z軸 [#a8e81e21] 常にペンと共に移動し、必要に応じて上げ下げする。 #ref(2015b/Member/velocity/Mission1/z.jpg,50%,z軸動作) *作品 [#ae2ed8d7] ほぼ書き順通りである。三画目と四画目を文字のバランスをとるため逆にした。 辺とつくりのバランスがよくとれたと思う。 #ref(2015b/Member/velocity/Mission1/mozi.jpg,50%,作品) *プログラム [#h12036f6] **マクロ [#t7f8da3c] メインタスクを簡単にするため、このように定義した。 |xup|x軸正の方向に移動||xdown|x軸負の方向に移動| |yup|y軸正の方向に移動||ydown|y軸負の方向に移動| |zup|z軸正の方向に移動||zdown|z軸負の方向に移動| |nnm|斜めの方向に移動 | #define xup(t,p) OnFwd(OUT_A,p);Wait(t);Off(OUT_A); #define xdown(t,p) OnFwd(OUT_A,-p);Wait(t);Off(OUT_A); #define yup(t,p) OnFwd(OUT_B,p);Wait(t);Off(OUT_B); #define ydown(t,p) OnFwd(OUT_B,-p);Wait(t);Off(OUT_B); #define zup RotateMotor(OUT_C,10,-13); #define zdown RotateMotor(OUT_C,10,13); #define nnm(t) OnFwd(OUT_A,55);OnFwd(OUT_B,20);Wait(t);Off(OUT_AB); モーターAがx軸、モーターBがy軸、モーターCがz軸を担当している。 軸に関しては以下の図で定義する。 #ref(2015b/Member/velocity/Mission1/zahyouziku.jpg,50%,座標軸) **タスク [#v2769d24] task main () { zdown; //一画目 nnm(600); zup; xdown(450,55); //一二移動 ydown(270,20); Wait(500); zdown; //二画目 yup(430,20); zup; ydown(400,30); //二三移動 xdown(300,55); Wait(500); zdown; //三画目 xdown(1000,55); zup; ydown(150,30); //三四移動 xup(380,60); Wait(500); zdown; //四画目 nnm(630); zup; xdown(400,50); //四五移動 ydown(95,30); Wait(500); zdown; //五画目 yup(190,30); zup; ydown(190,30); //五六移動 Wait(500); zdown; //六画目 xdown(800,55); yup(190,30); zup; xup(800,55); //六七移動 Wait(500); zdown; //七画目 xdown(800,55); zup; } コメント文の「○□移動」とは○画目を終え、□画目の書き始めまでの移動である。 *最後に [#dcf6b213] **工夫点 [#taf53169] ***ロボット [#b3feac46] -重心の調節 ロボットを作る上で意識したものの一つが重心である。重心がどちらかに偏っていると当然移動がまっすぐ正確に行うことができなくなる。タイヤ(大)やブロックなどを使い調整した。 -歯車 x軸をより正確に動かすため、モーターとタイヤをつなぐのに二種類の歯車を使用した。それによりモーターの回転数の1/3がタイヤに伝わり、3倍の力がかかるようにでき、細かな移動ができるようになった。やはり字を書く上で細かい動きは必要不可欠なものとなるのでこのような仕組みはとても大切なものとなる。 ***プログラム [#je04a68e] -z軸の細かな動き z軸の働きはペンを傾けて浮かすことである。しかしその傾けるという動きにより、y軸移動に支障をきたしてしまう。そこで少しでもその被害を抑えるため、z軸の移動は必要最低限の細かな動きが必須となった。授業で習ったOnFwdでは細かな動きを指示するのが難しい。そこで &color(blue){&size(20){RotateMotor};}; を使った。OnFwdは時間で制御するのに対してRotateMotorは &color(blue){&size(20){角度};}; で制御できる。これで細かな動きも簡単に指示することができた。 RotateMotor(OUT_C,スピード,角度) -マクロ プログラムを簡単に、かつ理解しやすく、そして操作しやすくするために大きく7つの操作のみにした。x,y,zのそれぞれの上下(up,down)、そしてななめ(nnm)である。プログラムはこの7つのみで構成されているため作るのは容易であった。 **壁 [#idd6e1fd] -z軸の移動 初めz軸も本体から操作する予定だった。しかし移動するy軸を考慮に入れると、任意の位置でのz軸移動が困難であることが分かった。z軸のモーターも一緒にy軸と移動するのは重過ぎると考えたためそこで作業が滞った。しかしその課題もy軸のレール強化したことにより解決することができた。 -ななめ x軸,y軸が独立して動くため、ななめの線を書くためには同時に二つの軸を動かさなくてはいけない。ななめの線を書くといっても45°の線を書くのか60°の線を書くのかでプログラムは変わってくる。思い通りの角度で書くために何回も微調整を繰り返してやっと書くことができた。 **欠点・改善点 [#a68bf7a5] 私たちのロボットには大きな欠点がある。一つは始める位置である。初めの位置を細かくセットしないと途中で止まったり、変な力がかかり文字のバランスが崩れたりしてしまう。その原因としてそれぞれの軸の可動域が狭いことがあげられる。特にy軸の可動域には悩まされた。改善策としてアームを長くすることが考えられる。しかし部品の問題がありそれは実現できなかった。 そしてもう一つ、コードの問題である。今回作成したロボットはコントローラは本体に乗っていない。そのため本体とコントローラの距離が随時変わることになる。当然コードは伸び縮みし、余計な力を可動部にかけてしまい字のバランスが崩れることがある。この改善策としてはやはり本体に乗せるのが一番よいと考えられるが、場所、重さの関係で実現できなかった。 そして主にこれらが原因として、一回一回の移動の力と速さを変えなければならなくなってしまった。 **感想 [#y38c1847] 初めてこのような課題に取り組んだが、考えてた以上にいろいろな選択肢があり