自分の名字を書けるロボットを作ろう
名はLGCD(LEGO CAD) X軸、Y軸、Z軸を移動できるユニットをそれぞれ作り、組み立ててベクトルを指定して動けるプリンタを作った。 詳しい画像は
https://www.youtube.com/watch?v=m2mYDo8n3AQ&feature=youtu.be
で観覧できる。
他の事例をYOUTUBEで参考中、プリンタを同じく作った画像を見た。ここで私もCADを作れば、理論的にあらゆる線を書ける点に気が付いてこのロボットを作ろうと決意した。
第1でCADのペンと似たような動きをするMODULEを考えなければならなくなった。 そこで私たちは上のようなロボットを工夫して横と上下ができるようなものを作った。 モーターは2本を使って上のモーターはバーを使って円運動を上下の運動へ変わり、 下のモーターは横、UNITで見ると前に進むように作った。
UNIT1でX,Y,Zの中でXとZの動きに対応できるパーツは備えている、そこで残りのY軸とUNIT1を走らせる橋の制作に工夫した。 前後に動ける車を作り、その上に橋を載せた。
基本的に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でかける全が可能になると思われる。