目次
#ref(./100518robo.jpg,around,right,80%,お絵かきロボット)
#contents
#clear

*課題 [#ma0b0e96]
**お絵描きロボット [#h1281fa6]
A3の紙に相棒の似顔絵を書くロボットを作成せよ。
**メンバー [#qc5144cd]
美濃・美斉津
みのう・みさいづ

*ロボットの製作 [#gf67d56a]
**製作したロボット [#z758577f]
#ref(./100518lb.jpg,80%,ロボット画像)
#ref(./100518lb.jpg,around,80%,ロボット画像1)
#ref(./100518lf.jpg,around,80%,ロボット画像2)
#clear
-土台部分(足回り)はLEGOの説明書通り
**工夫した点 [#q2897ee3]
-土台部分、本体及びペンの動作に関わるところは、それぞれ一体になっており、取り外し、組み立てが容易である。
#ref(./100519parts.jpg,80%,取り外した様子)
-ペンの動作部にウォームギアを使用して速度を落とし、制御しやすくした。
-土台部分、本体及びペンの動作に関わるところは、それぞれ一体になっており、取り外し、組み立てが容易である。
-ウォームギアを使用したことにより、ペン側からの力はモータに伝わらないので、ペンが自然に下がったりしない。
**今後改善すべき点 [#ka25520b]
-土台部分と本体とのつながりが弱いので、その部分の強度の改善。
-土台部分と本体とのつながりが弱いので、その部分の強度を改善したい。
-ペンの持ち方、動き方についても改善したい。
-動作させる場所によって動き方が変わり、出来た絵が歪んでしまうので、その点を改善したい。

*プログラムの作成 [#bfced5af]
*プログラムの作成(みのう) [#bfced5af]
**完成した似顔絵 [#o9a9c6fe]
#ref(./100519face_n.jpg,80%,完成した似顔絵(みのう))
**作成したプログラム [#tf2b9bcb]
 #define FORTY_FIVE_DEG 52
 
 int pen_can_up=0;
 int pen_can_dw=1;
 
 #define up_pen repeat(pen_can_up){OnRev(OUT_B);Wait(53);Off(OUT_B);}pen_can_up=0;pen_can_dw=1;
 #define dw_pen repeat(pen_can_dw){OnFwd(OUT_B);Wait(50);Off(OUT_B);}pen_can_dw=0;pen_can_up=1;
 #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);
 #define turn_left_f(t) OnRev(OUT_A);OnRev(OUT_C);Wait(65);OnRev(OUT_A);OnFwd(OUT_C);Wait(t);OnFwd(OUT_A);OnFwd(OUT_C);Wait(65);Off(OUT_A+OUT_C);
 #define turn_right_f(t) OnRev(OUT_A);OnRev(OUT_C);Wait(65);OnFwd(OUT_A);OnRev(OUT_C);Wait(t);OnFwd(OUT_A);OnFwd(OUT_C);Wait(65);Off(OUT_A+OUT_C);
 
 task main () {
 	draw_outline();
 
 	// begin move eye place
 	go_back(100);
 	turn_left(105);
 	go_straight(90);
 	// end move eye place
 	draw_eye();
 
 	// begin move hair place
 	go_back(120);
 	// end move hair place
 	draw_hair();
 
 	// begin move nose place
 	go_straight(10);
 	turn_right(110);
 	go_straight(75);
 	// end move nose place
 	draw_nose();
 
 	// begin move mouth place
 	go_back(60);
 	turn_left(110);
 	go_straight(35);
 	// end move mouth
 	draw_mouth();
 }
 
 sub draw_outline() {
 	dw_pen;
 	go_straight(100);
 	up_pen;
 	turn_left_f(FORTY_FIVE_DEG);
 
 	dw_pen;
 	go_straight(40);
 	up_pen;
 	turn_left_f(FORTY_FIVE_DEG);
 
 	dw_pen;
 	go_straight(60);
 	up_pen;
 	turn_left_f(FORTY_FIVE_DEG);
 
 	dw_pen;
 	go_straight(40);
 	up_pen;
 	turn_left_f(FORTY_FIVE_DEG);
 
 	dw_pen;
 	go_straight(100);
 	up_pen;
 }
 
 sub draw_eye() {
 	dw_pen;
 	go_straight(20);
 	up_pen;
 
 	go_straight(35);
 
 	dw_pen;
 	go_straight(20);
 	up_pen;
 }
 
 sub draw_hair() {
 	dw_pen;
 	turn_left(210);
 	up_pen;
 }
 
 sub draw_nose() {
 	dw_pen;
 	go_straight(25);
 	up_pen;
 }
 
 sub draw_mouth() {
 	dw_pen;
 	go_straight(60);
 	up_pen;
 	turn_left_f(FORTY_FIVE_DEG);
 	dw_pen;
 	go_straight(10);
 	up_pen;
 }
**工夫した点 [#i5a884ea]
-ペンを2回以上連続で上げたり下げたりしないよう(ifを使って良いか分からなかったので)repeatを使った。
-サブルーチンを使うことにより、それぞれの動作を容易にコメントアウトでき、途中から途中までの動作チェックを容易にした。
**今後改善すべき点 [#bf201c06]
-線の角のつなぎがうまくいかないので改善したい。
-髪がずれてしまっているのでその点を改善することと、量ももう少し増やしたい。
-マクロを使用したせいか、プログラムの転送に時間がかかったので、その点を改善したい。

*プログラムの作成(みさいづ) [#u6f91fcc]
**完成した似顔絵 [#b8bc585f]
#ref(./100519face_d.jpg,80%,完成した似顔絵(みさいづ))
**作成したプログラム [#tf2b9bcb]
 #define TURN_QUARTER OnFwd(OUT_A);OnRev(OUT_C);Wait(54);Off(OUT_A+OUT_C);//右に45度曲がる
 #define TURN_HALF OnFwd(OUT_A);OnRev(OUT_C);Wait(120);Off(OUT_A+OUT_C);//右に90度曲がる
 #define TURN_HALFandQUARTER OnFwd(OUT_A);OnRev(OUT_C);Wait(180);Off(OUT_A+OUT_C);//右に135度曲がる
 #define TURN_QUARTERpeper OnFwd(OUT_A);OnRev(OUT_C);Wait(58);Off(OUT_A+OUT_C);//右に45度曲がる紙の上で
 #define TURN_HALFpeper OnFwd(OUT_A);OnRev(OUT_C);Wait(108);Off(OUT_A+OUT_C);//右に90度曲がる紙の上で
 #define pen_down OnFwd(OUT_B);Wait(55);Off(OUT_B);//ペン下げる
 #define pen_up OnRev(OUT_B);Wait(55);Off(OUT_B);//ペン上げる
 task main()
 {   
    pen_down;  //髪書きスタート
    OnFwd(OUT_A+OUT_C);
    Wait(200);
    Off(OUT_A+OUT_C);
    pen_up;
    
    OnRev(OUT_A+OUT_C);
    Wait(60);
    Off(OUT_A+OUT_C);
    TURN_HALFandQUARTER;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(70);
    Off(OUT_A+OUT_C);
    
    pen_up;
    OnRev(OUT_A+OUT_C);
    Wait(60);
    Off(OUT_A+OUT_C);
    TURN_QUARTER;
    OnFwd(OUT_A+OUT_C);
    Wait(58);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(140);
    Off(OUT_A+OUT_C);//髪書き終わり
    
    pen_up;
    OnRev(OUT_A+OUT_C);//輪郭スタート
    Wait(60);
    Off(OUT_A+OUT_C);
    TURN_HALF;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(200);
    Off(OUT_A+OUT_C);
    
    pen_up;
    OnRev(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    TURN_QUARTERpeper;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    
    pen_up;
    OnRev(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    TURN_QUARTERpeper;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(80);
    Off(OUT_A+OUT_C);
    pen_up;
     
    OnRev(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    TURN_QUARTERpeper;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_up;
    
    OnRev(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    TURN_QUARTERpeper;
    OnFwd(OUT_A+OUT_C);
    Wait(65);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(140);
    Off(OUT_A+OUT_C);//輪郭終わり
    pen_up;
    
    OnRev(OUT_A+OUT_C);//目スタート
    Wait(170);
    Off(OUT_A+OUT_C);
    TURN_QUARTER;
    OnFwd(OUT_A+OUT_C);
    Wait(85);
    TURN_QUARTER;
    OnFwd(OUT_A+OUT_C);
    Wait(30);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(40);
    Off(OUT_A+OUT_C);
    pen_up;
    OnFwd(OUT_A+OUT_C);
    Wait(40);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(40);
    Off(OUT_A+OUT_C);//目終わり
    pen_up;
    
    OnRev(OUT_A+OUT_C);//鼻スタート
    Wait(135);
    TURN_HALF;
    OnFwd(OUT_A+OUT_C);
    Wait(80);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(50);
    Off(OUT_A+OUT_C);//鼻終わり
    pen_up;
    
    OnRev(OUT_A+OUT_C);//口スタート
    Wait(40);
    TURN_HALF;
    OnFwd(OUT_A+OUT_C);
    Wait(40);
    Off(OUT_A+OUT_C);
    pen_down;
    OnFwd(OUT_A+OUT_C);
    Wait(55);
    Off(OUT_A+OUT_C);
    pen_up;//口終わり
 }
**工夫した点 [#i5a884ea]
-紙の上とそうでない場合の時での曲がる時間を変えた。
-マクロを使い、プログラムを簡略化した。
**今後改善すべき点 [#bf201c06]
-プログラムがうまくまとめられず、長くなってしまい、またデータの転送に時間がかかった。
-線と線とのずれをうまく調節できなかった。
*反省・感想 [#rdeb363f]
-ペンの動作部の製作に時間をかけすぎてしまい、プログラムの調整の時間が足りなくなってしまった。今後は時間配分を考えて製作したい。また、今回は限られた部材でロボットを作るなどの様々な経験が出来たので、今後に生かしていきたい。(みのう)
-微調整がうまくいかず、時間を大幅に使ってしまった。プログラムを簡略化していれば、時間の節約になり、またうまく調節ができると思うので、その点を改善していきたいと思います。(みさいづ)

*コメントをどうぞ [#b722e30e]
- 拝見しました。とても解り易かったです。 -- [[ドドンパ]] &new{2010-05-20 (木) 22:29:09};
- いろいろ工夫しています。~
ロボットが機能ごとにパーツにわかれるというのは、改良するときに楽でよいです。~
一つ目のプログラムは、ifを使わないでつくったペンが下がっている状態ではペンを下げる命令をしても下げないための工夫は面白いです。二人目のプログラムでも、紙の上とそれ以外で分けたのは注意深いと思います。特定の角度の回転をいくつか作っているみたいですが、最大公約数が45なので45°回転をつくってrepeatを用いれば、少し簡略化できるかもしれません。 -- [[FI]] &new{2010-05-21 (金) 08:43:26};
- 良く工夫がされている所が多く見られます。プログラムについて色々試し、簡略化してみて下さい -- [[TAKA]] &new{2010-05-21 (金) 14:02:04};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS