目次
A4の紙に相棒の似顔絵を書くロボットを作成せよ。
今回作成した土台は最初に作った機体を基礎にしました。
もともと前後のアタッチメント部分など汎用性の高い作りとなっていたため特に大きな変更はありませんが、
今回はペンを持つアーム部分などをなるべく安定して搭載したかったため大きな板を載せて、
設置場所をふやしかつアームなどの土台との接地面積を大きくしました。
他には、アームを搭載するときに障害となりそうだった
前方の先端部にあったバンパーなどのアタッチメント部分を削りました。
細かい部分ですが、後にRCXを横向きにして搭載するため
コードの長さ上ブロックの向きを反対に付けざるを得なく、
プロブラムでOnFwdと打っても後ろ向きに進んでしまっていました。
しかし、もとのタイヤについているコードブロックを反対にすることによって
その不具合を解消させました。
小さな部分ですが、後にプログラムを組むときに混乱しないためには必要だと思いました。
アーム部分はなるべく構造や動作を簡単にし、かつ堅実な構造を心がけていたため、
信頼性の高そうなエレベーター方式をチョイスしました。
試用したわけでもなく、私見で非常に申し訳ないのですが、一応理由は下にまとめておきます。
アーム方式 | 難しそう。なにより不安定そう。 |
タイヤ方式 | 構造も簡単でわかりやすく安定もしそうだが、タイヤ→ペンの力の伝わり方が不安。 |
エレベーター方式 | 構造も簡単でわかりやすく安定もしそうだし、ギアがそのまま「ペンのブロック」を動かしてくれるので安心。 |
つまりペンを搭載したブロックさえしっかり作れば、エレベーター方式は安心であると思っていた。
がしかしエレベーター方式は意外と罠が多かった。
まず直面した問題はペン搭載ブロックをどうやってアームに搭載するかでした。
ギアによって上下させるため完全固定をするわけにもいかず、かといって固定が緩いとうまくギアが咬み合わない。
そこで画像のような部分を付けることにしました。
実際にはこの部分は
「二本の棒を止める短い板がない…。」→「長い板で代用しよう。」→「横にずれないようにしたやつのおかげで前にペン搭載ブロックが倒れなくなった!」
といったふうに開発中に偶然できたものなのですが、僕の計算ということにしておきます。
そして次に直面した問題は、放っておくとペン搭載ブロックが下に落ちてきてしまうことでした。
これはギアが軽かったために、ペン搭載ブロックの重みに負けて落ちてきてしまったのですが、画像も部分を付けてギアを重くすることに成功しました。
ちなみにこのギアはアームにETB(面倒になってきたので略します。Elevator Tousai Block)を安定させるのにも活躍しています。これも計算のうちということにしておきます。
最後に、これは実際動かしてみて初めてわかったことなのですが、ETBを降ろす速度が速すぎてペンがポポポポーンしてしまいました。
なのでペンの反対側のキャップを開け、先端部と同様に穴あけブロックの中へペン先を入れました。
そのおかげでだいぶペンブレが軽減され、書いている途中に外れるなどというトラブルもなくすことができました。
#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(20);Off(OUT_B); //ペンを下げる #define pen_u OnFwd(OUT_B);Wait(30); //ペンを上げる
task main() { pen_d; tu_l(330); pen_u; //輪郭 go_b(60); pen_d; go_b(30); pen_u; //鼻を書く tu_r(80); go_s(30); tu_l(80); //位置を調整 go_s(30); pen_d; go_s(20); pen_u; //左目を書く go_b(50); tu_l(80); go_s(60); tu_r(80); go_s(30); //位置を調整 pen_d; go_s(20); pen_u; //右目を書く go_s(20); repeat(5); { pen_d; go_s(30); pen_u; go_b(30); tu_l(80); go_s(15); tu_r(80); } //髪を書く go_b(100); tu_l(80); go_s(20); //位置を調整 pen_d; go_s(20); pen_u; //口を書く go_s(100); tu_l(500); //完成のだんす }
マクロを使って基本動作をまとめることにより、
全体的にプログラミングが楽にできました。
髪を描くためのforループは調整に苦労しました…。
それとペンを上げたときに、移動中だらりと落ちてきてしまうことがあったので、
降ろす時以外は上げ続けるという多少強引な方法で解決しました。
最初はもっと特徴的な顔を描こうと意気込んでいたので、
もうちょっと、いささか、あとわずか、a little、あと1週間くらい、時間があれば描けていたかもしれません。
ちなみにどうしてみんな丸顔にしないんだろうと思って試験運用したときに、
紙が大幅にずれて「あぁ…。」と思ったのは秘密です。
でもずれたとしても
「角度の比率が変わらなければどうということはない。」
#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) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //前進する #define back(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //後退する
task main () { Pen_D(10); turn_R(350); //輪郭を書く Pen_U; turn_L(10); back(30); Pen_D(23); //右目を書く back(30); Pen_U; back(25); Pen_D(23); //左目を書く back(30); Pen_U; go(120); turn_L(100); back(35); Pen_D(23); //鼻を書く back(20); Pen_U; go(45); turn_R(35); Pen_D(23); //口を書く turn_L(55); Pen_U; back(90); turn_L(20); Pen_D(30); //髪を書く turn_R(65); Pen_U; turn_R(50); back(100); turn_L(40); go(30); turn_L(15); Pen_D(30); turn_L(40); Pen_U; //完成 }
シンプル イズ ベスト。 ただいまクレームは受け付けていません。
機体の改修などを主に担当していてわかったが、
自分の思ったような動作をなかなかしないのがもどかしかった。
プログラムを書いて、こう動くだろうなぁとは思っていても実際にはオーバーに動いてしまったり、
これで大丈夫だろうと書き換えたら今度は違う問題が見つかったりなど、
こっちの穴を塞げばあちらが、といったような状態だった。
なので、これからはもっと実践をこまめに行いながら検証をかさねつつやりたいと思う。
あと時間は多めに見積もっておくべきだと思った。
とにかく時間が取れなかったので、ほとんど相方に任せてしまった。
その点は、本当に申し訳ないと思う。
偶然にも、この授業で扱っているLEGOのキットを持っていた事もあり、
部品やその部品の使い方などの面では、サポート出来ていたと思う。
プログラムにおいては、
機体が一周するのに何秒かかるのかとか、ペンを何秒降ろせばいいのかなど、
パソコンだけでは出来ない作業が多くあったので、とても苦労した。