[[2015a/Member]] #contents *はじめに [#w349bbbd] 今回の課題は「書道ロボ」。ということでこういうのを作りました。 *ロボットについて [#ub3c4133] **本体 [#l4768779] 僕たちが今回作ったロボットはこれです。 &ref(2015a/Member/Keima/Mission1/1434009073635.jpg,75%,書道ロボ); それでは説明していきます。 ***ペンの上げ下げ [#he30edda] 写真を見ると、本体のちょうど真ん中あたりにペンが立っています。 これは、ペンを二つのタイヤではさんで、タイヤの回転によってペンが上下する仕組みになっています。 その際、ギアの数を増やして、二つのタイヤが逆に回るようにしています。 ***書く方法 [#u57366c6] ペン自体は上下にしか動かないので、書くときは本体が動きまわります。 **プログラム [#re6573a5] 今回僕が選んだ文字は「亨」です。プログラム全体はこちらになります。 #define up OnFwd(OUT_B);Wait(100);Off(OUT_B); #define down OnRev(OUT_B);Wait(100);Off(OUT_B); #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(78);Off(OUT_AC); #define write_down_A down;OnFwd(OUT_AC);Wait(40);Off(OUT_AC);up;turn_right;OnFwd(OUT_AC);Wait(80);Off(OUT_AC);down;OnRev(OUT_AC);Wait(160);Off(OUT_AC);up; #define write_down_B down;OnFwd(OUT_AC);Wait(40);turn_right;OnFwd(OUT_AC);Wait(100);turn_right;\ OnFwd(OUT_AC);Wait(40);turn_right;OnFwd(OUT_AC);Wait(100);Off(OUT_AC);up; #define write_down_C OnFwd(OUT_C);OnRev(OUT_A);Wait(78);Off(OUT_AC);down;OnFwd(OUT_AC);Wait(100);\ OnFwd(OUT_A);OnRev(OUT_C);Wait(108);OnFwd(OUT_AC);Wait(40);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(30);OnFwd(OUT_AC);Wait(60);OnFwd(OUT_A);OnRev(OUT_C);Wait(108);OnFwd(OUT_AC);Wait(20);Off(OUT_AC);up; task main() { write_down_A; OnFwd(OUT_AC); Wait(50); OnFwd(OUT_C); OnRev(OUT_A); Wait(78); OnFwd(OUT_AC); Wait(20); write_down_B; OnRev(OUT_AC); Wait(100); turn_right; Wait(45); OnFwd(OUT_AC); Wait(50); write_down_C; } それでは説明していきます。 ***サブルーチン [#ne3ab488] #defineによるサブルーチンですが、僕はよく使うプログラムと文字を書く動作をサブルーチンにしました。 どういうことかというと、「亨」という文字を、鍋蓋、口、了の三つに分解して、それぞれを書くサブルーチンを作りました。 「鍋蓋」 書き順は縦の短い棒から始まります。書き終えたら、左側に移動してまっすぐに横棒を書きます。 #define write_down_A down;OnFwd(OUT_AC);Wait(40);Off(OUT_AC);up;turn_right;OnFwd(OUT_AC);Wait(80);Off(OUT_AC);down;OnRev(OUT_AC);Wait(160);Off(OUT_AC);up; 「口」 右上の角から書き始めています。先に下に向かって縦に書き、そこからは一筆書きで口を書き、右上に戻ってきます。 #define write_down_B down;OnFwd(OUT_AC);Wait(40);turn_right;OnFwd(OUT_AC);Wait(100);turn_right;\ OnFwd(OUT_AC);Wait(40);turn_right;OnFwd(OUT_AC);Wait(100);Off 「了」 書き順はそのままになっています。左上から書き始めて、一筆書きで書きます。 #define write_down_C OnFwd(OUT_C);OnRev(OUT_A);Wait(78);Off(OUT_AC);down;OnFwd(OUT_AC);Wait(100);\ OnFwd(OUT_A);OnRev(OUT_C);Wait(108);OnFwd(OUT_AC);Wait(40);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(30);OnFwd(OUT_AC);Wait(60);OnFwd(OUT_A);OnRev(OUT_C);Wait(108);OnFwd(OUT_AC);Wait(20);Off(OUT_AC);up; また、”上げ””下げ””右回転”は、比較的多用しています。なので、この三つをサブルーチンに表し、プログラムをコンパクトにしようとしました。 また、”上げ””下げ””右回転”は、比較的多用しています。なので、この三つをサブルーチンに表し、プログラムをコンパクトにしようとしました。上から順に、ペンを上げる動作、ペンを下げる動作、右に回転する動作となっています。 #define up OnFwd(OUT_B);Wait(100);Off(OUT_B); #define down OnRev(OUT_B);Wait(100);Off(OUT_B); #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(78);Off(OUT_AC); ***メイン [#q5470d59] サブルーチンを作ることで、メインのプログラムは書く動作と移動だけという比較的シンプルな構造になりました。 write_down_A; ここまでは「鍋蓋」を書く部分 OnFwd(OUT_AC); Wait(50); OnFwd(OUT_C); OnRev(OUT_A); Wait(78); OnFwd(OUT_AC); Wait(20); ここまでは「口」の右上の角への移動 write_down_B; ここまでは「口」を書く部分 OnRev(OUT_AC); Wait(100); turn_right; Wait(45); OnFwd(OUT_AC); Wait(50); ここまでは「了」の初めの画の書きだすところへの移動 write_down_C; ここまでは「了」を書く部分 *作ってみて [#bc2aad43] 本体を作ること自体は、方針が決まればそんなに難しく感じなかったです。ただ、プログラムはシビアなところがあって、どこか間違うと思ったように動かないので、今回一番苦労したのは、おそらくプログラムの作成だと思います。