A4の紙に相棒の似顔絵を書くロボットを作成せよ。
・一人につき一つ以上のプログラムを作成すること。
・ペン以外はキットに含まれる部品を使うこと。
・キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
・改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブレーチンや関数、マクロなどを使って部品にわけること。
・小柳
・竹園
まず、このロボットの特徴として、構造がシンプルためプログラミングがしやすいということがあります。このロボットにお絵描きをさせるプログラムは、ただその絵の線上を走らせて、ペンの上げ下げをタイミングを調整するだけなのでとても簡単です。工夫してある点は、ペンを動かすギアがモーターと同じ回転数の場合、ペンの上げ下げの動きが速くなりすぎるので、40枚ギアと8枚ギアを2回組み合わせて回転数を1/25に下げることでゆっくり動くようにした点です。速く動く時に比べ、勢いでペンが下がり過ぎることがなくなったので、より綺麗にかけるようになりました。
このロボットは、車体の動きとペンの動きのズレを小さくするために、ペンが車体の中心に来る構造にしました。
重量が後ろにかかるので、RCXの下に支えを作りました.
sub up_pen() { OnFwd(OUT_B); //ペン上げる Wait(007); Off(OUT_B); } sub down_pen() //ペン下げる { OnRev(OUT_B); Wait(007); Off(OUT_B); } task main() { OnFwd(OUT_A); repeat(160){ //{}内輪郭 OnRev(OUT_C); Wait(001); Off(OUT_C); Wait(003); } up_pen(); //ペン上げる OnFwd(OUT_C); //曲がる Wait(090); OnRev(OUT_C); Wait(020); Off(OUT_A+OUT_C); down_pen(); //左目 OnFwd(OUT_A); OnRev(OUT_C); Wait(030); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(310); Off(OUT_A+OUT_C); OnFwd(OUT_A); //眉間 OnRev(OUT_C); Wait(020); Off(OUT_A+OUT_C); OnFwd(OUT_A); //右目 OnRev(OUT_C); Wait(030); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(310); Off(OUT_A+OUT_C); up_pen(); OnFwd(OUT_A); //直進 OnRev(OUT_C); Wait(030); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); //曲がる Wait(085); Off(OUT_A+OUT_C); OnFwd(OUT_A); //降りる OnRev(OUT_C); Wait(070); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); //曲がる Wait(082); Off(OUT_A+OUT_C); down_pen(); //口 OnFwd(OUT_A); OnRev(OUT_C); Wait(060); Off(OUT_A+OUT_C); }
完成した似顔絵
sub up_pen() { OnFwd(OUT_B); //ペン上げる Wait(007); Off(OUT_B); } sub down_pen() //ペン下げる { OnRev(OUT_B); Wait(007); Off(OUT_B); } task main() { OnFwd(OUT_A); repeat(160){ //{}内輪郭 OnRev(OUT_C); Wait(001); Off(OUT_C); Wait(003); } up_pen(); //ペン上げる OnFwd(OUT_C); //曲がる Wait(090); OnRev(OUT_C); Wait(020); Off(OUT_A+OUT_C); down_pen(); //左眉 OnFwd(OUT_A); OnRev(OUT_C); Wait(030); Off(OUT_A+OUT_C); up_pen(); //眉間 OnFwd(OUT_A); OnRev(OUT_C); Wait(020); Off(OUT_A+OUT_C); down_pen(); //右眉 OnFwd(OUT_A); OnRev(OUT_C); Wait(030); Off(OUT_A+OUT_C); up_pen(); //曲がる OnRev(OUT_A+OUT_C); Wait(085); Off(OUT_A+OUT_C); OnFwd(OUT_A); //降りる OnRev(OUT_C); Wait(040); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); //曲がる Wait(085); Off(OUT_A+OUT_C); OnFwd(OUT_A); //直進 OnRev(OUT_C); Wait(020); down_pen(); //口 OnFwd(OUT_A+OUT_C); Wait(150); Off(OUT_A+OUT_C); up_pen(); //直進 OnFwd(OUT_A); OnRev(OUT_C); Wait(015); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); //曲がる Wait(075); OnFwd(OUT_A); //直進 OnRev(OUT_C); Wait(010); Off(OUT_A+OUT_C); down_pen(); //右目 OnFwd(OUT_A); OnRev(OUT_C); Wait(010); Off(OUT_A+OUT_C); up_pen(); //直進 OnFwd(OUT_A); OnRev(OUT_C); Wait(020); Off(OUT_A+OUT_C); up_pen(); //曲がる OnFwd(OUT_A+OUT_C); Wait(075); OnFwd(OUT_A); //直進 OnRev(OUT_C); Wait(030); OnFwd(OUT_A+OUT_C); //曲がる Wait(075); down_pen(); //左目 OnFwd(OUT_A); OnRev(OUT_C); Wait(010); Off(OUT_A+OUT_C); }
完成した似顔絵
ペンを車体の中心にする構造は最初の方から決めていたのですが、それを無理なく実現できるデザインを決めるまでにかなりの試行錯誤がありました。具体的には、最初はペンを垂直に上下させる構造にしたかったのですがパーツが足りなくなってしまったので、像の鼻のようなパーツに作り替えた事が試行錯誤した点です。また、NQCとモーターを繋ぐコードの特徴にきづけずに、片方のモーターが逆回転してしまっていたので、逆回転している方のプログラムを逆にしなければなりませんでした。理想よりもペンと車体の動きのズレがありましたが、逆にそれを利用して回転することで小さな円を描くことができました。車体のメインは最初に作ったドライブベースをそのまま使ったのですが、前後のタイヤの大きさが違ったので同じ大きさのタイヤを使えばより滑らかで複雑な絵がかけるようになると思います。このゼミにかけられる時間があまりとれず、期間内により綺麗なプログラムを書く時間がとれなかったのが大変でした。次はよりプログラムを改良していくようにしたいです。
・小柳
イメージしたロボットと実際に完成したロボットは、動き方や走る軌跡目指していたものと大きく違ったため、プログラムの調整に苦労しました。しかし、そのズレを利用することで結果としてうまく似顔絵を描かせることができたのでよかったです。
・竹園
今回はあまりロボット製作に貢献できず、全体的に小柳君の足を引っ張った感があります。ロボットの動きに大きく影響するプログラムの僅かな誤差など、様々な障害を経験したことを次回にいかし、次はより優れたロボットを作りたいです。
TAKA 試行錯誤した点について、解説があると良いと思います。「コメント欄を作って下さい」
FI 書くべきことは書いていますが、もっと内容を増やしてください。例えば、ロボットの説明(特にペンの上げ下げの機構等)を増やしたり、似顔絵をもっと滑らかに複雑にするためにはどうするかの議論等を加えてみるとよいと思います。
FI 今回はもうロボットを解体したので、もう良いですが、説明は部分にわけて詳細に書いたほうが良いと思います。また、プログラムの中にまだ関数やサブルーチンを用いて簡単にできるところがあるので、次回からは同じような構造を見つけたら、積極的に使っていってください。過去のホームページも参考にしてください