[[2008b/MemberOnly/進行状況A]] *課題 似顔絵ロボット作成 [#cd776502] A3の紙にロボットを使い似顔絵を描く。 **目次 [#g3a535b4] #contents *ロボットの作成 [#r7352c7a] **コンセプト [#va32a8b4] ロボットに似顔絵を描かせる上で「目が線では面白くない。」という意見より、ロボットを作製するにあたって。次のようなコンセプトを設定した。 自由な大きさの円を描けるロボット このコンセプトにより以下のような目標ができた。 •目は絶対に円で描く •口はニンマリ笑顔で •始点と終点のあったきれいな円を描く •相方(大幹)の髪の毛を再現する。(Y太郎のみ) 以上を目標にロボット製作にとりかかった。 **試作一号機 [#nb81f200] 目標を目指して作り始められた一号機、その主な機能は、 アーム部分である子機とベース部分である親機をそれぞれ独立させ、親機の上で子機 を前後に動かすことにより、円の半径を自由に変える である。 いろいろと苦労した点もあったが、その都度改良を加えることでなかなかかっこいいロボットができた。 これであとはプログラミングを施すだけ… と思われたそのとき、我々は他の班から信じがたい言葉を聞く、 「それ、A3に収まるんか…?」 我々は驚愕した… 「A3!?A3だって!? 収まるはずがないじゃないか!!」 そう、夢を詰め込みすぎたロボットはそれ自体がA3位のサイズにまで巨大化していたのだ。 このようにして一号機はプログラミングを待たずして開発中止を余儀なくされた。 *試作一号機は写真を撮っていなかったため画像をのせることができません。文字だけではわかりにくいと思いますが、ご了承ください。 **二号機 [#u5d5deb8] 一号機の反省を生かし、コンセプトは変えずにできるだけコンパクトなロボットを作製。 その主な機能は、 一号機のように自由に描画半径をかえることのできるようにするには、機構が 大きくなりすぎてしまうので、大きい円用と小さい円用にペンを二本持たせる である。 ペンの出し入れの方法はあまり場所をとらないアームとモーターをギアでつなぎ、上下に出し入れできるギミックを作ることにした。 ***機体 [#q530698e] #ref(2008b/A8/課題1左/IMGP0109.JPG,15%,完成図) 今回はキットに付属の冊子にあるドライブベースを基本として作成した。 すると様々な問題が発生した。 1、四輪タイヤが回転するときに摩擦の違いにより、若干のずれが発生する 2、輪郭用のペンを持たせるアームが、ベースから大きくはみ出てバランスが悪い 3、RCXを置く場所がない 4、タイヤタイプだとペンががっちり固定されない 5、コンパクトにならない ↓これらを改善する。 1、素直に二輪に 2、逆側にブロックを長く出しその先にガイドローラーをつける #ref(2008b/A8/課題1左/IMGP0123.JPG,15%,シャーシ) 3、2のブロックの上にRCXをのせることで解決 4、ペンをギアに固定するタイプにすることで解決 #ref(2008b/A8/課題1左/IMGP0117.JPG,15%,ペン) 5、もうA3に収まればなんでもいいや すべて解決された。 ***アーム(ペン部分)の作成 [#oc5d8658] ペンは二本使用する。 初め、下図のようにギアを一直線にくむことを考えたしかしこれでは、ベースの内側にたくさんのギアを入れなければならなかった。 #ref(2008b/A8/課題1左/名称未設定.jpg,70%,ギア構造) オレンジ→大きい円用のペンのギア 水色→ギア 青→モーターについたギア 赤→小さい円用のペンのギア そのため写真のように一度外側に出す形にした。 #ref(2008b/A8/課題1左/IMGP0114.JPG,10%,ギア構造) #ref(2008b/A8/課題1左/IMGP0112.JPG,10%,ギア構造) ペンを接続するギアは、ブロックを組み頑丈に固定した。 大きな円を描く方のペンを接続するギアは、そのブロック下部に丸くすべりやすいパーツをつけ、床に着けることによりロボットが安定して動けるようにした。 #ref(2008b/A8/課題1左/IMGP0116.JPG,10%,ギア構造) しかし、頑丈にしたためにパーツが重くなったので、より多くの補強を必要とした。 **プログラム [#v0ac4a6d] ***ペンギミック [#c3da847a] ペンA→大きな円 ペンB→小さな円 以下のマクロを作成した。 #define TURN OnRev(OUT_C); OnFwd(OUT_A); Wait(360); Off(OUT_A+OUT_C); Wait(50); //ロボットを一回転させる #define PEN_ONA OnFwd(OUT_B); Wait(13); Off(OUT_B); Wait(100); //ペンAを出す #define PEN_ONB OnRev(OUT_B); Wait(20); Off(OUT_B); Wait(100); //ペンBを出す #define PEN_OFFA OnRev(OUT_B); Wait(13); Off(OUT_B); Wait(100); //ペンAを出す #define PEN_OFFB OnFwd(OUT_B); Wait(15); Off(OUT_B); Wait(100); //ペンBを出す #define turn_90 OnRev(OUT_C); OnFwd(OUT_A); Wait(90); Off(OUT_A+OUT_C); Wait(50); //90°回転する 二人ともこのマクロを用いてペンの動作を行った。 ***Y太郎 [#cb33c5eb] 輪郭を描く task main(){ PEN_OFFA; //ギアを噛ませる PEN_ONA; //ペンAを下ろす TURN; //輪郭を描く PEN_OFFA; PEN_ONB; //ペンAからBへ 鼻を描く OnFwd(OUT_A+OUT_C); Wait(50); //口の位置に移動しつつ鼻をかく Off(OUT_A+OUT_C); Wait(50); PEN_OFFB; //ペンBを上げる 口を描く OnFwd(OUT_A); OnRev(OUT_C); Wait(30); //始点へ Off(OUT_A+OUT_C); Wait(50); PEN_ONA; //ペンAを下げる OnFwd(OUT_C); OnRev(OUT_A); Wait(60); //口を描く Off(OUT_A+OUT_C); Wait(50); PEN_OFFA; //ペンAを上げる OnFwd(OUT_A); OnRev(OUT_C); Wait(30); //中心線へ Off(OUT_A+OUT_C); Wait(50); 右目を描く turn_90; //90°回転 OnFwd(OUT_A+OUT_C); Wait(30); //右目の位置へ Off(OUT_A+OUT_C); Wait(50); PEN_ONB; //ペンBを下げる TURN; //目をかく PEN_OFFB; //ペンBを上げる 右眉を描く turn_90; //90°回転 OnRev(OUT_A+OUT_C); Wait(10); //右眉の位置へ Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A); OnRev(OUT_C); Wait(40); //始点へ Off(OUT_A+OUT_C); Wait(50); PEN_ONB; //ペンBを下げる OnFwd(OUT_C); OnRev(OUT_A); Wait(80); //眉毛を描く Off(OUT_A+OUT_C); Wait(50); PEN_OFFB; //ペンBを上げる OnFwd(OUT_A); OnRev(OUT_C); Wait(40); //元の位置へ Off(OUT_A+OUT_C); Wait(50); 右の黒目を描く OnRev(OUT_C); OnFwd(OUT_A); Wait(180); //180°回転 Off(OUT_A+OUT_C); Wait(50); PEN_ONB; Wait(100); //黒目を描く PEN_OFFB; //ペンBを上げる 左眉を描く turn_90; //90°回転 OnRev(OUT_A+OUT_C); Wait(60); //左眉の位置へ Off(OUT_A+OUT_C); Wait(50); turn_90; //90°回転 OnFwd(OUT_A); OnRev(OUT_C); Wait(40); //始点へ Off(OUT_A+OUT_C); Wait(50); PEN_ONB; //ペンBを下げる OnFwd(OUT_C); OnRev(OUT_A); Wait(80); //眉毛を描く Off(OUT_A+OUT_C); Wait(50); PEN_OFFB; //ペンBを上げる OnFwd(OUT_A); OnRev(OUT_C); Wait(40); //元の位置へ Off(OUT_A+OUT_C); Wait(50); 左の黒目を描く OnRev(OUT_C); OnFwd(OUT_A); Wait(180); //左目の位置へ Off(OUT_A+OUT_C); Wait(50); PEN_ONB; Wait(100); //黒目を描く PEN_OFFB; //ペンBを上げる 左目を描く OnRev(OUT_A+OUT_C); Wait(10); //少し移動 Off(OUT_A+OUT_C); Wait(50); PEN_ONB; //ペンBを下げる TURN; //右目を描く PEN_OFFB; //ペンBを上げる 髪の毛を描く OnFwd(OUT_A+OUT_C); Wait(40); //おでこに移動 Off(OUT_A+OUT_C); turn_90; repeat(5){ //次の行動を5回反復 PEN_ONB; //ペンBを下げる TURN; //髪の毛を描く PEN_OFFB; //ペンBを上げる OnFwd(OUT_A+OUT_C); //少し移動 Wait(20); Off(OUT_A+OUT_C); }; OnRev(OUT_A); OnFwd(OUT_C); Wait(85); //90°向きを変える Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); //少し移動 Wait(15); Off(OUT_A+OUT_C); OnRev(OUT_A); OnFwd(OUT_C); Wait(85); //90°向きを変える Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); //少し移動 Wait(30); Off(OUT_A+OUT_C); repeat(4){ //次の行動を4回反復 PEN_ONB; //ペンBを下げる TURN; //髪の毛2段目を描く PEN_OFFB; //ペンBを上げる OnFwd(OUT_A+OUT_C); //少し移動 Wait(20); Off(OUT_A+OUT_C); }; 退場 turn_90; //90°回転 OnFwd(OUT_A+OUT_C); Wait(100); //退場 Off(OUT_A+OUT_C); } このプログラムで完成した似顔絵 #ref(2008b/A8/課題1左/IMGP0122.JPG,20%,似顔絵) •こだわった点 黒眼 眉毛 髪の毛 どうしても黒眼 眉毛 髪の毛は描かせたかった。 一連の動作に無駄がないようにする。 髪の毛はもう少し多めでも良かったかむしれない。 時間がなかったのであまり工夫することはできず、とりあえず当初の目標をこなしたのみとなってしまった。耳、もみあげ、首まではいきたかった。 ロボットのペンを動かす機構に使ったギアの歯数がペンA、ペンBで違っており、またペンを接続するブロックの大きさもバラバラだったので、ペンを上げ下げする時間を調節するのが難しかった。結局何度も実際に動かしてみて微調整した。 髪の毛は当初一筆書きを計画していたが、なかなかうまくいかなかったため小さな円を何個も重ねることで再現した。 似顔絵は円の始点終点もそこそこ揃っているので満足している。 ***大幹 [#v75c2465] ペンの上げ下ろしのプログラムは上のマクロを使用したが、表記を少し変えた。 PEN_ON→PEN_Fwd PEN_OFF→PEN_Rev task main(){ PEN_RevA; //ギアを噛ませる PEN_FwdA; //ペンAを下げる TURN; //輪郭を描く PEN_RevA; //ペンAを上げる OnFwd(OUT_A+OUT_C); Wait(40); //口の位置へ Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A); OnRev(OUT_C); Wait(25); //始点へ Off(OUT_A+OUT_C); Wait(50); PEN_FwdA; //ペンAを下げる OnRev(OUT_A); OnFwd(OUT_C); Wait(50); //口を描く Off(OUT_A+OUT_C); Wait(50); PEN_RevA; //ペンAを上げる OnFwd(OUT_A); OnRev(OUT_C); Wait(25); //元の位置へ Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); Wait(60); //直進 OnRev(OUT_A); OnFwd(OUT_C); Wait(25); //テールを右へ OnRev(OUT_A+OUT_C); Wait(70); //後進 Off(OUT_A+OUT_C); PEN_FwdB; TURN; PEN_RevB; //右目を描く OnFwd(OUT_A+OUT_C); Wait(70); //元の位置へ OnFwd(OUT_A); OnRev(OUT_C); Wait(50); //テールを左へ OnRev(OUT_A+OUT_C); Wait(70); //後進 Off(OUT_A+OUT_C); PEN_FwdB; TURN; PEN_RevB; //左目を描く OnFwd(OUT_A+OUT_C); Wait(70); //元の位置へ OnRev(OUT_A); OnFwd(OUT_C); Wait(25); //テールを中心へ OnRev(OUT_A+OUT_C); Wait(70); //後進 OnFwd(OUT_A); OnRev(OUT_C); Wait(23); //鼻の始点へ Off(OUT_A+OUT_C); PEN_FwdB; //ペンBを下ろす OnRev(OUT_A+OUT_C); Wait(26); //鼻を描く(一画目) OnRev(OUT_A); OnFwd(OUT_C); Wait(65); //鼻を描く(二画目) PEN_RevB; //ペンBを上げる Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(100); //退場 Off(OUT_A+OUT_C); } このプログラムで完成した似顔絵 #ref(2008b/A8/課題1左/IMGP0120.JPG,20%,似顔絵) •こだわった点 鼻の形 機体の中心あたりにペンがあるので、ぶれることなく直線から曲線につなげられた。 これを利用して形の良い鼻を描くことができた。 *感想・考察 [#u62dde8a] ***ロボット [#v83691f3] ・補強パーツが多くなってしまったので、次はこのようなギミックでも更に安定性の高い ものを作りたい。 ・もっとコンパクトにできたはず ・今考えると1号機のギミックの基本構造をそのままにA3サイズにできたのでは?(失敗 発覚当初はあせってすぐにばらしてしまった) ・ペンギミックのギアの歯数を揃えるべきだった ***プログラミング [#s0abc333] ・ロボットを頑丈に作ったため、プログラミングではあまり苦労をしなかった、というか 時間がなくて苦労するようなプログラミングを組めなかった… ・サブルーチンを使わなかったのでプログラムが長くなりすぎてしまった ***全体として [#y9c18b27] ・もう少し計画的に ・発表当日、最終チェックをしていたらいつも通り動かなくなった。授業の最初のほうか らロボットをフル稼働させていたのでモーターが熱をもった? 休ませたらきれいな円 を描いてくれました ・ホームページ編集中に気づいたのだが、二号機ってコンセプトから若干はずれてる!! *コメントをどうぞ [#bad4d2ab] #comment 書くべきことはきちんと書けています。サブルーチンはこれからどんどん使うので、使ったものを書き直してみてください。あと、似顔絵の図や写真をお願いします。 F.I