- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009b]]
*課題1:お絵描きロボット [#ia123561]
A3の紙に相棒の似顔絵を書くロボットを作成する。
目次
#contents
*ロボット製作 [#u3904f50]
**方針 [#xaf85203]
プログラムの作成をより簡単に、そして、移動距離が長くなるにつれて大きくなる誤差を最小限にするために、縦と横の線を組み合わせて似顔絵を描くようなロボットを作成することにした。
***前後の移動 [#f97aceb5]
最初に作成したロボットは左右2つのモーターで動きをコントロールしていたが、今回は、前後だけなので3つしかないモーターを有効に活用するために1つのモーターで4つのタイヤを動かすことにした。
#ref(2009b/A2/課題1右/dodai.jpg,50%,略図)
イメージ図
#ref(2009b/A2/課題1右/dodai.jpg,right,40%,略図)
RIGHT:イメージ図
***左右の移動 [#p4b1b818]
モーターを1つ使い、レールの中にアームを通して、タイヤでアームをスライドさせて伸び縮みさせることで、横の線を引くことにした。
#ref(2009b/A2/課題1右/arm.jpg,50%,略図)
#ref(2009b/A2/課題1右/arm.jpg,right,50%,略図)
RIGHT:イメージ図
***上下の移動 [#c6c9b0f7]
ペンを上げ下げするために、最後の1つのモーターを用いて、ペンを上げたり下ろしたりする動力へと活用することにした。当初は、ペンを垂直に持ち上げる方式を考えたが、アームの部分が重くなりすぎるので、斜めにペンを上げ下ろしすることにした。
#ref(2009b/A2/課題1右/pen.jpg,right,50%,略図)
RIGHT:イメージ図
**製作手順 [#x2b97886]
***土台の作成 [#faa3db53]
アームやRCXなどを支える土台であるため、全体のバランスが取れるようにすることが重要になった。前後のコントロールをする1つのモーターを土台の真ん中に位置するように設置することで、バランスが安定した。
***アームの作成 [#v0938297]
***ペンを持つところ [#pf22160b]
***ペンを持つところ・ペンの上げ下ろし [#w3b15732]
***完成? [#f76ed885]
***完成 [#y675b086]
**工夫した点 [#rfba6b87]
**問題点 [#ne6d3088]
*プログラムとお絵描きロボットの描いた顔 [#v675879a]
**その1 [#h9f9044a]
#define PEN 50 //ペンの上げ下げ時間
#define REST Wait(50); //停止時間
#define GO(t) OnFwd(OUT_C);Wait(t);Off(OUT_C); //前進
#define BACK(t) OnRev(OUT_C);Wait(t);Off(OUT_C); //後退
#define RIGHT(t) OnFwd(OUT_A);Wait(t);Off(OUT_A); //右
#define LEFT(t) OnRev(OUT_A);Wait(t);Off(OUT_A); //左
#define A 1 //似顔絵の拡大係数
sub pen_up(){ //ペンを上げる動作
OnFwd(OUT_B);
Wait(PEN);
Off(OUT_B);
}
sub pen_down(){ //ペンを下げる動作
OnRev(OUT_B);
Wait(PEN);
Off(OUT_B);
}
task main(){
repeat(2){ //眉毛二本
RIGHT(40*A);
REST;
pen_down();
RIGHT(40*A);
pen_up();REST;
}
GO(10*A);
LEFT(30*A);
REST;
pen_down(); //右目
LEFT(10*A);
pen_up();REST;
LEFT(70*A);
REST;
pen_down(); //左目
LEFT(10*A);
pen_up();REST;
GO(30*A);
RIGHT(45*A);
REST;
pen_down(); //鼻
GO(20*A);
REST;
LEFT(10*A);
pen_up();REST;
GO(30*A);
RIGHT(45*A);
REST;
pen_down(); //口
LEFT(60*A);
pen_up();REST;
LEFT(40*A);
BACK(90*A);
REST;
pen_down(); //輪郭(左の線)
GO(100*A);
REST;
RIGHT(140*A); //輪郭(下の線)
REST;
BACK(160*A); //輪郭(右の線)
REST;
LEFT(140*A); //輪郭(上の線)
REST;
GO(50*A); //輪郭(左の線)
pen_up();
}
***工夫した点・苦労した点など [#d318c5ba]
**その2 [#ud78345b]
#define MOVE_TIMEAX 10
#define MOVE_TIMECY 5
#define MOVE_TIMEBZ 30
#define PAUSE 100
#define Z_UP OnFwd(OUT_B); Wait(MOVE_TIMEBZ); Off(OUT_B); Wait(PAUSE);
#define Z_DOWN OnRev(OUT_B); Wait(MOVE_TIMEBZ); Off(OUT_B); Wait(PAUSE);
#define X_RIGHT OnRev(OUT_A); Wait(MOVE_TIMEAX); Off(OUT_A); Wait(PAUSE);
#define X_LEFT OnFwd(OUT_A); Wait(MOVE_TIMEAX); Off(OUT_A); Wait(PAUSE);
#define Y_FRONT OnRev(OUT_C); Wait(MOVE_TIMECY); Float(OUT_C); Wait(PAUSE);
#define Y_BACK OnFwd(OUT_C); Wait(MOVE_TIMECY); Float(OUT_C); Wait(PAUSE);
task main()
{
Wait(100);
Z_DOWN;
Y_FRONT;
X_RIGHT;
Y_BACK;
X_LEFT;
OnRev(OUT_A); Wait(40); Off(OUT_A);
Wait(PAUSE);
Y_FRONT;
X_RIGHT;
Y_BACK;
X_LEFT;
Z_UP; //grass
OnFwd(OUT_A); Wait(20); Off(OUT_A);
Wait(PAUSE);
OnRev(OUT_C); Wait(10); Off(OUT_C);
Wait(PAUSE);
Z_DOWN;
OnRev(OUT_C); Wait(10); Off(OUT_C);
Wait(PAUSE);
Z_UP; //nose
OnRev(OUT_C); Wait(10); Off(OUT_C);
Wait(PAUSE);
OnRev(OUT_A); Wait(20); Off(OUT_A);
Wait(PAUSE);
Z_DOWN;
OnFwd(OUT_A); Wait(MOVE_TIMEAX); Float(OUT_A);
Wait(PAUSE);
Z_UP; //mouth
OnFwd(OUT_A); Wait(5); Float(OUT_A);
Wait(PAUSE);
OnRev(OUT_C); Wait(MOVE_TIMECY); Float(OUT_C);
Wait(PAUSE);
Z_DOWN;
OnRev(OUT_A); Wait(50); Float(OUT_A);
Wait(PAUSE);
OnFwd(OUT_C); Wait(50); Float(OUT_C);
Wait(PAUSE);
OnFwd(OUT_A); Wait(50); Float(OUT_A);
Wait(PAUSE);
OnRev(OUT_C); Wait(50); Float(OUT_C);
Wait(PAUSE);
Z_UP;
}
***工夫した点・苦労した点など [#s96fd9cf]
*感想 [#m5048026]
*コメントどうぞ [#u4aacdee]
#comment