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


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

 ペンの上げ下ろしに関しては、最初は図のようにして行っていた。しかし、コントロールがうまくできないため、ギアで速度を遅くすることで細かな調節を行えるように調節を行った。
***試作 [#f76ed885]
***試作 [#y2427170]
#ref(2009b/A2/課題1右/091027_1924~011.jpg,right,around,65%)
 全てのパーツを組み合わせてみたが、バランスが悪く、思うように似顔絵を描くことができなかった。
#ref(2009b/A2/課題1右/091027_1924~011.jpg,right,65%)
#clear
***完成 [#y675b086]
 RCXを横にして本体にしっかりと固定することで、動作中に部品が外れることはなくなった。また、揺れが小さくなった。
#ref(2009b/A2/課題1右/IMG_00111.jpg,40%)
**工夫した点 [#rfba6b87]

CENTER:&ref(2009b/A2/課題1右/IMG_00111.jpg,45%);&ref(2009b/A2/課題1右/IMG_00090.jpg,45%);
**工夫した点 [#i6cd6ef6]
-アームの通るレールに自由に回転したり左右に動くことのできるタイヤを取り付けることで、アームをできるだけ長く使うことができた点。
-アームが伸び縮みできる長さを制限することで、アームが動きすぎてモーターでアームを制御できなくなってしまうことを防ぐことができた点。
-ペンをしっかりと固定することで、多少ペンに加わる力が強くなっても、前後左右に稼働できるようになった点。
-コードにタイヤなどが引っ掛かってロボットの作業に支障が出ないようにきちんと束ねた点。
-RCXとアーム本体をつなげることにより、土台の上の二つが前後の移動などで外れないようにできた点。
-RCXとアーム本体をつなげることにより、土台の上の二つが前後の移動などで外れないようにした点。
-ペンをうまくコントロールするために、ギアで速度を遅くすることで細かな調節を行えるようにした点。
**問題点 [#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();
 }
#ref(2009b/A2/課題1右/img0182.jpg,center,50%)
CENTER:数々のロボットの描いた似顔絵の中から相棒が選んだ1枚

***工夫した点・苦労した点など [#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;
 }
#ref(PA0_0002.JPG,center)
CENTER:横の線はまあまあだが、縦の線が安定しなかった
***工夫した点・苦労した点など [#s96fd9cf]
*感想 [#m5048026]
*コメントどうぞ [#u4aacdee]
#comment


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