#ref(/2015a/Member/shungo/Mission1/IMG_1800.JPG)
#contents
*課題 [#h0b79946]
書道ロボットの製作し、7画以上の漢字を書く。詳しくは
[[課題1のページ>http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission1]]
を参照。
私は涼という漢字を書くことにした。
*ロボット本体の説明 [#bd9a3611]
**ロボットの外観 [#z75277cb]
上から見た写真
#ref(edo_ue.jpg)
またこのロボットは役割ごとに下の写真のように4つに分解できる
#ref(edo_bunnkai.jpg)
�,良�分で筆を上げ下げし、�△良�分で横にペン先を動かし、��の部分で縦にペン先を動かす。
こうすることでペン先はどの方向にも動かすことが出来るので、どの様な文字も書くことが出来る。
それぞれのパーツについて仕組みと工夫した点を書いていく。
**�.撻鵑鮠紊臆爾欧垢襯僉璽� [#v86048ae]
�,魯撻鵑鮠紊臆爾欧垢襯僉璽弔任△襦�
ペンを正回転させて、最下点で丁度紙にペン先がつくようにしている。
また、最下点で止まるようにつっかえとして棒を突き出している。
元々は垂直に上げ下げするようにしていたが、モーターの力と上げ下げの速度のバランスが上手く取れずに今の形になった。
また、一番綺麗に文字が書けるペンを試行錯誤し、100円均一の細筆ペンにした。
#ref(edo_1.jpg)
**��横にペン先を動かすパーツ [#rcd5dbf3]
�△廊,魏�に動かすパーツである。
このパーツではモーターを回転させることで、
下の写真の赤枠の部分が左右にスライドし、�,鮑険Δ貌阿�す。
正回転で右に、負回転で左にスライドする
このパーツと、後に書く��のパーツについては特に文字を書く時大きな力が加わりバラバラになりやすかったので頑丈に作った。このパーツの可動部は5箇所で意図していない方向にずれないように固定してある。
#ref(edo_2.jpg)
**��縦にペン先を動かすパーツ [#k672a4db]
��は�,鬮△瓦帆宛紊貌阿�すパーツである。
このパーツではモーターを回転させることで、
下の写真の赤枠の部分が左右にスライドし、�△鬮,瓦帆宛紊貌阿�す。
正回転で前に、負回転で後ろにスライドする
このパーツも、前に書いた�△離僉璽墜瑛諭�特に文字を書く時大きな力が加わりバラバラになりやすかったので頑丈に作った。このパーツの可動部は4箇所で意図していない方向にずれないように固定してある。
また、可動部の下の部分が紙のふちに引っかかりやすかったので、引っかからない位置の基準が分かるように黄色ブロックと黒ブロックの境目で引っかからない境界を示した。
#ref(edo_3.jpg)
**�ぅ灰鵐團紂璽拭蔀屬�場兼すべり止め [#gea9bcba]
�い魯蹈椒奪箸鮹屬�場所をしつつ、裏側に下の写真のように6個の動かないタイヤで固定している場所である。コンピューターの重さで垂直効力が大きくなり、摩擦が大きくなるようにしてある。
�い呂修發修眤�のコンピューター置き場であったが、いざ起動してみると改良前では本体全体が左右にぶれてしまったので、余った少ないパーツでやりくりしてすべり止めを付けた。
#ref(edo_4.jpg)
*プログラムの説明 [#e7dae3ec]
**プログラムのそれぞれの説明 [#e884f45f]
***それぞれのモーターの回転方向とペンの動く向き [#ya5cf7c2]
ペン先の動きとそれぞれのモーターは次のような関係にある。
モーターAはペンの上げ下げ、モーターBはペンの前後、モーターCはペンの左右
***初期位置 [#i17d280f]
書き始めの位置を一定にするために下のような、ペンを左上に持っていくためのサブルーチンを作成した。
この時同時にモーターのパワーの調整もするようにしている。
また、書いている途中で一旦初期位置にペンを持っていくことも出来るので、�△鉢�のモーターの個体差による誤差を軽減できる。
sub syoki() //初期位置(左上)にペンを持って行きつつ、モーターのパワーの設定
{
SetPower(OUT_A,1);
SetPower(OUT_B,3);
SetPower(OUT_C,3);
OnRev(OUT_A);
Wait(5);
Off(OUT_A);
OnFwd(OUT_B);
OnRev(OUT_C);
Wait(100);
Off(OUT_BC);
}
***8方向のペンの移動 [#c9a8f71a]
ペンを8方向で(45°づつ360°) 好きな時間だけ動かせるように8個の関数を作成した。
次は右下に動かすための関数である。
void migisita (int t) //ペンを右下に45度t秒動かす
{
OnFwd(OUT_C);
OnRev(OUT_B);
Wait(t);
Off(OUT_BC);
}
***文字を書いているか書いてないかの区別 [#x168e68d]
ペンで文字を書くときと書かない状態にするためにそれぞれマクロを作った。
文字を書き始めるためにまずモーターAを正回転させて、書いている間はそのまま維持する。この時、モーターに力が加わりすぎないように初めに作ったサブルーチン(syoki)でモーターAの強さを最弱にしている。逆に書き終えるときはモーターAを少しだけ負回転させて止めている。また、いずれの場合でも確実にペン先が紙についてから書き始められるように、Waitを入れてある。
#define kakidasi OnFwd(OUT_A);Wait(10); //ペンを紙につけたままにする
#define kakiyame OnRev(OUT_A);Wait(5);Off(OUT_A); //ペンを紙から離す
***文字を書くプログラム [#ybc41b6a]
後で説明する方法を利用して文字を8方向のペンの動きと、ペンが紙についているかどうかで表す。
そして、それに対応して関数を並べていく。
**使用したプログラム(全て) [#x752e646]
sub syoki() //初期位置(左上)にペンを持って行きつつ、モーターのパワーの設定
{
SetPower(OUT_A,1);
SetPower(OUT_B,3);
SetPower(OUT_C,3);
OnRev(OUT_A);
Wait(5);
Off(OUT_A);
OnFwd(OUT_B);
OnRev(OUT_C);
Wait(100);
Off(OUT_BC);
}
void migisita (int t) //ペンを右下に45度t秒動かす
{
OnFwd(OUT_C);
OnRev(OUT_B);
Wait(t);
Off(OUT_BC);
}
void hidarisita(int t) //ペンを左下に45度t秒動かす
{
OnRev(OUT_BC);
Wait(t);
Off(OUT_BC);
}
void sita(int t) //ペンを下にt秒動かす
{
OnRev(OUT_B);
Wait(t);
Off(OUT_B);
}
void ue(int t) //ペンを上にt秒動かす
{
OnFwd(OUT_B);
Wait(t);
Off(OUT_B);
}
void migi (int t) //ペンを右にt秒動かす
{
OnFwd(OUT_C);
Wait (t);
Off (OUT_C);
}
void hidari (int t) //ペンを左にt秒動かす
{
OnRev(OUT_C);
Wait (t);
Off (OUT_C);
}
void migiue (int t) //ペンを右上に45度t秒動かす
{
OnFwd(OUT_BC);
Wait(t);
Off(OUT_BC);
}
void hidariue (int t) //ペンを左上に45度t秒動かす
{
OnRev(OUT_C);
OnFwd(OUT_B);
Wait(t);
Off(OUT_BC);
}
#define kakidasi OnFwd(OUT_A);Wait(10); //ペンを紙につけたままにする
#define kakiyame OnRev(OUT_A);Wait(5);Off(OUT_A); //ペンを紙から離す
task main()
{
syoki ();
migi (5); //さんずいの書き始めの位置にペンを移動
sita (10);
kakidasi; //さんずい1画目
migisita(10);
kakiyame;
hidari (10); //さんずいの2画目にペンを移動
kakidasi; //さんずい2画目
migisita(10);
kakiyame;
hidari (10); //さんずいの3画目にペンを移動
sita (20);
kakidasi; //さんずい3画目
migiue (10);
kakiyame;
syoki (); //亠の書き始めの位置にペンを移動
migi (30);
kakidasi; //亠を一気に書く
sita (10);
migi (15);
hidari (30);
kakiyame;
sita (5); //口の書き初めの位置にペンを移動
kakidasi; //口を一気に書く
sita (15);
migi (30);
ue (15);
hidari (30);
kakiyame;
migi (15); //小の書き始めの位置にペンを移動
sita (15);
kakidasi; //小1画目
sita (20);
kakiyame;
ue (15); //小の2画目の位置にペンを移動
hidari (10);
kakidasi; //小2画目
hidarisita (15);
kakiyame; //小の3画目の位置にペンを移動
migi (25);
ue (15);
kakidasi; //小3画目
migisita (15);
kakiyame;
}
*文字を書くためにした工夫 [#cd01f1db]
おおよそのロボット本体とプログラムについては説明を終えたが、綺麗な文字を書きやすくするためにいくつか工夫した点があるので紹介する。
**関数に入れる時間tと線の長さ [#be28d3c2]
今まで授業で扱ってきたロボットと挙動が大きく違うロボットを作成したために、関数内のtと実際に引ける線の長さの関係が分からなくなってしまった。そこで、下のようなプログラム(マクロ、サブルーチン、関数の定義は前項通り)を書いて、ロボットを動かした。
task main()
{
syoki ();
kakidasi;
repeat(10)
{
sita(10);
Wait (10);
ue (10);
Wait (10);
migi (10);
Wait (10);
}
repeat (10)
{
hidari (10);
Wait (10);
migi (10);
Wait (10);
sita (10);
Wait (10);
}
}
これは関数のt=10(0.1秒)ごとに縦横に線を引くプログラムで、実際に書きあがったものが下の写真である
#ref(kakerukun.jpg)
これより、一目盛り分の長さの線を引くには関数のt=10にすればよいと分かる。
**文字を書くための下書き [#i3fc0e2d]
先ほどの目盛りを使用して文字を書くことで、長さを関数の時間、ペン運びのの順番、などが簡単に作ることが出来る。下は実際に『涼』の字のプログラムを書くときに使ったものである。
#ref(kakerukun2.jpg)
太い線は紙にペンをつけて書く場所、細い矢印は紙にペンを付けずに移動する部分。
こうすることで、ペンを紙につけるタイミング、移動させる時間、移動させる順番が視覚的に捉えることが出来る。
**綺麗に書くための工夫 [#q9249fcc]
このロボットはペン先が円を描いて紙につくため、わずかに書き初めに無駄な線が入ってしまうことが多い。そこで、書き初めの点を減らすために、一筆でで書けるところは一筆書きする様にした所、とても見やすい字になった。
*書道ロボットの書いた文字 [#db8eb16d]
#ref(edo_final.jpg)
*未解決の問題点 [#a9af40f8]
-書き初めのぶれがまだ多く残っていてきれいな字とは言えない。パーツ�,旅渋い鮑遒蠶召靴匿眥召縫撻鵑鮠紊臆爾欧�上手くできるようにすれば改善できるだろう。
-書ける文字がパーツ�◆▲僉璽牒�の可動範囲に縛られてしまうので小さな文字になってしまう。パーツ�◆▲僉璽牒�の可動範囲を大きくするためにパーツ��を自走式にして、パーツ�△鬟僉璽牒�の部品で大きくするといいかもしれない。
*かかった時間 [#d8e367ad]
-ロボット本体…約30時間
-プログラムのmain以外…約2時間
-プログラムのmainを書くための試行錯誤…約2時間
-プログラムのmain…約30分
-ホームページ…約6時間
*まとめと反省 [#k800e210]
今回初めてのロボット作成ということでそれぞれのLEGOパーツの使い方から全て試行錯誤して作成したので非常に時間がかかった。プログラムは比較的早く書き終えた。まだ、改善できそうな点はあるが、どれも大きく変えなければならないので一先ず、この課題はこのあたりで区切りをつけることにする。