目次 #contents *課題1 [#w2f2b028] **内容 [#yc2dd5c8] A4の紙に相棒の似顔絵を書くロボットを作成せよ。 **ルール [#d80fb998] -ひとりにつき一つ以上のプログラムを作成すること。 -ペン以外はキットに含まれる部品を使うこと。 -キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。 -改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。 *メンバー紹介 [#b522dd76] -さくらだ~ Webページ編集、アーム部分を担当した。~ ゴールデンウィークの悲劇を引き起こした張本人。 -琢磨~ 土台部分、さくらだの不完全なアームの改良を担当してくれた。 *ロボット製作過程 [#w17e6d48] **土台 [#tc07d06e] 今回作成した土台は最初に作った機体を基礎にしました。~ もともと前後のアタッチメント部分など汎用性の高い作りとなっていたため特に大きな変更はありませんが、~ 今回はペンを持つアーム部分などをなるべく安定して搭載したかったため大きな板を載せて、~ 設置場所をふやしかつアームなどの土台との接地面積を大きくしました。 #ref(./SH3E0019.JPG) 他には、アームを搭載するときに障害となりそうだった~ 前方の先端部にあったバンパーなどのアタッチメント部分を削りました。 #ref(./SH3E0016.JPG) 細かい部分ですが、後にRCXを横向きにして搭載するため~ コードの長さ上ブロックの向きを反対に付けざるを得なく、~ プロブラムでOnFwdと打っても後ろ向きに進んでしまっていました。~ しかし、もとのタイヤについているコードブロックを反対にすることによって~ その不具合を解消させました。~ 小さな部分ですが、後にプログラムを組むときに混乱しないためには必要だと思いました。~ #ref(./SH3E0017.JPG) -完成品 **アーム [#b28aa4e8] アーム部分はなるべく構造や動作を簡単にし、かつ堅実な構造を心がけていたため、~ 信頼性の高そうなエレベーター方式をチョイスしました。~ 試用したわけでもなく、私見で非常に申し訳ないのですが、一応理由は下にまとめておきます。 |アーム方式|難しそう。なにより不安定そう。| |タイヤ方式|構造も簡単でわかりやすく安定もしそうだが、タイヤ→ペンの力の伝わり方が不安。| |エレベーター方式|構造も簡単でわかりやすく安定もしそうだし、ギアがそのまま「ペンのブロック」を動かしてくれるので安心。| つまりペンを搭載したブロックさえしっかり作れば、エレベーター方式は安心であると思っていた。~ がしかしエレベーター方式は意外と罠が多かった。~ まず直面した問題はペン搭載ブロックをどうやってアームに搭載するかでした。~ ギアによって上下させるため完全固定をするわけにもいかず、かといって固定が緩いとうまくギアが咬み合わない。~ そこで画像のような部分を付けることにしました。~ 実際にはこの部分は~ 「二本の棒を止める短い板がない…。」→「長い板で代用しよう。」→「横にずれないようにしたやつのおかげで前にペン搭載ブロックが倒れなくなった!」~ といったふうに開発中に偶然できたものなのですが、僕の計算ということにしておきます。 そして次に直面した問題は、放っておくとペン搭載ブロックが下に落ちてきてしまうことでした。~ これはギアが軽かったために、ペン搭載ブロックの重みに負けて落ちてきてしまったのですが、画像も部分を付けてギアを重くすることに成功しました。 ちなみにこのギアはアームにETB(面倒になってきたので略します。Elevator Tousai Block)を安定させるのにも活躍しています。これも計算のうちということにしておきます。 最後に、これは実際動かしてみて初めてわかったことなのですが、ETBを降ろす速度が速すぎてペンがポポポポーンしてしまいました。~ なので…考え中です。 *プログラム [#dfaa8c0f] **さくらだ [#bc14a97f] #define go_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C) //前へ進み停止 #define go_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C) //後ろへ進み停止 #define tu_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左へ旋回し停止 #define tu_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); //右へ旋回し停止 #define pen_d OnRev(OUT_B);Wait(30);Off(OUT_B);SetPower(OUT_B,1); //ペンを下げる #define pen_u OnFwd(OUT_B);Wait(30);Off(OUT_B); //ペンを上げる task main() { pen_d; tu_l(300); pen_u; //輪郭 go_s(150); tu_r(75); go_s(20); tu_r(75); //位置を調整 go_s(170); pen_d; go_s(10); pen_u; //左目を書く go_s(120); tu_r(75); go_s(20); tu_r(75); //位置を調整 go_s(120); pen_d; go_s(10); pen_u; //右目を書く tu_l(75); go_s(150); tu_r(75); go_s(30); tu_r(75); //位置を調整 go_s(100); pen_d; go_s(30); pen_u; //口を書く } 実にオーソドックスな形の顔になってしまったのは、 決して「ゴールデンウィークの金曜日来てなかったから時間がないうわあああああ。」~ とかそういうのではなく、計算の内です。~ ただ、最初はもっと特徴的な顔を描こうと意気込んでいたので、~ もうちょっと、いささか、あとわずか、a little、あと1週間くらい、時間があれば描けていたかもしれません。~ ちなみにどうしてみんな丸顔にしないんだろうと思って試験運用したときに、~ 紙が大幅にずれて「あぁ…。」と思ったのは秘密です。~ でもずれたとしても~ 「角度の比率が変わらなければどうということはない。」 **琢磨 [#h0c97eab] #define Pen_D OnRev(OUT_B);Wait(20);Off(OUT_B); //ペンを下げる #define Pen_U OnFwd(OUT_B);Wait(20); //ペンを上げる #define turn_R(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右に回る #define turn_L(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C); //左に回る #define go(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進する #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退する task main () { Pen_D(10); turn_R(300); //輪郭を書く Pen_U; turn_L(66); back(60); Pen_D(23); //右目を書く back(30); Pen_U; back(25); Pen_D(23); //左目を書く back(30); Pen_U; go(120); turn_L(80); back(20); Pen_D(23); //鼻を書く back(20); Pen_U; go(45); turn_R(35); Pen_D(23); //口を書く turn_L(70); //完成 } *感想 [#oa9aef2d] **さくらだ [#s76766e8] 機体の改修などを主に担当していてわかったが、~ 自分の思ったような動作をなかなかしないのがもどかしかった。~ プログラムを書いて、こう動くだろうなぁとは思っていても実際にはオーバーに動いてしまったり、~ これで大丈夫だろうと書き換えたら今度は違う問題が見つかったりなど、~ こっちの穴を塞げばあちらが、といったような状態だった。~ なので、これからはもっと実践をこまめに行いながら検証をかさねつつやりたいと思う。~ あと時間は多めに見積もっておくべきだと思った。 **琢磨 [#gb7b23d7] *コメント [#t38faf39] #comment