- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009a]]
[[2009a]]
*ロボットで似顔絵を描く [#s7847f00]
[目次]
#contents
*似顔絵ロボット [#f5f5eee7]
**課題1の概要 [#weeefd04]
自作したロボットを使って似顔絵を作成する。
**ロボットの概要 [#zd18b194]
**プログラム [#u779d20c]
**工夫点 [#c2ad87bf]
** [#f01914ef]
*ロボットを制作する [#n7a1f6aa]
今回のロボットには、四輪のものを使用した。この基本となる部分は、ほぼ
解説書のまま制作した。
**試作1号機の解説 [#m2d8aa83]
まず、制作したものが下の写真の試作1号機だ。
#ref(SH350089.JPG)
この試作機は、ペンの後ろの1点をブロックによって固定するようにした。
ペンの上げ下げは、ベルトドライブによって行うことにした。この場合、ペンを何度も上下させるとペンを固定しているパーツがモーターボックスから外れることがあったので、両側から棒で固定した。また、ペンが必要以上に下がらないようにストッパーを装着した。これは、同時に適度な筆圧を保つ役目も果たす。
**1号機の問題点 [#v098115a]
・ペンを1点で支えているので横からの力に弱い。
・ペンの持ち手の強度が不十分
・構造が複雑
**試作2号機の解説 [#x2776ce4]
下の写真が1号機に改良を施した二号機
#ref(PAP_0095.JPG)
ペンの装着方法をブロックの箱組みから、3本のアームと2本の輪ゴムによる固定方法に変更した。これにより単純な構造でありながら、ペンの持ち手の強度及び、より安定した筆圧の確保に成功した。
もう1点、二号機ではペンの上げ下げの機構も変更した。1号機のベルトドライブからアングルギアによる駆動に変更することで、より確実な可動が可能になった。
#ref(PAP_0094.JPG)
*プログラム [#u779d20c]
プログラム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);
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);
turn_time-=600;
turn_right;
st;
pen_up;
re;
st;
pen_down;
curve_left;
pen_up;
re_time+=10;
re;
turn_tme+=30;
turn_left;
st;
pen_down;
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;
st;
pen_up;
go_straight(170);
turn_time+=70;
turn_right;
st;
pen_down;
go_straight(40);
OnFwd(OUT_A);
Wait(20);
Off(OUT_A+OUT_C);
}
プログラム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()
{
OnRev(OUT_B);
Wait(20);
Off(OUT_B);
}
sub pen_down()
{
OnFwd(OUT_B);
Wait(20);
Off(OUT_B);
}
sub st()
{
Off(OUT_A+OUT_C);
Wait(100);
task main()
以下プログラムver.1と同様
*工夫点 [#c2ad87bf]
先に作ったプログラムでは同じ動作を行うためにマクロのみを使用したが、そのためにプログラムの容が大きくなり転送に時間がかかった。そこで、改良したプログラムでは動作時間に変数を含まないプログラムをマクロからサブルーチンに変更した。
また、本体の移動中に不要なところでペンが上がったり下がったりしたので、移動用のプログラムとペンの上げ下げのプログラムの間に行動をキャンセルするプログラムを挿入した。
*感想 [#f01914ef]