- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009a]]
[[2009a/A2/課題1左]]
*ロボットで似顔絵を描く [#s7847f00]
[目次]
#contents
*ロボットを制作する [#n7a1f6aa]
今回のロボットには、四輪のものを使用した。この基本となる部分は、ほぼ
解説書のまま制作した。
#ref(SH350097.JPG)
**試作1号機の解説 [#m2d8aa83]
まず、制作したものが下の写真の試作1号機だ。
#ref(SH350089.JPG)
この試作機は、ペンの後ろの1点をブロックによって固定するようにした。
ペンの上げ下げは、ベルトドライブによって行うことにした。この場合、ペンを何度も上下させるとペンを固定しているパーツがモーターボックスから外れることがあったので、両側から棒で固定した。また、ペンが必要以上に下がらないようにストッパーを装着した。これは、同時に適度な筆圧を保つ役目も果たす。
**1号機の問題点 [#v098115a]
・ペンを1点で支えているので横からの力に弱い。
・ペンの持ち手の強度が不十分
・構造が複雑
・特定のペンしか持てない
**試作2号機の解説 [#x2776ce4]
下の写真が1号機に改良を施した二号機
#ref(PAP_0095.JPG)
ペンの装着方法をブロックの箱組みから、3本のアームと2本の輪ゴムによる固定方法に変更した。これにより単純な構造でありながら、ペンの持ち手の強度及び、より安定した筆圧の確保に成功した。
ペンの装着方法をブロックの箱組みから、3本のアームと2本の輪ゴムによる固定方法に変更した。これにより単純な構造でありながら、ペンの持ち手の強度及び、より安定した筆圧の確保に成功した。また、一定の太さのペンであれば保持することが可能となった。
もう1点、二号機ではペンの上げ下げの機構も変更した。1号機のベルトドライブからアングルギアによる駆動に変更することで、より確実な可動が可能になった。
#ref(PAP_0094.JPG)
*プログラム [#u779d20c]
プログラムver.1
**T.I[#u9975251]
プログラムver.1
int turn_time
int curve_time
int re_time
#define go_straight(T); OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time);
#define curve_left OnFwd(OUT_C);Off(OUT_A);Wait(curve_tim);
#define pen_up OnRev(OUT_B);Wait(20);Off(OUT_B);
#define pen_down OnFwd(OUT_B);Wait(20);Off(OUT_B);
#define re OnRe(OUT_A+OUT_C);Wait(re_time);
#define st Off(OUT_A+OUT_C);Wait(100);
#define go_straight(T); OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time); //左旋回
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time); //右旋回
#define curve_left OnFwd(OUT_C);Off(OUT_A);Wait(curve_tim); //緩やかに左旋回
#define pen_up OnRev(OUT_B);Wait(20);Off(OUT_B); //ペンを上げる
#define pen_down OnFwd(OUT_B);Wait(20);Off(OUT_B); //ペンを下げる
#define re OnRe(OUT_A+OUT_C);Wait(re_time); //後退
#define st Off(OUT_A+OUT_C);Wait(100); //停止
task main()
{
SetPower(OUT_A+OUT_C,1);
SetPower(OUT_B,7);
pen_down;
turn_time=100;
curve_time=60;
re_time=40;
turn_time+=520;
turn_left;
Off(OUT_A+OUT_C);
SetPower(OUT_A+OUT_C,1); //AとCのモーター出力を1に設定
SetPower(OUT_B,7); //Bのモーター出力を7に設定
pen_down;
turn_time=100; //旋回時間の初期値100
curve_time=60; //カーブ時間60
re_time=40; //後退時間
turn_time+=520; //旋回時間+520
turn_left; //輪郭を描く
Off(OUT_A+OUT_C);
turn_time-=600;
turn_right;
st;
pen_up;
re;
st;
pen_down;
curve_left;
curve_left; //口を描く
pen_up;
re_time+=10;
re_time+=10; //後退時間+10
re;
turn_tme+=30;
turn_left;
st;
pen_down;
re_time-=10;
re_time-=10; //目を描く
re;
st;
pen_up;
re;
st;
pen_down;
re;
pen_up;
re;
turn_time-=30;
turn_left;
go_straight(260);
turn_right;
st;
pen_down;
re_time+=210;
re_time+=210; //帽子を描く
re;
st;
pen_up;
go_straight(170);
turn_time+=70;
turn_right;
st;
pen_down;
go_straight(40);
go_straight(40); //鼻を描く
OnFwd(OUT_A);
Wait(20);
Off(OUT_A+OUT_C);
}
プログラムver.2
プログラムver.2
int turn_time
int curve_time
int re_time
#define go_straight(T); OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
#define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(turn_time);
#define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(turn_time);
#define curve_left OnFwd(OUT_C);Off(OUT_A);Wait(curve_tim);
#define re OnRe(OUT_A+OUT_C);Wait(re_time);
sub pen_up()
sub pen_up() //ペンの上げ下げのコマンドをサブルーチンに変更
{
OnRev(OUT_B);
Wait(20);
Off(OUT_B);
}
sub pen_down()
{
OnFwd(OUT_B);
Wait(20);
Off(OUT_B);
}
sub st()
sub st() //行動をキャンセルするコマンドをサブルーチン化
{
Off(OUT_A+OUT_C);
Wait(100);
task main()
以下プログラムver.1と同様
**Fahim [#w360f67d]
task main()
{
OnFwd(OUT_A);
OnRev(OUT_C); // head
Wait(415);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
OnRev(OUT_A+OUT_C);
Wait(65);
OnFwd(OUT_B);
Wait(10);
Off(OUT_B);
OnRev(OUT_A+OUT_C); // nose
Wait(25);
OnRev(OUT_B);
Wait(10);
Off(OUT_B);
OnRev(OUT_A+OUT_C);
Wait(40);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(110);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(90);
Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C);
Wait(65);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
Wait(15);
Off(OUT_B);
OnRev(OUT_A+OUT_C); // Mouth
Wait(30);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(15);
Off(OUT_B);
OnFwd(OUT_C);OnRev(OUT_A);
Wait(90);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(80);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);OnRev(OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(50);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
Wait(15);
Off(OUT_B);
OnRev(OUT_A+OUT_C); // Eyes
Wait(30);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(10);
OnRev(OUT_A+OUT_C);
Wait(20);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
Wait(15);
Off(OUT_B);
OnRev(OUT_A+OUT_C);
Wait(30);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(15);
Off(OUT_B);
}
*完成品 [#j698fbe0]
#ref(SH350096.JPG)
~少し横から見たような似顔絵が完成した。帽子が少し寸足らずな気もするが問題ない範囲と判断。
~実際、動かす場所によって動きに多少の誤差が出ているのを確認している。
*工夫点 [#c2ad87bf]
先に作ったプログラムでは同じ動作を行うためにマクロのみを使用したが、そのためにプログラムの容が大きくなり転送に時間がかかった。そこで、改良したプログラムでは動作時間に変数を含まないプログラムをマクロからサブルーチンに変更した。
先に作ったプログラムでは同じ動作を行うためにマクロのみを使用したが、そのためにプログラムの容量が大きくなり転送に時間がかかった。そこで、改良したプログラムでは動作時間に変数を含まないプログラムをマクロからサブルーチンに変更した。
また、本体の移動中に不要なところでペンが上がったり下がったりしたので、移動用のプログラムとペンの上げ下げのプログラムの間に行動をキャンセルするプログラムを挿入した。
*感想 [#f01914ef]
単純な似顔絵を描くだけでも色々工夫してより良いものを作ろうと思うと、なかなか大変なものだと思えた。まだ不満な部分も多々あるが、時間的猶予があまりないので留めておく。次の課題にはさらに力を入れたいと思う。
*コメント欄(ご自由にどうぞ) [#f176ed70]
- ロボットの説明はよく書けています!ただ、プログラムの工夫の説明は、プログラムソースの間に挟んでいただいた方が見やすいのではないかと思います。それと、「ひとりにつき一つ以上のプログラムを作成すること。」の条件がありますので、誰が書いたプログラムかも明記してください。 -- [[こさか]] &new{2009-05-21 (木) 22:14:17};
- プログラムに説明を付けてください -- [[FI]] &new{2009-05-22 (金) 11:05:37};
- 更新しました。 -- [[Fahim]] &new{2009-05-28 (木) 19:08:35};
- Fahimさんのプログラムに、マクロが使えないか検討してみてください。 -- [[こさか]] &new{2009-05-28 (木) 23:51:52};
#comment