目次
#contents

*はじめに [#x7c26023]
今回の課題は、文字を書く「書道ロボット」。
チームで制作したロボの構造、およびプログラムの説明を以下に記す。
なお、書く文字は「萌」という漢字である。

*ロボットの構造 [#zbb545e0]
**全体像 [#nde8b1f9]
#ref(./zentai.jpg,40%)
上図がロボットの完成型である。

**ロボットの動き [#f804eac8]
文字を書く上で必要な動きは、筆の上げ下げ、前後左右、更に斜めの動きである。
これらの動きは、ロボットの一つの部位に一つの役割を与えることで解決した。以下、各部位を詳細に見ていく。
***アーム [#jd5023e3]
&ref(./hude.jpg,30%);
&ref(./hude.jpg,25%);
初期のアーム(左図)

アームは筆の上げ下げをする。ギアを回すことで筆を上げ下げする仕組みになっている。筆は最初、輪ゴムで取り付ける予定だったが、安定しないためブロックで取り付けた。
アームは筆の上げ下げをする。ギアを回すことで筆を上げ下げする仕組みになっている。筆は最初、輪ゴムのみで取り付ける予定だったが、安定しないため輪ゴムとブロックで取り付けた。
***土台 [#r06c822b]
#ref(./dai.jpg,30%)
#ref(./dai.jpg,25%)
前後の動きは土台で行う。ここでポイントなのが、後輪だけをギアで動かすことである。こうすることで無駄なギアを省き、他の部位にギアを使用することができる。前輪はスリム化のため車輪を1つにした。

***可動アーム [#t092174a]
&ref(./suraido.jpg,25%);

土台とアームをギアで接続した。こうすることでアーム自体を動かし、横線を書くことが可能になった。

ちなみに斜めの線は、この可動アームの左右の動きと土台の前後の動きを同時に行うことで書ける。

**全体像 [#nde8b1f9]
#ref(./zentai.jpg,30%)
こうして完成したロボットが上図である。アームが重い分、土台との接続が脆い。

*プログラム [#h8a681d5]
続いてプログラムについて説明する。指定はないが、書き順を意識してプログラムを作成した。
**動きを定義 [#ka27d691]
まず、左右、前後、斜めの動きを定義した。以下、そのプログラムである。
 #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はアーム全体を動かすモーターとなっている。

**動きを定義 -サブルーチンの利用- [#fa88ee3e]
 sub kaku()
 {
   OnFwd(OUT_B);Wait(20);Off(OUT_B);
 }

 sub kakanai()
 {
   OnRev(OUT_B);Wait(20);Off(OUT_B);
 }

プログラムの増加を抑えるために、筆の上げ下げはサブルーチンを使って上のようにプログラムした。最初のsub kaku()が筆を下す動き、次のsub kakanai()が筆を上げる動きである。

**文字を書かせる [#e19fa0c2]
以上のように定義してできたプログラムが以下になる。
 #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();             //ここまでが「萌」の月
 }

こうして「萌」の字を書かせた。

&ref(./zi.jpg,25%);
ロボが書いた字(左図)

*課題を終えて [#rf530f45]
このロボットの欠点として挙がったのが、滑らかな線が描けないこと。その例が払いの部分である。直線はかなり綺麗にかけているが、その分「ロボットが書いた字」という印象が強かった。また、回によって微妙に線や間隔がずれてしまったのでロボットの微調整が大変だった。

プログラムに関してはもう少しプログラムを短くしたかったが、画数が多いこととその順番を意識したので完成したプログラムの長さが妥当かと思われる。今後の課題では、学んだツールを適当なところで使えるようにしたい。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS