目次
今回の課題は、文字を書く「書道ロボット」。 チームで制作したロボの構造、およびプログラムの説明を以下に記す。 なお、書く文字は「萌」という漢字である。
文字を書く上で必要な動きは、筆の上げ下げ、前後左右、更に斜めの動きである。 これらの動きは、ロボットの一つの部位に一つの役割を与えることで解決した。以下、各部位を詳細に見ていく。
アームは筆の上げ下げをする。ギアを回すことで筆を上げ下げする仕組みになっている。筆は最初、輪ゴムのみで取り付ける予定だったが、安定しないため輪ゴムとブロックで取り付けた。
前後の動きは土台で行う。ここでポイントなのが、後輪だけをギアで動かすことである。こうすることで無駄なギアを省き、他の部位にギアを使用することができる。前輪はスリム化のため車輪を1つにした。
土台とアームをギアで接続した。こうすることでアーム自体を動かし、横線を書くことが可能になった。
ちなみに斜めの線は、この可動アームの左右の動きと土台の前後の動きを同時に行うことで書ける。
こうして完成したロボットが上図である。アームが重い分、土台との接続が脆い。
続いてプログラムについて説明する。指定はないが、書き順を意識してプログラムを作成した。
まず、左右、前後、斜めの動きを定義した。以下、そのプログラムである。
#define zenshin(t) OnRev(OUT_A);Wait(t);Off(OUT_A); #define koushin(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); #define left_ue(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_AC); #define right(t) OnFwd(OUT_C);Wait(t);Off(OUT_C); #define left(t) OnRev(OUT_C);Wait(t);Off(OUT_C);
上から順に、
今回書く「萌」という字では、はねの左上のみを使用したため斜めの動きは一種類だけ定義。また、線の長さは漢字の部分によってもちろん違ってくるので、変数を利用して長さが違ってもすぐプログラムできるようにした。なお上のプログラム中で、Aは後輪のモーター、Cはアーム全体を動かすモーターとなっている。
sub kaku() { OnFwd(OUT_B);Wait(20);Off(OUT_B); }
sub kakanai() { OnRev(OUT_B);Wait(20);Off(OUT_B); }
プログラムの増加を抑えるために、筆の上げ下げはサブルーチンを使って上のようにプログラムした。最初のsub kaku()が筆を下す動き、次のsub kakanai()が筆を上げる動きである。
以上のように定義してできたプログラムが以下になる。
#define zenshin(t) OnRev(OUT_A);Wait(t);Off(OUT_A); #define koushin(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); #define left_ue(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_AC); #define right(t) OnFwd(OUT_C);Wait(t);Off(OUT_C); #define left(t) OnRev(OUT_C);Wait(t);Off(OUT_C); sub kaku() { OnFwd(OUT_B);Wait(20);Off(OUT_B); } sub kakanai() { OnRev(OUT_B);Wait(20);Off(OUT_B); } task main () { kaku(); right(90); /1画目 kakanai(); left(60); zenshin(10); kaku(); koushin(20); /2画目 kakanai(); right(30); zenshin(20); kaku(); koushin(20); /3画目 kakanai(); //草冠がここまで koushin(20); left(40); kaku(); koushin(40); /4画目 kakanai(); zenshin(40); kaku(); right(25); koushin(40); /5画目 kakanai(); left(25); zenshin(20); kaku(); right(25); /6画目 kakanai(); koushin(20); left(25); kaku(); right(25); /7画目 kakanai(); //ここまでが「萌」の日 zenshin(40); right(10); kaku(); koushin(50); left(10); /8画目 kakanai(); zenshin(50); right(10); kaku(); right(20); koushin(70); left_ue(10); /9画目 kakanai(); zenshin(50); kaku(); right(20); /10画目 kakanai(); koushin(20); left(20); kaku(); right(20); /11画目 kakanai(); //ここまでが「萌」の月 }
こうして「萌」の字を書かせた。
このロボットの欠点として挙がったのが、滑らかな線が描けないこと。その例が払いの部分である。直線はかなり綺麗にかけているが、その分「ロボットが書いた字」という印象が強かった。また、回によって微妙に線や間隔がずれてしまったのでロボットの微調整が大変だった。
プログラムに関してはもう少しプログラムを短くしたかったが、画数が多いこととその順番を意識したので完成したプログラムの長さが妥当かと思われる。今後の課題では、学んだツールを適当なところで使えるようにしたい。