その壱) A3用紙に相棒の似顔絵を書くロボットの製作@
その弐) 指定のキットを使用すれば構造は自由@
その参) なるべく相棒に似せる@
はじめはペンをロボットの中心に垂直に立て、上下させる方法ですすめていた。こうすることで、前後左右の動きに対して安定して書け、ロボットの回転中心の軌跡とペンの軌跡にずれがなくスムーズに書けるからである。
しかし、
テンションの調整が難しく、強すぎると車体が浮いてしまうし、弱いとうまい具合に線が描けない、また既存の車体ではペンと動作機構が入るスペースがないなど、トラブルが多々あった。
解決しようと、ゴムをサスペンション代わりにしたり、ギヤ比の調整でペンの降下速度を鈍くしてプログラムしやすくするなどした。
何回もこころみたが妥協。
おもいきってペンの作動方法を変更した。
写真をみての通り!!
動力部のうえにクレーン部をのせたシンプルな構造。
赤丸は前輪、青丸は後輪、これででスムーズな回転が可能となった。
また、ペンはクレーン式なのでバランスが一番よくなるように三つの車輪を設置した。
ならば、ペンに柔軟性を与えればよいという逆転の発想で、ペン先が柔らかい筆ペンを使用。
なので、クレーン部にヲォームギアを駆使しこれを防止!!さらに、トルクアップにより重い筆ペンも楽々持ち上げれるように。
最初は定義@
まず、メイン・サブルーチンのなかで繰り返し使うものをあらかじめマクロでインプット。
#define up_pen OnRev(OUT_B);Wait(60);Off(OUT_B); // ペンをさげる #define down_pen OnFwd(OUT_B);Wait(60);Off(OUT_B); // ぺんをあげる #define go_st(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_B); // t/100 秒間まっすぐ走る #define turn_l90 OnFwd(OUT_A);OnRev(OUT_C);Wait(65);Off(OUT_A+OUT_C); // 左90°回転
続いて、メインルーチンのなかで繰り返して使うものをサブルーチンでインプット。
sub st_op() // すべてをストップさせ、0,5秒まつ。 { Off(OUT_A+OUT_C+OUT_B); Wait(50); } sub make_ang() // 左90°の角を作成 { up_pen; go_st(50); turn_l90; OnRev(OUT_A+OUT_C); Wait(41); Off(OUT_A+OUT_C); Wait(50); down_pen; } sub ago_45() // 左45°の角を作成 { up_pen; go_st(47); OnFwd(OUT_A); OnRev(OUT_C); Wait(33); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); Wait(43); Off(OUT_A+OUT_C); Wait(50); down_pen; }
メインの命令
task main() { OnFwd(OUT_B); // ペンのセット Wait(183); st_op(); go_st(100); // 輪郭作成 st_op(); ago_45(); st_op(); go_st(30); st_op(); ago_45(); st_op(); go_st(50); st_op(); ago_45(); st_op(); go_st(30); st_op(); ago_45(); st_op(); go_st(100);st_op(); make_ang(); st_op(); go_st(95); st_op(); up_pen; //目作成 go_st(50); turn_l90; OnRev(OUT_A+OUT_C); Wait(41); st_op(); go_st(25); st_op(); go_st(50); turn_l90; OnRev(OUT_A+OUT_C); Wait(41); st_op(); go_st(13); st_op(); down_pen; st_op(); go_st(25); st_op(); up_pen; st_op(); go_st(22); st_op(); down_pen; st_op(); go_st(25); st_op(); up_pen; //鼻作成 st_op(); OnRev(OUT_A+OUT_C); Wait(35); st_op(); down_pen; st_op(); OnRev(OUT_A); OnFwd(OUT_C); Wait(27); st_op(); go_st(15); st_op(); up_pen; //口作成 st_op(); go_st(30); st_op(); down_pen; OnRev(OUT_A); OnFwd(OUT_C); Wait(50); st_op(); up_pen; //ペンをあげて完成!! }
こんなお顔に、、、、、、、、、、、、いかすでしょ?この澄ました笑顔! *見つめているとイライラしてくる可能性があります
プログラムは見やすく!速く!をモットーに作成。
サブルーチンやマクロで簡略化を図った。でも、もっと工夫できるはず。
円の輪郭も考えたが人間味をだすために角型輪郭にした。
鼻を高くしたかったので丸みのようそをいれてみた。
ペンを車体の中心でなく前方に設置したため、そのずれを考慮して遠回りなプログラミングをしなくてはならなかった。
特に輪郭の作成に手間がかかった。角をつくるのが難しいんですよ、、、
微々たる調整の違いで角がクロスしたり、離れたり、曲がったりで悩まされた。
90°の角をつくる手順
90°の角を作成しにロボが線を描きながら手前からやってきたとしよう。
前タイヤが第一ポイントまで差し掛かったとき、目安をご覧のとおり「差」によってすでに線は第二ポイントまで作成されている。
もうここでペンをあげて第二ポイントまで前進!
左に90度回転し、ペンをおろす、、、、、
ちょっとまてぃ。。
第三ポイントまで前輪をバックしなければ角がくっつかない
ってことでバック!!
ここでペンをおろして前進。
やっと90度の角の完成です。
日本語で考えると単純なんですけどプログラムにすると・・・・ってかんじです。(笑)
ひどいっ!www 緑の点線部分のことをまったく考慮してませんでした
45°の角も同じ要領でつくりました。とくに説明しません。
まず、どんな顔にするかを決めなければなりません。はじめは輪郭を丸にした簡単なものを考えたのですが、芸がないので今回のようなプログラムにしました。
まず、どんな顔にするかを決めなければなりません。はじめは輪郭を丸にした簡単なもの を考えたのですが、360度スピンでは回転中心とペンの間隔が狭く円が小さすぎ、また芸がないので今回のようなプログラムにしました。
task main() { OnRev(OUT_C); OnFwd(OUT_A); Wait(37); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B); Wait(43); Off(OUT_B); OnRev(OUT_A); OnFwd(OUT_C); Wait(74); Off(OUT_A+OUT_C); OnRev(OUT_B);//up Wait(43); Off(OUT_B); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(98); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C);//forward Wait(35); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B);//down //eyenose Wait(43); Off(OUT_B); OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnRev(OUT_A+OUT_C);//forward Wait(27); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(14); Off(OUT_A+OUT_C); OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnRev(OUT_C); OnFwd(OUT_A); Wait(28); Off(OUT_A+OUT_C); OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnRev(OUT_A); OnFwd(OUT_C); Wait(14); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);//back ::: Wait(83); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(65); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C);//forward ;;; Wait(38); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(65); Off(OUT_A+OUT_C);// eyenose OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_A+OUT_C);//forward Wait(60); Off(OUT_A+OUT_C); Wait(100); repeat(3){ OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnFwd(OUT_A+OUT_C);//back Wait(51); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C);//turn right 45 degrees Wait(32); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C);//forward Wait(54); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_A+OUT_C);//forward Wait(26); Off(OUT_A+OUT_C); Wait(100); } OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnFwd(OUT_A+OUT_C);//back Wait(48); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C);//turn right 45 degrees Wait(32); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C);//forward Wait(51); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_A+OUT_C);//forward Wait(60); Off(OUT_A+OUT_C); OnRev(OUT_B);//up Wait(43); Off(OUT_B); OnFwd(OUT_A+OUT_C);//back Wait(52); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); OnFwd(OUT_C); Wait(64); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C);//forward Wait(53); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B);//down Wait(43); Off(OUT_B); OnRev(OUT_A); Wait(22); Off(OUT_A); OnRev(OUT_C); Wait(22); Off(OUT_C); OnRev(OUT_A); Wait(22); Off(OUT_A); OnRev(OUT_C); Wait(21); Off(OUT_C); OnRev(OUT_A); Wait(23); Off(OUT_A); OnRev(OUT_C); Wait(20); Off(OUT_C); OnRev(OUT_A); Wait(22); Off(OUT_A); OnRev(OUT_B);//up Wait(43); Off(OUT_B); }
ありましたら、お願いしますm(_ _)m
ロボットの説明も詳しいし、工夫した点も良くかけています。 FI