書道ロボット
目次
書道ロボットを作ろう。2人1組でロボットを作り、それぞれ自分にゆかりのある合計10画以上の漢字2文字を書かせる。漢字はA4の紙1枚に書く。
自分が住んだことのある三重県の「三重」(合計12画)を選んだ。また、三重県の知名度を上げるため。
名前は「みぃ〜君」今回三重と宮木を書くので頭文字の「み」から。かわいくアレンジ。片手で筆を持ち、片手で紙を押さえるイメージ。(他者の意見参考)車輪が目。ちなみに左利き。
今回はXY座標型にして動かした。書こうとする漢字「三重」は横、縦棒が非常に多いのでXY座標型のほうがプログラミングが簡単だと思いこちらにした。最初は一画一画動いて文字を書いていくロボットにしていましたが、プログラミングでうまくいかなくなりやめた。
・失敗作
・本体 大きく分けて親機と子機に分かれる。親機が子機の台座となり子機がその上を動く。親機にはモータAが備えられており縦方向に動く。子機にはモータCで横井方向に動き、モータBでペンの上げ下げをする。
上:子機 子機はタイヤと歯車でバランスを取り、台(親機)の上で滑らかに動くことができる。
上:親機 タイヤが動く台座がある。中央に黒色の支えをつけることにより、ずれを減らした。
・モータについて
書き順はできる限り効率よくかつきれいに書くように心がけた。横棒の大きさや位置をできる限り正確に書けるように一画書いて書き始めの位置に戻るようにした。そうすることで一画一画の長さの違いがはっきりとかつ不自然のないようにした。
#define yoko(t) OnFwd(OUT_B);Wait(22);Off(OUT_B);Wait(20); OnFwd(OUT_C);Wait(t);Off(OUT_C);Wait(10); OnRev(OUT_B);Wait(25);Off(OUT_B); OnRev(OUT_C);Wait(t);Off(OUT_C); //左から右へ一画書いて戻る #define tate_ido(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); //上から下へ動く #define tate(t) OnFwd(OUT_B);Wait(22);Off(OUT_B);Wait(20); OnFwd(OUT_A);Wait(t);Off(OUT_A);Wait(10); OnRev(OUT_B);Wait(25);Off(OUT_B); OnRev(OUT_A);Wait(t);Off(OUT_A); //上から下へ一画書いて戻る
「三重」には、長さの違う横棒や縦棒で基本出来ているので、defineには一画をセットで書くことにした。
move_timeの時間を変えることによって同じ横棒でも長さを変えることができた
task main() { int move_time; move_time=0; //スタートタイム
move_time+=50; //タイム50 yoko(move_time); //1画 move_time-=37; //タイム13 tate_ido(move_time);
OnFwd(OUT_C);Wait(10);Off(OUT_C); move_time+=17; //タイム30 yoko(move_time); //2画 OnRev(OUT_C);Wait(10);Off(OUT_C);
move_time-=17; //タイム13 tate_ido(move_time);
move_time+=37; //タイム50 yoko(move_time); //3画
「三」完成
move_time-=35; //タイム15 tate_ido(move_time);
OnFwd(OUT_C);Wait(10);Off(OUT_C);Wait(10); move_time+=10; //タイム25 yoko(move_time); //4画 OnRev(OUT_C);Wait(10);Off(OUT_C);
move_time-=20; //タイム5 tate_ido(move_time); //5画
move_time+=45; //タイム50 yoko(move_time); //6画
move_time-=45; //タイム5 tate_ido(move_time); //7画
OnFwd(OUT_C);Wait(5);Off(OUT_C); move_time+=5; //タイム10 tate(move_time); //8画 OnFwd(OUT_B);Wait(22);Off(OUT_B);Wait(20); OnFwd(OUT_C);Wait(40);Off(OUT_C);Wait(10); OnFwd(OUT_A);Wait(10);Off(OUT_A);Wait(10); //タイム10 OnRev(OUT_B);Wait(25);Off(OUT_B); OnRev(OUT_A);Wait(10);Off(OUT_A); //9画 OnRev(OUT_C);Wait(40);Off(OUT_C); move_time-=5; //タイム5 tate_ido(move_time);
繰り返しを使い同じ長さの棒を3本かく
repeat(3){ move_time+=35; //タイム40 yoko(move_time); //10画
move_time-=35; //タイム5 tate_ido(move_time); } OnRev(OUT_C);Wait(5);Off(OUT_C); move_time+=45; //タイム50 yoko(move_time); //11画
OnFwd(OUT_C);Wait(25);Off(OUT_C); OnFwd(OUT_B);Wait(22);Off(OUT_B);Wait(20); 12角 OnRev(OUT_A);Wait(21);Off(OUT_A);Wait(10); OnRev(OUT_B);Wait(20);Off(OUT_B); //終わり
「重」完成 }
一画ずつ戻らせる定義でやったがどうしてもできない箇所があり、そこではまったく定義が使えなかった。もう少し細かくやったほうが良かったかもしれない。
動画 https://youtu.be/wMPDYSKv5B8
電圧によって書く大きさが変わり三重の重が本番では三に比べ小さくなってしまった。本番に合わせて調整しやすいようにプログラミングするべきだと思った。 ペンの上げ下げに使う機構が威力が大きすぎてペン先をだめにしてしまうことが多かった。全体的にモータの回転数を下げれなかったことが問題だと思った。次回はもっと精密にゆっくりとしたロボットを作るべきと思った。
ロボットを作り本格的に動かせたのは初めてで感動的だった。いろいろな演算子で動かすのは楽しいと思い、動きにあったものを使っていくことはやりがいがあった。今回は後でもっとこうしたらよかったことが多く後悔もあった。次回は今回以上に満足できるものを作りたい。