課題について

課題1は文字を描くロボットの製作である。
・七画以上の漢字
・A4の紙上15cm四方に収まるようにすること
 などが条件である。
 今回自分は「抄」をかくことにした。

ロボットについて

machine.jpg

ロボット本体は最初に組み立てたものをそのまま使うことにした。

ペンのアームについて

arm.jpg

モーターの回転によってペンを上下させる方法をとった。
ペンの位置が車体の中心軸にくるようモーターとペンの距離を調節した。

プログラムについて

プログラム全文はこちらを参照してください

文字の書き方

書き順は写真のような書き順で書いた。
ちなみにこれは自分が手書きで書いたものである。

kakijun.JPG


前進で描くとペンが引っかかるため、描くときは後進しながら描くよう統一した。
また、下の図のように回転軸とペンの位置がずれているため、直角に曲がるときはこの差を考慮してプログラムする必要がある。

daitai.png

変数宣言、マクロ、サブルーチンについて

プログラミングにあたって時間でモーターを制御すると電池の残量で出力に差がでてしまい、色々不便だと思ったのでモーターを扱うときは時間を使わないようにした。
また、車体の揺れなどで文字がゆがんだため、極力パワーを落として制御した。

/*------------------------------------------------------------------*/
/*右輪≡A_port、左輪≡B_port、ペン作動モータ≡C_port、距離の単位はmm*/
/*------------------------------------------------------------------*/
#define TURN_TIME 4030		//一回転に要する時間
#define Gap 105			//筆と機体の回転軸の差
#define Diameter 56			//タイヤの径
#define Cir_fere 175.929		//タイヤの周≒175.929...

#define Up_pen Wait(100);RotateMotor(OUT_C,30,-15);Off(OUT_C);Wait(100)	//筆を上げる 揺れのため少し停止
#define Down_pen Wait(100);RotateMotor(OUT_C,30,15);Off(OUT_C);Wait(100)	//筆を下げる 揺れのため少し停止

float ANGLE_CALC=178/90;		//機体を1度旋回させるのに必要なモータの回転角
float Calc_long=2.0463;		//回転角度計算用定数( 360(2π) / タイヤの周 )

sub go_f(int l){			//指定距離前進
	float Ang=l*Calc_long;	//回転角度計算
	RotateMotor(OUT_AB,30,Ang);
	Off(OUT_AB);
}
sub go_b(int l){			//指定距離後進
	float Ang=l*Calc_long*(-1);	//回転角度計算(後進のため (-1)掛ける )
	RotateMotor(OUT_AB,30,Ang);
	Off(OUT_AB);
}
sub turn_R(float angle){		//指定角度右旋回
	RotateMotorEx(OUT_AB,30,ANGLE_CALC*angle,100,true,true);	//左右で逆回転
}
sub turn_L(float angle){		//指定角度左旋回
	RotateMotorEx(OUT_AB,30,-ANGLE_CALC*angle,-100,true,true);	//左右で逆回転
}
sub hook(){				//文字のはね
	Up_pen;
	RotateMotor(OUT_A,30,30);	//片輪30°ではねる
	Down_pen;
	RotateMotor(OUT_A,30,-30);
	Up_pen;
}

グローバル変数やマクロについてはコメント文で十分説明できているとおもうので、サブルーチンの説明をしていく。

 go_f(int l) , go_b(int l) について

時間制御では電池残量によって前進後進の距離に違いが生じると思ったためなるべく変化がないようなアルゴリズムにした。

sub go_f(int l){			//指定距離前進
	float Ang=l*Calc_long;	//回転角度計算
	RotateMotor(OUT_AB,30,Ang);
	Off(OUT_AB);
}

回転角は 360 : θ = 175.929(タイヤの周) : distance(進みたい距離)  より
θ = ( 360 / 175.929 ) × distance で回転すべき角度θを算出している。
そのため ( 360 / 175.929 ) を定数 Calc_long として上で宣言し計算しやすくした。
算出した角度で左右のモーターを回すことで関数に放り込んだ距離進むことができる。
移動距離が電池残量に左右されないためこのアルゴリズムを採用した。

 turn_R(float angle) , turn_L(float angle) について

機体を約90度旋回させるのに必要なモータ回転角が178°だったので (178 / 90)をANGLE_CALCとして宣言、使用した。
計算では214°だったが実際は90°旋回しなかったため、中途半端な値になってしまった(原因については不明)

sub turn_R(float angle){		//指定角度右旋回
	RotateMotorEx(OUT_AB,30,ANGLE_CALC*angle,100,true,true);	//左右で逆回転
}

RotateMotorEx();を用いて左右のモーターを同時に逆転させ、その場で旋回するようにした。

 hook() について

漢字にはねる場所が二箇所あったのでサブ関数化。

sub hook(){				//文字のはね
	Up_pen;
	RotateMotor(OUT_A,30,30);	//片輪30°ではねる
	Down_pen;
	RotateMotor(OUT_A,30,-30);
	Up_pen;
}

片輪を少し回転させながら文字のはねるところを描いた。

メインタスク

task main(){
	RotateMotor(OUT_C,30,15);	//一画目
	go_b(120);
	hook();

	go_f(90+Gap);		//次の画に移動
	turn_L(90);
	go_b(Gap-50);
	
	Down_pen;			//二画目
	go_b(30);
	Up_pen;

	turn_L(30);			//次の画に移動
	go_f(50);

	Down_pen;			//三画目
	go_b(40);
	Up_pen;

	go_b(10);			//次の画に移動
	turn_R(30);
	go_f(Gap-70);
	turn_R(90);
	go_b(Gap-30);

	Down_pen;			//四画目
	go_b(65);
	hook();
	
	go_f(50);			//次の画に移動
	turn_R(15);

	Down_pen;			//五画目
	turn_R(20);
	Up_pen;

	turn_L(50);			//次の画に移動

	Down_pen;			//六画目
	turn_L(20);
	Up_pen;

	turn_R(35);			//次の画に移動
	go_f(30);
	turn_R(90);
	go_b(45);

	Down_pen;			//七画目
	RotateMotor(OUT_A,30,-180);     //はらい
}

描かせた漢字

実際にロボットが描いた漢字

kanji.JPG

ペンの引っかかりではねがずれたり、上げ下ろしの際に余計に線を描いてしまっているところもあるが、全体的に見て何が書いてあるかは分かる漢字が描けた。

まとめ

反省・改良点

・ペンの上げ下ろしで余計に描いてしまったりするところがあり、ペンを垂直に上下させる機構にすべきだったと感じた。
・ペンの筆圧が常に安定しない問題に悩まされた。
 漢字を描く途中で筆圧が強くなりすぎないようにペンを少し浮かせるという苦肉の策をとってしまった。
 ペンの機構にも何か工夫すべきところがあったり、プログラムでもモーターの角度などをフィードバックし筆圧を一定に保つこともできたと思う。
・足回りのモーターの停止するタイミングが左右で少し違うなどのクセがあり、時間不足からそこまで調整しきれなかった。

反省・感想

もう少し改良の余地があると思うが、できた漢字の出来に特に不満はない。
今回の課題1は最初の課題ということを考えても、製作・調整が行き当たりばったりな節が否めず十分に時間を取れなかったことが改良の余地を残してしまった主な原因だろうと思う。
今後の課題2,3については計画をしっかりもって進めていきたい。


添付ファイル: filedaitai.png 107件 [詳細] filekakijun.JPG 114件 [詳細] filekanji.JPG 122件 [詳細] filearm.jpg 105件 [詳細] filemachine.jpg 175件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-03 (月) 10:24:12