目次
これが完成した似顔絵ロボットです
正面から見た図
背面から見た図
メンバーで検討し、ドライブベースは練習で用いた基本的な構造にしようということに決まった。似顔絵を書くうえでペンが車輪の中心を結んだラインの半分にあればよいという意見を採用することになり、ペンを車体の真ん中にセットすることにした。
真ん中にある青いパーツと黒いバーはペンを真ん中で支えるためのもので、ペンのぶれを極限まで小さくすることに成功した。
練習用の基本構造には4輪・キャタピラ・足という3つがあったが、小回りが効き旋回が楽であるという理由から、2輪構造でロボットを製作することに決定した。
2輪には夢がある!!
ガッチリした構造でタイヤはブレない!!
1.タイヤを直接モーターに接続して試運転をしたところ、あまりにも速度が速すぎ、これでは速すぎて書くことができないという判断になり、ギア比の工夫を行い速度を落とした。
2.2輪構造にしたため、どのようにして安定感を得るかというのが問題となり、それを工夫するための工夫をした。
補強材として黒のブロックで支えるだけだと、ガタガタと鳴り安定感にかけたため、ギアをブロックにつけたところ安定感が抜群に増して問題無くなった。 ギアの固定が重要!!
3.真ん中にペンを固定するためにペンをどう支え、行動時にいかにブレなくするかという工夫。 縦横斜め、どの方向に行動しようとも絶対にペンがブレない!!
見よ!この華麗なる一直線!安定感抜群!!
青い○穴があるパーツで前後をカバーし、黒いバーで左右のブレをカバーしている。
ペン接続部。
4.ペンの固定法。
上で述べたように3点でペンを固定することにし、ペンの固定具自体にギア動作部を接続することで常に紙に垂直に書けるようになった。
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//前身 #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//後退 #define right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右回転 #define left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//左回転 #define Bdn OnFwd(OUT_B);Wait(12);Off(OUT_B);Wait(100);//ペンを下げる #define Bup OnRev(OUT_B);Wait(12);Off(OUT_B);Wait(100);//ペンを上げる #define DCa(t) repeat(t) {OnFwd(OUT_A+OUT_C);Wait(1);Off(OUT_C);Wait(5);}Off(OUT_A+OUT_C);//円の描写(大) #define DCb(t) repeat(t) {OnRev(OUT_A+OUT_C);Wait(1);Off(OUT_C);Wait(10);}Off(OUT_A+OUT_C);//円の描写(小) task main () { Bdn;DCa(90);Bup;//輪郭の描写 left(35);go(28);right(21);//口への移動 Bdn;DCb(8);Bup;//口の描写 right(36);back(45);right(60);//右目への移動 Bdn;back(18);right(36);back(18);Bup;//右目の描写 left(18);back(15);left(18);//左目への移動 Bdn;back(18);right(36);back(18);Bup;//左目の描写 left(40);go(50);left(25);//鼻への移動 Bdn;go(25);right(45);back(20);right(45);go(25);Bup//鼻の描写 left(18);go(60);right(30);//髪への移動 Bdn;repeat(6) {go(30);left(15);back(40);right(15);}Bup;//髪の描写 }
左が実際に書かれた顔。 マジックでなぞると 左のようになる。
僕等の似顔絵ロボットはAに接続したのモーターが右のタイヤを、Bのモーターがペンを、Cに接続したモーターが左のタイヤを動かす設計になっています。
今回のプログラムで使用したマクロ
#define set SetPower(OUT_A+OUT_C,3);SetPower(OUT_B,1)//車輪とペンのモーターの出力設定 #define gomae(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//100分のt秒前進するマクロ #define r(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//100分のt秒右旋回するマクロ #define l(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C);//100分のt秒左旋回するマクロ
今回はシャープペンシルを用いたためペン下げのプログラムにはOffの定義がなく、常に下方向に力が加わり比較的濃く書けるようになっている
#define bdown OnFwd(OUT_B);Wait(20);//ペン下げ #define bup OnRev(OUT_B);Wait(15);Off(OUT_B);ペン上げ
ここからが行動のプログラム
出力固定とペン下げ
task main (){set;bdown;Wait(5);//これにより筆圧が上がる
repeat(18){OnFwd(OUT_A+OUT_C);Wait(3);Off(OUT_C);Wait(18);}gomae(20);//輪郭の描写 repeat(18){OnFwd(OUT_A+OUT_C);Wait(3);Off(OUT_C);Wait(18);}gomae(20);
l(40);gomae(10);bdown;repeat(15){OnFwd(OUT_A+OUT_C);Wait(5);OnRev(OUT_C);Wait(6);}//眼鏡の描写 l(60);gomae(10);bdown;repeat(15){OnFwd(OUT_A+OUT_C);Wait(5);OnRev(OUT_C);Wait(6);}
bup;gomae(10);l(140);//目の描写 gomae(35);bdown;gomae(20);bup;gomae(12);bdown;gomae(32);bup;gomae(12);bdown;gomae(20);bup;gomae(20);
l(180);gomae(10);bdown;repeat(15){OnFwd(OUT_A+OUT_C);Wait(5);OnRev(OUT_C);Wait(6);}//眼鏡の描写 l(60);gomae(10);bdown;repeat(15){OnFwd(OUT_A+OUT_C);Wait(5);OnRev(OUT_C);Wait(6);}
l(150);gomae(60);r(90);bdown;gomae(20);l(20);bdown;gomae(15);//鼻の描写
r(20);gomae(30);l(100);bdown;//口の描写 repeat(12){OnFwd(OUT_A+OUT_C);Wait(4);OnRev(OUT_C);Wait(6);} repeat(2){OnFwd(OUT_A+OUT_C);Wait(4);OnRev(OUT_A);Wait(6);}
l(80);gomae(150);l(120);//髪の描写 repeat(4){l(180);bdown;gomae(30);r(180);bdown;gomae(30);} Off(OUT_A+OUT_B+OUT_C);//終了 }
シャープペンシルで書いたため薄いですがご了承ください。
#define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//前進 #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//後退 #define right(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右に旋回 #define left(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//左に旋回 #define Bdn OnFwd(OUT_B); Wait(16);Off(OUT_B);//ぺんを降ろす #define Bup OnRev(OUT_B); Wait(16); Off(OUT_B);//ぺんを上げる #define DC(t) repeat(t) {OnFwd(OUT_A+OUT_C);Wait(1); Off(OUT_C); Wait(10) ; }Off(OUT_A+OUT_C)円を描く task main () { Bdn ; DC(52); Bup;//輪郭を描く Wait(50); left(60); Bdn;go(25);Bup;//左目を描く Wait(50); go(25); Wait(50); Bdn;go(25);Bup;//右目を描く Wait(50); right(35); Wait(50); back(40); Wait(50); Bdn;repeat(25) {OnFwd(OUT_A);Wait(6);OnRev(OUT_C);Wait(6);}Off(OUT_A+OUT_C);//口を描く }
丸山:時間がなく細かい調整ができなかったのが残念でした。プログラミングの基本が覚えられてよかったです。
高橋:時間がなく期限日の木曜日はほぼ一日パソコンに触っていました。プログラミングを考えるのは楽しかったが、マクロの使用による行動時間設定を細かくするのが大変で、空き時間丸一日を使っても足りなかった。今度は安定した行動をする、プログラムとロボットを作りたい。
橋本:あまり時間を割くことができずちょっとシンプルな顔になっちゃったけど、 無事に似顔絵ができてよかったです。今度作るときはもっと複雑な、より似顔絵らしく描きたいと思います。