[[2009b]]
*課題1:お絵描きロボット [#ia123561]
A3の紙に相棒の似顔絵を書くロボットを作成する。(製作者:PuKKu,Kata)


目次
#contents
*ロボット製作 [#u3904f50]
**方針 [#xaf85203]
 プログラムの作成をより簡単に、そして、移動距離が長くなるにつれて大きくなる誤差を最小限にするために、縦と横の線を組み合わせて似顔絵を描くようなロボットを作成することにした。
***前後の移動 [#mee42833]
#ref(2009b/A2/課題1右/dodai.jpg,right,around,40%)
 授業の最初に作成したロボットは左右2つのモーターで動きをコントロールしていたが、今回は、前後だけなので3つしかないモーターを有効に活用するために1つのモーターで4つのタイヤを動かすことにした。
#clear
RIGHT:イメージ図
***左右の移動 [#f9630dd1]
#ref(2009b/A2/課題1右/arm.jpg,right,around,50%)
 モーターを1つ使い、レールの中にアームを通して、タイヤでアームをスライドさせることで、横の線を引くことにした。
#clear
RIGHT:イメージ図
***上下の移動 [#c6c9b0f7]
#ref(2009b/A2/課題1右/pen.jpg,right,around,50%)
 最後のモーターを用いて、ペンを上げたり下ろしたりする動力へと活用することにした。当初は、ペンを垂直に持ち上げる方式を考えたが、アームの部分が重くなりすぎたので、斜めにペンを上げ下ろしすることにした。
#clear
RIGHT:イメージ図
**製作手順 [#x2b97886]
***土台の作成 [#j498b6b8]
#ref(2009b/A2/課題1右/IMG_00151.jpg,right,around,35%)
 アームやRCXなどを支える土台であるため、全体のバランスが取れるようにすることが重要になった。前後のコントロールをする1つのモーターを土台の真ん中に位置するように設置することで、バランスが安定した。
#clear
RIGHT:土台部分の写真
***アームの作成 [#t9f41a98]
#ref(2009b/A2/課題1右/IMG_00411.jpg,right,around,80%,右図)
 レールの中をアームが動くようにした。しかし、アームの上にモーターやペンを持つところなどが設置されるために左右のバランスが崩れてしまった。そのためアームがコントロールされるタイヤから浮き上がってしまい、動かなくなった。そこで、右図のように自由に動くことができるタイヤで支えることによって、安定してアームの伸び縮みができるようになった。また、伸びすぎて戻らなくなることを避けるために、下図のようにストッパーを設置することで、より安定性を増すことができた。
#ref(2009b/A2/課題1右/IMG_00260.jpg,50%)
#clear
***ペンを持つところ・ペンの上げ下ろし [#w3b15732]
#ref(2009b/A2/課題1右/pen2.jpg,right,around,50%,右図)
 当初、上下にペンを動かすことを中心に考えていたため、初期の段階では、右図の試作のように簡易な方法でペンを固定していた。だが、これだと線(特に横の線)を引くときにペンが大きく動いてしまい、なかなか安定して顔を描くことができないため、右図の完成版のように改良を加えた。
#clear
#ref(2009b/A2/課題1右/pen3.jpg,around,70%,左図)
 ペンの上げ下ろしに関しては、最初は左図の初期のようにして行っていた。しかし、コントロールがうまくできないため、左図の完成版のようにギアで速度を遅くすることで細かな調節を行えるように調節を行った。
#clear
***試作 [#y2427170]
#ref(2009b/A2/課題1右/091027_1924~011.jpg,right,around,65%)
 全てのパーツを組み合わせてみたが、バランスが悪く、思うように似顔絵を描くことができなかった上、後退したときにひっくり返ってしまった。
#clear
***完成 [#y675b086]
 RCXを横にして本体にしっかりと固定することで、動作中に部品が外れることはなくなった。また、揺れが小さくなった。

CENTER:&ref(2009b/A2/課題1右/IMG_00111.jpg,45%);&ref(2009b/A2/課題1右/IMG_00090.jpg,45%);
**工夫した点 [#i6cd6ef6]
-アームの通るレールに自由に回転したり左右に動くことのできるタイヤを取り付けることで、アームをできるだけ長く使うことができた点。
-アームが伸び縮みできる長さを制限することで、アームが動きすぎて制御できなくなってしまうことを防ぐことができた点。
-ペンをしっかりと固定することで、多少ペンに加わる力が強くなっても、前後左右に稼働できるようになった点。
-コードにタイヤなどが引っ掛かってロボットの作業に支障が出ないようにきちんと束ねた点。
-RCXとアーム本体をつなげることにより、土台の上の二つが前後の移動などで外れないようにした点。
-ペンをうまくコントロールするために、ギアで速度を遅くすることで細かな調節を行えるようにした点。
**問題点 [#ne6d3088]
-縦の線はどのくらいの長さでも引くことが可能であるが、横の線は、アームの伸び縮みの長さに制限されるため、アームが伸びることが可能な範囲より大きな似顔絵を描くことができない点。
-何回も似顔絵を描かせると、ペンの重さでペンの上げ下ろしの位置がだんだんと下がっていき、ペンに加わる力が強くなっていくため、ペンと紙との摩擦で横の線が引けなくなったり、縦の線が予定より短くなってしまう点。
-斜めの線はなんとか書くことができるが、曲線は不可能だった点。
-
*プログラムとお絵描きロボットの描いた顔 [#v675879a]
**その1(PuKKu) [#a6d48003]
 #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 ZoomLevel 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){					//眉毛二本(右へアームを伸ばしながら,横線を1本ずつ)
	repeat(2){					//眉毛二本(右へアームを伸ばしながら横線を1本ずつ)
		RIGHT(40*ZoomLevel);
		REST;
		pen_down();
		RIGHT(40*ZoomLevel);
		pen_up();REST;
	}
 
	GO(10*ZoomLevel);
	LEFT(30*ZoomLevel);
	REST;
 
	pen_down();					//右目(左へアームを縮めながら,横線を引く)
	pen_down();					//右目(左へアームを縮めながら横線)
	LEFT(10*ZoomLevel);
	pen_up();REST;
	LEFT(70*ZoomLevel);
	REST;
	pen_down();					//左目(右目と同様にして,横線を引く)
	pen_down();					//左目(右目と同様にして横線)
	LEFT(10*ZoomLevel);
	pen_up();REST;
	GO(30*ZoomLevel);
	RIGHT(45*ZoomLevel);
	REST;
 
	pen_down();					//鼻(前進しながら,縦線⇒左へアームを縮めながら,横線)
	pen_down();					//鼻(前進しながら縦線⇒左へアームを縮めながら横線)
	GO(20*ZoomLevel);
	REST;
	LEFT(10*ZoomLevel);
	pen_up();REST;
	GO(30*ZoomLevel);
	RIGHT(45*ZoomLevel);
	REST;
 
	pen_down();					//口(左へアームを縮めながら,横線)
	pen_down();					//口(左へアームを縮めながら横線)
	LEFT(60*ZoomLevel);
	pen_up();REST;
	LEFT(40*ZoomLevel);
	BACK(90*ZoomLevel);
	REST;
 
	pen_down();					//輪郭(前進しながら,左の線)
	pen_down();					//輪郭(前進しながら左の線)
	GO(100*ZoomLevel);
	REST;
	pen_up();
	REST;
	pen_down();					//輪郭(右へアームを伸ばしながら,下の線)
	pen_down();					//輪郭(右へアームを伸ばしながら下の線)
	RIGHT(140*ZoomLevel);
	REST;
	pen_up();
	REST;
	pen_down();					//輪郭(後退しながら,右の線)
	pen_down();					//輪郭(後退しながら右の線)
	BACK(160*ZoomLevel);
	REST;
	pen_up();
	REST;
	pen_down();					//輪郭(左へアームを縮めながら,上の線)
	pen_down();					//輪郭(左へアームを縮めながら上の線)
	LEFT(140*ZoomLevel);
	REST;
	GO(50*ZoomLevel);				//輪郭(前進しながら,左の線)
	GO(50*ZoomLevel);				//輪郭(前進しながら左の線)
	pen_up();
 }
   ※ただし、このプログラムでの「右」・「左」とは、頭の方を下(手元)にして見たときのものである。

   ※ただし、このプログラムでの「右」・「左」とは、頭の方を下(手元)にして見たときのものである。具体的には、下の図のロボットが描いた似顔絵に示してある通りである。

&br;
#ref(2009b/A2/課題1右/img0182.jpg,center,50%)
CENTER:数々のロボットの描いた似顔絵の中から相棒が選んだ1枚
CENTER:※右側&ref(2009b/A2/課題1右/img0182.jpg,center,50%);※左側
CENTER:ロボットが描いた数々の似顔絵の中から相棒が選んだ1枚

***プログラムの製作について [#c2c004dc]
 このロボットが縦と横の線を利用して似顔絵を描くため、先に描きたい顔を作成し、そのマス目に合わせてプログラムを作成した。そのため、時間の調節が容易に行うことができた。左図は、描こうとした顔の図であり、右図は、プログラムの実行順番(Start→Goal)の図である。

CENTER:&ref(2009b/A2/課題1右/face2.jpg,65%){左図};  &ref(2009b/A2/課題1右/face21.jpg,65%){右図};
#clear
CENTER:左図                        右図

CENTER:左図                右図

 ただ、ロボットのない状態でプログラムを作成したために紙の大きさに合わせて似顔絵の大きさを自由に描こうとしたが、アームの長さの制限により、似顔絵の拡大係数は1しか使うことができなかった。また、横の線(特に輪郭の横の線)を描くことができないことが多々生じたので輪郭の各線の引き終わりにペンを上げて、アームのゆがみを取り除くようにした。
**その2(Kata) [#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);
 #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;                                             //メガネ終わり
 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;                                             //鼻終わり
 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;                                              //口終わり
 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;                                               //輪郭終わり
 	Wait(100);									//1秒待ってからスタート
 	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;          	                                  	 			//メガネ終わり
 	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;                                             				//鼻終わり
 	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;                                              				//口終わり
 	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;                                               				//輪郭終わり
 }
#ref(PA0_0002.JPG,center)
CENTER:横の線はまあまあだが、縦の線が安定しなかった
***顔の書き順 [#kb34e611]
 ロボットの向きと顔の向きがあっていなかったため、プログラムの前後左右が逆になってしまった。
#ref(kao.jpg,center,75%)
***反省点 [#a3120f1f]
 上の顔を描いた当初のプログラム。まだまだ簡略化できる部分もたくさんあるし、#defineもうまく使えていない。
 上の顔を描いた当初のプログラム。まだまだ簡略化できる部分もたくさんあるし、#defineもうまく使えていない。メガネのためだけに#defineを使ってしまっていて、ほかのパーツに応用できていない。
*感想 [#m5048026]
 普段、何気なくペンなどで字や絵などを描いているが、実際にこれをロボットにやらせるとなると、なかなか大変なものであった。日頃、私たちが何気なくしていることは簡単なことでも様々な調節をしながら、行っていることを改めて実感させられた。~
 ペンを上げ下げさせる仕組み考え、作成するのに一番苦労したが最終的にはちゃんと似顔絵が描けたのでよかった。時間があれば、安定して同じ顔が描けるようにしたかった。
*コメント [#u4aacdee]
コメントをどうぞ
- ロボットもオリジナルですし、説明も詳しく明確でとても良いと思います。また、プログラムでも、拡大係数や座標(のようなもの)を利用した似顔絵等が工夫が随所で見られました。~
曲線を書く方法としては、(a)角度を少しずつ変えて短い直線をつなげていく(前後と左右用のモーターを同時に動かすと斜めの直線にできるはず、短くするのは難しいかもしれないが)(b)非常に細かい折れ線を、縦と横の比を変えながらつなげると、遠くから見ると曲線に見える、等があるかもしれません。実現は難しいかもしれませんが。-- [[FI]] &new{2009-11-06 (金) 07:54:01};
- 最初の課題でこれだけできるのは、すごい!と素直に感心しました。ロボットの説明がとてもわかりやすく、写真や図も効果的です。プログラムの方の説明に図を使っている点も良いです。欲をいうなら、プログラムその2の方の説明をもう少し足してほしいところかと思います。(あと、その1その2ではなくハンドルネーム等で誰が作ったかわかるようにしてください。)アーム式ロボットについてはこのWiki内を「達筆ロボット」で検索すると、参考になるかもしれません。 -- [[こさか(KA)]] &new{2009-11-06 (金) 14:35:04};
- 素晴らしいです。プログラムの説明をもう少し工夫していただければ、初の☆評価かと思います。例えば「輪郭を描く」より「右に進みながら、輪郭の下側の直線」の方がわかりやすいです。それから、PuKKuさんのプログラム、拡大係数を「A」にしているのはちょっといただけません。自分はすぐ拡大係数だと分かりますが、他の人にはわからないからです。数ヶ月すると、自分でもわからなくなってしまうかもしれません。意味のある単語やその単語の頭数文字などにしておいた方がよいです。(zoomlevelとかzlとかかな?) -- [[こさか]] &new{2009-11-14 (土) 16:31:36};
- もっと授業を進めて慣れてくれば、よりうまい工夫の方法が見えると思いますので、今後も頑張ってください。最初の課題のレポートとして、素晴らしい出来栄えです。☆をつけさせていただきます(^^) -- [[こさか]] &new{2009-11-27 (金) 16:29:26};

#comment


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