課題1:相方の似顔絵を描くロボットの作成。 †A3の紙に相方の似顔絵を描くロボットを作成する。 ロボット本体の作成 †考案 †似顔絵ロボットを作るときに真っ先に考える必要があるのは、ペンの固定の方法、そして上下させる方法、その機器の取り付け方である。 考案段階での問題と解決策 †アーム型にすると、何も考えずに取り付けるとカーブさせる時に線がぶれてしまう。 ↑左向きに直角な線を描きたいとき:右タイヤのみを前進 ↑右向きに直角な線を描きたいとき:右タイヤのみをバック 制作段階での問題と解決策 †実際にアームを制作したところ、問題が発生した。 ウォームギアは非常に高トルクを生む上に、ギアの戻りがほとんど発生しないためにアームが落ちない。高トルクのおかげでペンを押さえる力もつよい。 本体の完成 †以上の過程を乗り越え、本体が完成した。 時間が短縮できるものと考えたが、ウォームギアを組むのと、ペンの固定方法、本体への取り付けに想像以上に時間を食われ、結局完成までに時間がかかってしまった。 プログラム †本体完成後、プログラムの作成に移る。 松島のプログラム †#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の値がこんなのになってるのはそのせい) 福永のプログラム †#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); } プログラム作成にあたって苦労した点は時間でした。少し変えるだけでだいぶ動きが変わってしまうので何度も試す必要がありました。また関数をうまく使いこなすことができず必要以上に長いプログラムになってしまった。 結果 †↑松島作 ↑福永作 工夫した点のまとめ †•ウォームギアによるアームの力強い上げ下げ(制作段階での問題と解決参照) 反省 †松島 †プログラム作成が想像以上に大変だった。 福永 †マシンを自分の思い道理に動かすのが想像以上に大変だった。何度も試行錯誤し、時間もかなりかかってしまったが、楽しみながら作業することができてよかった。最後の発表では何とか出来上がったので本当にうれしかった。次の課題ではさらに完成度を高めれるようにがんばりたい。
|