目次
#contents

*課題1 [#of8df6fe]
-指定課題
--これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。
-自分の描く文字
--自分の住んだことがある長野県須坂市の「田の神」という地名にした
*ロボットの説明 [#oa58158e]

**ロボットの概要 [#a10f158b]
---右前輪をモーターB、左前輪をモーターCとした前輪2輪と、自由駆動の後輪1輪の計3輪駆動のロボット
---ペンの上げ下げにはモーターAを使用
---タイヤによって紙面上を移動し、ペンを上げ下げすることで文字を描いていく
#ref()
***ロボットの移動 [#c693a8ce]
---主に2輪の前輪を回転させることで移動していく
---後輪は固定型にすると摩擦が大きくうまく曲がれなかったので自由駆動のタイヤを採用
***ペンの上げ下げ [#na1a81c1]
---モーターAを回転させペンと紙面を触れさせることで字を描いていく
---初期はモーターより前方で上下させていたが、前輪の旋回による回転前後のペン先のズレを抑制するため、タイヤの回転軸に近くなるようモーターより後方に修正した
---輪ゴムの止め方もペン先が左右にぶれないように左右から固定した
*プログラムの説明 [#n3de16bb]

-使用マクロ
:#define pen_up RotateMotor(OUT_A,30,15);Off(OUT_A)|ペンを持ち上げる動作を行う   
:#define pen_down RotateMotor(OUT_A,30,-15);Off(OUT_A)|ペンを下げる動作を行う
:#define turn RotateMotor(OUT_B,30,180);RotateMotor(OUT_C,-30,155);Off(OUT_BC)|90度左を向く
:#define n_turn RotateMotor(OUT_B,-30,165);RotateMotor(OUT_C,30,180);Off(OUT_BC)|90度右を向く
:#define stp Off(OUT_BC)|モーターの回転を止める(動作後の角度のズレを抑制するため一動作が終了するごとに回転を止めている)
-主なコマンドの説明
:RotateMotor(OUT_モーター名,パワー,角度)|指定したモーターを指定した角度分前転させる
:RotateMotorEx(OUT_モーター名1,モーター名2,パワー,角度,true,false)|指定した2種のモーターを指定した角度分反転して回転させる

**字を描くプログラム [#p12260c1]
&color(red){ペンを上げている状態での移動は旋回によるズレを修正するためである};
***「田」を描くプログラム [#x71f3e6f]
---最初に{口}を描く
	int i=0;
	for(i=0;i<3;i++){	
		RotateMotor(OUT_BC,40,90);
		stp;
		pen_up;
		turn;
		RotateMotor(OUT_BC,30,5);
		stp;
		pen_down;
	}
        RotateMotor(OUT_BC,40,90);
	stp;
	pen_up;
	turn;
	RotateMotor(OUT_BC,30,5);
	stp;

真っ直ぐ進み90度左を向く動作を4回繰り返すことで描く(プログラムの構成上、ただ4回繰り返すと最後に無意味にペンを下す動作が入るので、最後の一回だけ別枠に取った)

---「田」の中の{十}を描く
	RotateMotor(OUT_BC,30,40);
	turn;
まず「田」の中ほどに行き、左を向く
	pen_down;
	RotateMotor(OUT_BC,30,110);
	stp;
そして{一}を描く
	pen_up;
	RotateMotor(OUT_BC,30,100);
	stp;
	RotateMotor(OUT_B,-30,360);
	stp;
	RotateMotor(OUT_BC,30,20);
	stp;
        pen_down;
	RotateMotor(OUT_BC,30,100);
	stp;
	pen_up;
少し前に進み位置を調整した後、右を向かせ真っ直ぐ進ませることで{|}を描く

--「田」から「の」への移動	
	RotateMotor(OUT_BC,30,120);
	stp;	
***「の」を描くプログラム [#w3e8ccd1]
--{ノ}を描く
	RotateMotor(OUT_B,-20,20);
	stp;
        pen_down;
	RotateMotor(OUT_C,30,100);
	stp;
        pen_up;
---少し向きを斜めにしてから{ノ}を描く
	RotateMotor(OUT_BC,30,55);
	stp;
	RotateMotorEx(OUT_BC,30,200,100,true,false);
	stp;
	RotateMotor(OUT_BC,-30,60);
	stp;
	int k=0;
	for(k=0;k<4;k++){	
		pen_down;
		RotateMotor(OUT_BC,30,40);
		stp;		
		pen_up;
		RotateMotor(OUT_BC,30,40);
		stp;
		RotateMotorEx(OUT_BC,30,100,100,true,false);
		stp;
		RotateMotor(OUT_BC,-30,40);
		stp;
	}
	pen_down;
	RotateMotor(OUT_BC,30,40);
	stp;
「の」の曲線を小さくまとめるのが難しいため、短い直線を書き、少しずつ角度を変えていく手法を取り、曲線を描くようにした
--「の」から「神」への移動
	pen_up;
	RotateMotor(OUT_B,30,100);
	stp;
        RotateMotor(OUT_BC,30,50);
	stp;
***「神」を描くプログラム [#n229af11]
---{申}を描く
	int l=0;
	for(l=0;l<4;l++){
		pen_down;
		RotateMotor(OUT_BC,30,40);
		stp;
		pen_up;
		turn;
		RotateMotor(OUT_BC,20,5);
		stp;
	}
「田」と同様ではあるが、少し小さめな{口}を描く(繰り返しの初めにペンを下す動作を入れるために、最後にペンを下さないので4回繰り返すことができる)
	RotateMotor(OUT_BC,30,20);
	stp;	
	turn;
	RotateMotor(OUT_BC,30,10);
	stp;
        pen_down;
	RotateMotor(OUT_BC,30,40);
	stp;
	pen_up;
	RotateMotor(OUT_BC,30,60);
	stp;
	n_turn;
	RotateMotor(OUT_BC,30,70);
	stp;
	RotateMotorEx(OUT_BC,30,320,100,true,false);
	stp;
        pen_down;
	RotateMotor(OUT_BC,30,130);
	stp;
同じように{十}を描くが{|}の部分を長めにとるので、一度下に降りてから下から上に行くようにして描く
---{申}から{ネ}への移動
	pen_up;
        turn;
	RotateMotor(OUT_BC,30,110);
	stp;
---{ネ}を描く
	RotateMotor(OUT_B,30,60);Off(OUT_B);
	stp;
        pen_down;
	RotateMotor(OUT_BC,30,20);
	stp;
上の点を描いた後
	pen_up;
	RotateMotor(OUT_BC,30,120);
	stp;
	RotateMotorEx(OUT_BC,30,350,100,true,false);
	stp;
	RotateMotor(OUT_BC,-30,25);
	stp;	
	pen_down;
	RotateMotor(OUT_BC,30,70);
	stp;
	pen_up;
	RotateMotor(OUT_BC,30,65);
	stp;
	RotateMotorEx(OUT_BC,30,240,100,true,false);
	stp;
	RotateMotor(OUT_BC,-30,20);
	stp;
	pen_down;
	RotateMotor(OUT_BC,30,100);
	stp;
{フ}の部分を描き
	pen_up;
	RotateMotor(OUT_BC,-30,40);
	stp;
	RotateMotorEx(OUT_BC,30,500,100,true,false);
	stp;
	RotateMotor(OUT_BC,-30,30);
	stp;
	pen_down;
	RotateMotor(OUT_BC,30,60);
	stp;
	pen_up;
	RotateMotor(OUT_BC,-30,50);
	stp;
	RotateMotorEx(OUT_BC,30,500,100,true,false);
	stp;
	RotateMotor(OUT_BC,-30,30);
	stp;
	pen_down;
	RotateMotor(OUT_BC,30,40);
	stp;	
残りの部分を描く
**実際にロボットで描いた「田の神」 [#vc8ffe50]

*感想・反省点 [#q2282226]
字を描くロボットを作成するのに思いのほか手間取り、あまり字を書くのに適していないロボットで課題に臨んでしまったように感じる。それでもプログラミングを頑張ったおかげか、何とか形にすることができたのはよかったと思う。

字をロボットで描く中で、同じプログラムを使用しても同じように動作してくれないことがあり、変数の指定に難儀した。理由としては、自由駆動の後輪のようなロボットの機体自体に何らかの変性があり、不変性が乱されていると考えられるので、今度作るロボットではあまり外的要因に左右されないような部品で作っていきたいと思う。

ロボット作成からレポートの完成まで時間がかかり、妥協点や改善点が多くできてしまったので、次回からは適当にこなしていきたい。

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