#contents
*課題1:書道ロボット [#mf10a4a4]
「長」、「京」の2文字を、タンクロボットに書かせる。(課題の発表のあとで気づいたのですが、土台も改造すればよかったんですね・・・。)
#ref(全体2.jpg)
''(製作者:座敷童、ネタ切れ)''
**ロボにペンを持たせる [#k8e78985]
最初の形では、とりあえずペンがつけばいいのかな?ということで、前にペンをつけてみました。が、ロボの回転の中心からペン先がずれ、曲ったあとのペン位置の修正が非常に大変!!
~ ↓↓↓
~思い切って大改造!
ペンを本体の中央あたりで上下するようにしたら、曲ったあともペン先の位置は変わらないのではないだろうか?
→とりあえず、回転の軸には近づいたけれど、若干ずれる…。
#ref(a9 system.jpg)
(▲後ろから見た写真です。ペンを上下させる部分です。)
#ref(上下.jpg)
(▲上と下から見た写真です。ペンが本体の中央あたりにあるのがわかると思います。)
最初の形ほどにずれがひどくはないので、ペン先の位置を修正しつつ動かすプログラム の作成にとりかかることになりました。
**プログラム [#vec8ff50]
ペンは下がった状態から開始します。
***曲がったあとのペン先の修正 [#b8934999]
-まずは、曲ったあとのペン先の位置の調整をするプログラムを作ってみました。
0.5秒前進し、ペンをあげて向きをかえ、ペン先の位置を調整してまた0.5秒進むプログラム
(角が合うように調整します。)
#ref(修正.jpg)
#define MOTOR OUT_A+OUT_C
#define TURN_TIME 15 //曲がったあとの修正にかかる時間をTURN_TIMEとおく。
sub arm_up(){
OnFwd(OUT_B); Wait(5); Off(OUT_B);
}
sub arm_down(){
OnRev(OUT_B); Wait(5); Off(OUT_B);
}
task main()
{
OnFwd(MOTOR); Wait(50); //0.5秒前進
arm_up();
OnRev(MOTOR); Wait(TURN_TIME); //TURN_TIMEの分を戻って…。
OnFwd(OUT_C); Wait(160); //方向をかえて…。
OnFwd(MOTOR); Wait(TURN_TIME); //TURN_TIMEの分を進む。
arm_down();
OnFwd(MOTOR); Wait(50); //直進
Off(MOTOR);
}
これで(ほぼ)角でペン先のずれが解消されます!
***「長」のプログラム [#dbade902]
-角の位置がある程度調整できたところで、この数値を曲がる部分のプログラムにいれて「長」のプログラムを書いてみました。
#ref(長.jpg)
(以下、「長」のプログラム中の説明にでてくる数字は、この図中の数字を参考にしてください。)
#define MOTOR OUT_A+OUT_C //
#define TURN_TIME 15 //
sub turn_left() //角でのペン位置を調整しつつ左折
{
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_A);
Wait(162);
OnFwd(OUT_C); Wait(TURN_TIME);
Off(MOTOR);
}
sub turn_right() //角でのペン位置を調整しつつ右折
{
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_C);
Wait(165);
OnFwd(OUT_A); Wait(TURN_TIME);
Off(MOTOR);
}
sub arm_up() //ペンを紙から離す
{
Off(MOTOR);
OnFwd(OUT_B); Wait(6);
Off(OUT_B);
}
sub arm_down() //ペンを紙に下ろす
{
Off(MOTOR);
OnRev(OUT_B); Wait(8);
Off(OUT_B);
}
task main()
{
OnFwd(MOTOR); Wait(50); //1〜2を書く
arm_up();
OnRev(MOTOR); Wait(52); //2〜1を移動
turn_right();
arm_down();
OnFwd(MOTOR); Wait(55); //1〜3を書く
arm_up();
OnRev(MOTOR); Wait(40); //3〜4を移動
turn_left();
arm_down();
OnFwd(MOTOR); Wait(40); //4〜5を書く
arm_up();
OnRev(MOTOR); Wait(40); //5〜4を移動
turn_right();
OnFwd(MOTOR); Wait(18); //4〜6を移動
turn_left();
arm_down();
OnFwd(MOTOR); Wait(38); //6〜7を書く
arm_up();
OnRev(MOTOR); Wait(38); //7〜6を移動
turn_right();
OnFwd(MOTOR); Wait(18); //6〜3を移動
turn_right();
OnFwd(MOTOR); Wait(45); //3〜8を移動
arm_down();
OnRev(MOTOR); Wait(100); //8〜9を書く
arm_up();
OnFwd(MOTOR); Wait(75); //9〜3を移動
turn_left();
arm_down();
OnFwd(MOTOR); Wait(25); //3〜10を書く
arm_up();
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_A); Wait(75);
OnFwd(OUT_C); Wait(TURN_TIME);
Wait(20); //10〜11を移動
Off(MOTOR);
arm_down();
OnRev(MOTOR); Wait(41); //11〜12を書く
arm_up();
OnRev(MOTOR); Wait(25); //12〜13を移動
arm_down();
OnFwd(MOTOR); Wait(20); //13〜14を書く
arm_up();
turn_right();
OnFwd(MOTOR); Wait(20); //14〜15を移動
arm_down();
OnRev(MOTOR); Wait(65); //15〜16を書く
arm_up();
Off(MOTOR);
}
***「京」のプログラム [#g0a2d153]
-次に、「京」のプログラムです。
#ref(kyou.jpg)
(以下、「京」のプログラム中の説明にでてくる数字は、この図中の数字を参考にしてください。)
#define MOTOR OUT_A+OUT_C //
#define TURN_TIME 15 //
sub turn_left() //角でのペン位置を調整しつつ左折
{
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_A);
Wait(165);
OnFwd(OUT_C); Wait(TURN_TIME);
Off(MOTOR);
}
sub turn_right() //角でのペン位置を調整しつつ右折
{
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_C);
Wait(162);
OnFwd(OUT_A); Wait(TURN_TIME);
Off(MOTOR);
}
sub arm_up() //ペンを紙から離す
{
Off(MOTOR);
OnFwd(OUT_B); Wait(6);
Off(OUT_B);
}
sub arm_down() //ペンを紙に下ろす
{
Off(MOTOR);
OnRev(OUT_B); Wait(8);
Off(OUT_B);
}
task main()
{
OnFwd(MOTOR); Wait(30); //1〜2を書く
arm_up();
turn_right();
OnFwd(MOTOR); Wait(50); //2〜3を移動
arm_down();
OnRev(MOTOR); Wait(100); //3〜4を書く
arm_up();
OnFwd(MOTOR); Wait(90);
turn_left();
OnFwd(MOTOR); Wait(20); //4〜5を移動
arm_down();
OnFwd(MOTOR); Wait(40); //5〜6を書く
arm_up();
OnRev(MOTOR); Wait(40); //6〜5を移動
turn_left();
arm_down();
OnFwd(MOTOR); Wait(100); //5〜7を書く
arm_up();
turn_right();
arm_down();
OnFwd(MOTOR); Wait(40); //7〜8を書く
arm_up();
turn_right();
OnFwd(MOTOR); Wait(100); //8〜6を移動
arm_down();
OnRev(MOTOR); Wait(100); //6〜8を書く
arm_up();
OnFwd(MOTOR); Wait(50); //8〜9を移動
turn_left();
arm_down();
OnFwd(MOTOR); Wait(80); //9〜10を書く
arm_up();
OnRev(MOTOR); Wait(80);
OnRev(MOTOR); Wait(TURN_TIME);
OnFwd(OUT_C); OnRev(OUT_A); Wait(70);
OnFwd(MOTOR); Wait(30+TURN_TIME); //10〜11を移動
arm_down();
OnFwd(MOTOR); Wait(70); //11〜12を書く
arm_up();
OnRev(MOTOR); Wait(100+TURN_TIME); //12〜9を移動
OnRev(OUT_C); OnFwd(OUT_A); Wait(140);
OnFwd(MOTOR); Wait(30+TURN_TIME); //9〜13を移動
arm_down();
OnFwd(MOTOR); Wait(70); //13〜14を書く
Off(MOTOR);
}
***実際に、「長」と「京」を書いてみました [#zc39ef3b]
#ref(「長」.jpg)
(▲「長」の結果です。)
#ref(「京」.jpg)
(▲「京」の結果です。)
**工夫&努力した点 [#g24de817]
・曲がり角などでペン先の位置がずれてしまう。
~→本体の中央あたりにペンを持ってきて、そこの場所で上下させることである程度ずれが解消されました。
・ペンの位置を中央にもってくることによって、左右のバランスが崩れてしまい、左折右折で数値がかわってくる。
~ →左折、右折の場合でそれぞれ数値を出してそれぞれ調整。
・ペンと回転の軸を近づけるために、機械本体を立てることにしました。
~ →固定に苦労しました・・・。なんとか固定。(下の写真が努力の結晶(?))
#ref(a9 stopper.jpg)
・A4の紙にそれぞれの文字をおさめる。
~ →文字がゆがんでしまうと、はみでてしまうので、多少のずれも考慮したサイズに変更しました。
**感想 [#wf699d37]
-とりあえずペンを前に(結構本体から離れた位置)つけてプログラムを作り終えてから、ペンの位置をかえたらいいことに気づき、最初からやり直しになったりと、なかなか大変でした。1人でやるのではなく、2人で協力して課題にとりくむというのは、時間の調整など大変なところもありましたが、2人でやればアイデアも2倍!ということで、苦心しつつも楽しく課題にとりくむことができました。(ネタ切れ)
-ロボットが重心を中心に回転することを知り、どうしたら90°回転後ペンが元の位置に戻るのかには苦労しましたが、自分が作ったプログラムで形が変でもロボットで字を書くことができた時には、すごく感動しました。(座敷童)
***★コメントをどうぞ★ [#vf7c7339]
-字を図示して閲覧者にわかりやすくしている点はとても評価できる。結果的にプログラムの説明がわかりやすくなっている。 -- [[ヒロヤ]] &new{2007-05-24 (木) 01:14:17};
-ロボットの詳細説明はなかなかよいのですが、全貌の図や写真をとりいれて、全体を見据えた説明がほしいですね。 -- [[まいける(TA)]] &new{2007-05-27 (日) 15:26:07};
-回転に関する考察等、イラストを多用している点は評価に値する。 -- [[ヒロヤ]] &new{2007-06-06 (水) 22:37:07};
#comment
[[2007a/A9]]