2014b/Member?

課題

自分の名字を書けるロボットを作ろう

作ったロボット

Fullshot

名はLGCD(LEGO CAD) X軸、Y軸、Z軸を移動できるユニットをそれぞれ作り、組み立ててベクトルを指定して動けるプリンタを作った。 詳しい画像は

https://www.youtube.com/watch?v=m2mYDo8n3AQ&feature=youtu.be

で観覧できる。

着眼点

他の事例をYOUTUBEで参考中、プリンタを同じく作った画像を見た。ここで私もCADを作れば、理論的にあらゆる線を書ける点に気が付いてこのロボットを作ろうと決意した。

ユニット1

unit1

第1でCADのペンと似たような動きをするMODULEを考えなければならなくなった。 そこで私たちは上のようなロボットを工夫して横と上下ができるようなものを作った。 モーターは2本を使って上のモーターはバーを使って円運動を上下の運動へ変わり、 下のモーターは横、UNITで見ると前に進むように作った。

ユニット2

unit2

UNIT1でX,Y,Zの中でXとZの動きに対応できるパーツは備えている、そこで残りのY軸とUNIT1を走らせる橋の制作に工夫した。 前後に動ける車を作り、その上に橋を載せた。

Program

プログラム組み方

ベクトル説明

基本的にCADに対応可能なロボットを作ったため、 X,Y,Zをそれぞれ+-値で移動する命令をすることで動ける。 斜めは、Xが単位時間動くうちのYの移動距離のことで、Yの速さを変化させることで傾きを調絶できる。従って、理論上プログラム組次第で全てのグラフを書けるように設計した。

まとめると、X,Y移動距離をモーターの回転角度で設定し、X,Yの移動距離を変化させることで全てのじを書けるのである。

参考で書いたプログラムの文字は黄であり、横の線を全部書いて、縦を書き、最後に斜めを書いた。 プログラムを見る際はノートに座標平面を書いてどの線がどこに書かれたか追う方法を勧める。

#define spdy 30
#define spdx 39
#define spdz 15
float GetAngleX(float d) //  d`s distance to motor`s angle for X
{
	const float diameter = 3.8;
	const float pi=3.1415;
	float angX=d/(diameter*pi)*360;
	return angX;
}

float GetAngleY(float d) //   d`s distance for Y
{
	const float diameter = 5.45;
	const float pi=3.1415;
	float angY=d/(diameter*pi)*360;
	return angY;
} 


void RoY(float t)  // move y axis   Rotate motor Y to UP  (Unit:1box)
{int angler=GetAngleY(t);
RotateMotor(OUT_A,spdy,angler);}

void RoX(float t)  // move x axis   Rotate motor X to Right(Unit:1box)
{int angler=GetAngleX(t);
RotateMotor(OUT_B,spdx,angler);}

task main()
{
	RotateMotor(OUT_C,spdz,-30); // up the pen
	RoY(-2);
	repeat(5){
	RoY(-2);
	RotateMotor(OUT_C,spdz,30); // down the pen
	RoX(8);
	RotateMotor(OUT_C,spdz,-30);
	RoX(-8);
	}//write all x_axis
	
	RoY(10);
	
	RoY(-6);
	RotateMotor(OUT_C,spdz,30);
	RoY(-4);
	RotateMotor(OUT_C,spdz,-30);
	RoY(10);
	
	
	RoX(2);
	RotateMotor(OUT_C,spdz,30);
	RoY(-4);
	RotateMotor(OUT_C,spdz,-30);
	RoY(4);
	RoX(2);
	RoY(-6);
	RotateMotor(OUT_C,spdz,30);
	RoY(-4);
	RotateMotor(OUT_C,spdz,-30);
	RoY(10);
	
	RoX(2);
	RotateMotor(OUT_C,spdz,30);
	RoY(-4);
	RotateMotor(OUT_C,spdz,-30);
	RoY(4);
	RoX(2);
	RoY(-6);
	RotateMotor(OUT_C,spdz,30);
	RoY(-4);
	RotateMotor(OUT_C,spdz,-30);
	RoX(-4);
	RotateMotor(OUT_C,spdz,30);  // write all y_axis
	
	OnRev(OUT_A,15);
	OnRev(OUT_B,25);
	Wait(800);
	Off(OUT_AB);
	RotateMotor(OUT_C,spdz,-30); // write diagonal line go to left down
	
	OnFwd(OUT_A,15);
	OnFwd(OUT_B,25);
	Wait(800);
	Off(OUT_AB);            // go before to diagonal line
	
	RotateMotor(OUT_C,spdz,30);
	OnRev(OUT_A,15);
	OnFwd(OUT_B,25);
	Wait(800);
	Off(OUT_AB);
	RotateMotor(OUT_C,spdz,-30); //write diagonal line go to right down
}

残りの課題

このプログラムを書いた時期はまだWHILEを使えないため、次第に速度が変化する円は不可能だったが次第に速度を変化させながら、動けるプログラムを開発すれば、2Dでかける全が可能になると思われる。


添付ファイル: file111.jpg 217件 [詳細] fileunit1.jpg 205件 [詳細] fileunit2.jpg 234件 [詳細] file2675.jpg 209件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-12-05 (金) 15:44:20