[[2008b/MemberOnly/進行状況A]]~ 準備中。~ ~ ~ *課題1:相方の似顔絵を描くロボットの作成。 [#dba545ea] #contents **ロボット本体の作成 [#r3663451] ***考案 [#e6aab9f3] 似顔絵ロボットを作るときに真っ先に考える必要があるのは、ペンの固定の方法、そして上下させる方法、その機器の取り付け方である。~ ここの班では、ロボット本体にペンを上下させるアームを取り付ける事にした。レゴの取扱説明書に書かれていた優秀な本体をほとんど弄る必要がないからである。~ これにより時間が節約できるものと考えた。 ***考案段階での問題と解決策 [#t10e2d71] アーム型にすると、何も考えずに取り付けるとカーブさせる時に線がぶれてしまう。~ そこで、ここの班では本体の左側の、なるべくタイヤに近いところにペン先があるようにアームをセットした。こうすることで~ #ref(左直覚.gif) ↑左向きに直角な線を描きたいとき:右タイヤのみを前進~ #ref(右直覚.gif) ↑右向きに直角な線を描きたいとき:右タイヤのみをバック~ ~ 右向きの円弧を描きたいとき:右向きに旋回~ ~ これだけの動きができる。~ 左向きの円弧を描く事はできないが、無くても大丈夫だと判断しこの方向でいく事に。 ***制作段階での問題と解決策 [#k73097e5] 実際にアームを制作したところ、問題が発生した。~ ペンの重みでアームを上げても維持ができずに落下してしまうのである。~ その解決策として、ウォームギアを使う事にした。~ #ref(SANY0010.JPG) ウォームギアは非常に高トルクを生む上に、ギアの戻りがほとんど発生しないためにアームが落ちない。高トルクのおかげでペンを押さえる力もつよい。 ***本体の完成 [#y9144c26] 以上の過程を乗り越え、本体が完成した。~ #ref(SANY0016.JPG) 時間が短縮できるものと考えたが、ウォームギアを組むのと、ペンの固定方法、本体への取り付けに想像以上に時間を食われ、結局完成までに時間がかかってしまった。 **プログラム [#b455f229] 本体完成後、プログラムの作成に移る。~ アーム上下のサブルーチンだけは二人で共通して作る。その後は個別作業。~ ~ ~ ***松島のプログラム [#t635797e] #define ANGLE 120 //90°曲げる時間 #define ARM 50 //アームをあげる時間 task main()//メイン関数 { repeat (4){//前髪部分 str(25); turnAL(ANGLE); str(25); turnAR(ANGLE); } turnAR(ANGLE); turnR(ANGLE*4);//輪郭 up(); turnR(180); back(30); turnR(60); turnR(50); str(20); down();//口 turnR(60); } void turnAR(int ct)//角で右に曲げる関数 { OnFwd(OUT_C); Wait((ct-20)*2); fstop(); } void turnAL(int ct)//角で左に曲げる関数 { OnRev(OUT_C); Wait((ct-20)*2); fstop(); } void turnR(int ct)//円で右に曲げる関数 { OnFwd(OUT_C); OnRev(OUT_A); Wait(ct); fstop(); } void str(int ct)//直進 { OnRev(OUT_A); OnRev(OUT_C); Wait(ct); fstop(); } void back(int ct)//後退 { OnFwd(OUT_A+OUT_C); Wait(ct); fstop(); } sub down()//アームを下げる { OnFwd(OUT_B); Wait(ARM); Off(OUT_B); } sub up()//アームを上げる { OnRev(OUT_B); Wait(ARM+5); Off(OUT_B); } sub fstop()//停止 { Off(OUT_A+OUT_C); } それぞれの動作を関数、サブルーチン化した。それぞれの関数、ルーチンの説明はコメントを参照。~ #defineで90度曲がるのにかかる時間は一応指定したが、誤差が生まれるためにあまり役に立たなかった(turnAL関数などのWait((ct-20)*2);なんかで、waitの値がこんなのになってるのはそのせい)~ アームを上げるルーチンのWaitの値に+5が入ってるのも誤差のため。ペンが重いのか、上げる方がわずかに時間を使う事がわかった。 ***福永のプログラム [#x3a1719c] #define TURN_TIME 200 task main() { OnRev(OUT_A+OUT_C);Wait(180); Off(OUT_A+OUT_C); OnRev(OUT_A);OnFwd(OUT_C);Wait(230); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C);Wait(180); Off(OUT_A+OUT_C); OnRev(OUT_A);OnFwd(OUT_C);Wait(230); Off(OUT_A+OUT_C); arm_up(); OnRev(OUT_A+OUT_C);Wait(180); Off(OUT_A+OUT_C); OnFwd(OUT_C);Wait(240); Off(OUT_C); OnRev(OUT_A+OUT_C);Wait(40); Off(OUT_A+OUT_C); arm_down(); OnRev(OUT_A+OUT_C);Wait(60); Off(OUT_A+OUT_C); arm_up(); OnRev(OUT_A+OUT_C);Wait(40); Off(OUT_A+OUT_C); OnFwd(OUT_C);OnRev(OUT_A);Wait(120); Off(OUT_C); OnFwd(OUT_A+OUT_C);Wait(40); Off(OUT_A+OUT_C); OnFwd(OUT_C);OnRev(OUT_A);Wait(120); Off(OUT_C); OnRev(OUT_A+OUT_C);Wait(30); Off(OUT_A+OUT_C); arm_down(); OnRev(OUT_A+OUT_C);Wait(30); Off(OUT_A+OUT_C); arm_up(); OnRev(OUT_A+OUT_C);Wait(20); Off(OUT_A+OUT_C); arm_down(); OnRev(OUT_A+OUT_C);Wait(30); Off(OUT_A+OUT_C); arm_up(); OnRev(OUT_A+OUT_C);Wait(30); Off(OUT_A+OUT_C); OnRev(OUT_C);Wait(240); Off(OUT_C); OnRev(OUT_A+OUT_C);Wait(40); Off(OUT_A+OUT_C); OnRev(OUT_C);Wait(240); Off(OUT_C); arm_down(); OnRev(OUT_A+OUT_C);Wait(180); Off(OUT_A+OUT_C); } sub arm_up() ペンを上げる { OnRev(OUT_B); Wait(55); Off(OUT_B); } sub arm_down()ペンを下げる { OnFwd(OUT_B); Wait(50); Off(OUT_B); } **結果 [#u4d85af1] #ref(SANY0014.JPG) ↑松島作 #ref(SANY0015.JPG) ↑福永作 **反省 [#qba7d0e4] ***松島 [#w66d7fe4] プログラム作成が想像以上に大変だった。~ Waitの時間だけで移動するだけならともかく、誤差が出てくるため一つ一つWaitの時間を決めなければならずに苦労した。 ***福永 [#a72d7515]