[[2015b/Member]] [[2015b/Member]] #contents *課題について [#r3431c27] 今回は、自分の出身地または自分の名前の漢字をA4の紙に書かせるという課題が出された。 7画以上という指定もあったため、長野県の「長」という漢字を書かせるようにプログラムを作った。 #ref(2015b/Member/kobajun/Mission1/kanji-1-1.png,30) *ロボットの構造 [#m0778856] #ref(2015b/Member/kobajun/Mission1/robot-1-1.png,30) ほぼ真ん中のところにモーターがついており、下2つは前後左右に動き回るために、上一つはペンの上げ下げ用に付いている。そのため本体は大きなタイヤよりも前に出る形となった。 #ref(2015b/Member/kobajun/Mission1/kaitenbubun-1-1.png,30) 元々は下2つのモーターの上に本体がついていたが、ペンの上げ下げ用のモーターが突き出る形となり重心が安定しなくなるため本体の位置をずらした経緯がある。 *基本動作の指定 [#o6c27ef4] 「長」という漢字は基本的に直線に近似できるため、下記の定義を組み合わせてプログラムを作成した。 **前後に進む [#mf3f8114] #define go_forward(t) OnFwd(OUT_BC,60);Wait(t);Off(OUT_BC); //前に進む #define go_reverse(t) OnRev(OUT_BC,60);Wait(t);Off(OUT_BC); //後ろに進む 前後に進むプログラム。 モーターの回転出力は60%で固定してあるため、1秒間に進む距離がわかれば進みたい距離を時間で大体割り出すことが可能である。 調べた結果18cm/秒だったため、これを元に移動距離を割り出している。 ただし、秒数があまりにも短いと前後に進む距離が計算通りに行かず、計算よりも少し長い時間を指定するといった修正を行わなければならなかった。 **ペンの上げ下げ [#e397490f] #define down_pen OnRev(OUT_A,40);Wait(300);Off(OUT_A); //ペンを下ろす #define up_pen OnFwd(OUT_A,40);Wait(300);Off(OUT_A); //ペンを上げる ペンの上げ下げに関しては、勢いで後輪を持ち上げないようにするため40%の出力にした。 #ref(2015b/Member/kobajun/Mission1/kaitenbubun-1-1.png,30) ペンの上げ下げ用のモーター付近の写真。 こちらから見て時計回りの時にペンを下げ(down_penに相当)、半時計回りの時にペンを上げる(up_penに相当)。 **その場で回転 [#aab81c67] #define turn_here_L(t) OnRev(OUT_C,30);OnFwd(OUT_B,30);Wait(t);Off(OUT_BC);//その場で反時計回り #define turn_here_R(t) OnRev(OUT_B,30);OnFwd(OUT_C,30);Wait(t);Off(OUT_BC);//その場で時計回り ブログラムを作成し始めた時は、片側のモーターを回して本体の向きを変える定義も立てたが、 両方のタイヤを片方は前へ、片方を後ろへと回転させる定義でも同様のことができたためこちらにすべて置き換えた。 こちらも前後移動同様、モーター出力を固定しているため、90度回転させる秒数がわかれば他の角度もだいたい割り出せる。 元々は1.05秒かかっていたが、度重なる使用により電圧が低下したためか1.05秒では90度に満たなくなってしまったため、 微調整して最終的に1.15秒かかるという結果になった。 しかし、厳密ではないためどうしても誤差が出てしまった。 *プログラム [#s9c7f2bf] 基本的にペンを下ろしてから次にペンを下ろす場所まで移動する動きをひとつのくくりとして分けてある。 元々はペンが付いている方が前としてプログラムを組んでいたが、後輪が浮きやすく筆圧を一定に保てないため、 ペンが付いている方を後側としてプログラムを作成し直した経緯がある。 **サブルーチン [#d1d109c7] sub yokobo() { down_pen; go_forward(222); up_pen; go_reverse(944); turn_here_L(1150); go_forward(80); turn_here_R(1100); go_forward(777); } 「長」の上の横棒を引くためのルーチン。ペンを下ろしてから次にペンを下ろす場所まで移動する動きをひとつのくくりとしてルーチン化する関係上、 3本目はペンを上げた後の動きが違うためルーチンとして組み込むことはできなかった。 元々はリピートさせるプログラムを組んでいたが、リピート後いくつかのプログラムが実行されないという問題があったため、リピート機能をなくしてサブルーチンに変えた。 サブルーチンでは上記の問題が発生しなかったことからリピート機能のプログラムの立て方が悪かったことが想定される。 **一連の動き [#l4939b03] task main() { yokobo(); yokobo(); 上記のプログラムは、上2本の横棒を引くプログラム。 down_pen; go_forward(222); up_pen; go_reverse(1000); turn_here_L(1150); go_forward(879); 上から三番目の横棒を引いて、次に縦の棒を引くために縦の棒の開始位置まで移動するプログラム。 down_pen; go_forward(470); turn_here_R(100); up_pen; turn_here_L(100); go_reverse(1200); turn_here_L(1150); go_forward(244); turn_here_R(1700); go_forward(930); 上記のプログラムは、縦の棒を引き、そのままペンを下ろしたままはねて次の右上から左下へ向かう線を書き始める位置まで移動するもの。 縦の線を引き終わった後、回転させる角度を間違えて書きたいところと正反対に書かせてしまったため、回り方の見直しを行った。 また、右上➖左下の線の縦座標と横座標で理想の位置にたどり着かなかったため、18cm/秒を元に位置の調整を行った。 down_pen; go_forward(100); up_pen; go_reverse(1200); turn_here_R(600); go_forward(1100); 右上から左下へ向かう線を書き、一番長い横棒を引き始める位置まで移動するプログラム。 長い横棒も開始位置が理想と異なることがあったが、右上➖左下の線の開始位置に依存する部分があるため、それよりはあまり調整をしなくても良かった。 down_pen; go_forward(444); up_pen; go_reverse(1150); turn_here_L(1900); go_forward(1050); 横棒を引き、左上から右下へ向かう線を引きはじめる位置まで移動するプログラム。 左上➖右下の棒が長い横棒を突き抜けてしまうことが多々あったため、その開始位置を18cm/秒を使って調整した。 down_pen; go_forward(333); up_pen; } 左上から右下へ向かう線を引くプログラム。 *感想・考察 [#u61f3d2b] 7画の字を書くという行為でも、思い通りの形にするにはそれなりの量のプログラムが必要であり、 プログラムをいかに簡略化させることが重要かということがよくわかった。 また、一つの測定結果から計算してプログラムを立てるとはいえ、測定誤差やその時の状態などから、 必ずしも計算通りには動かないこともわかった。