[[2008b/MemberOnly/進行状況A]] *課題 似顔絵ロボット作成 [#cd776502] A3の紙にロボットを使い似顔絵を描く。 **目次 [#g3a535b4] #contents *ロボットの作成 [#r7352c7a] **コンセプト [#va32a8b4] ロボットに似顔絵を描かせる上で「目が線では面白くない。」という意見より、輪郭用や目用などのように、異なる半径の線を描くことのできるロボットを目指して作製することになった。 **試作一号機 [#nb81f200] 自由に描画半径を変えるためにロボットをベースである親機部分と、ペンを持たせる子機部分に分け、子機部分にタイヤを搭載し親機の上で前後に動かすことのできるようにした。 ペンは別なタイヤ同士に挟むことで固定し、出し入れするようにする。 一つのモーターで子機を前後させペンを出し入れしなければならないという問題ができたので、ギアを組み合わせ子機を動かすタイヤをゆっくり動かすようにし、解決した。 これにより自由な半径で線を描くことができるようになった。 しかし、課題についてよく調べていなかった我々は、ロボットを大きく作りすぎてしまいA3の紙の上で動かすには、あまりにも窮屈だったため試作一号機は開発中止を余儀なくされる。 *試作一号機は写真を撮っていなかったため画像をのせることができません。文字だけではわかりにくいと思いますが、ご了承ください。 **二号機 [#u5d5deb8] 一号機の反省を生かし、コンセプトは変えずにできるだけコンパクトなロボットを作製。 一号機のように自由に描画半径をかえることのできるようにするには、機構が 大きくなりすぎてしまうので、大きい円用と小さい円用にペンを二本持たせるようにした。 ペンの出し入れの方法はあまり場所をとらないアームとモーターをギアでつなぎ、上下に出し入れできるギミックを作ることにした。 **ベース [#q530698e] 写真 今回はキットに付属の冊子にあるドライブベースを基本として作成した。 四輪だと回転するときに摩擦の違いにより、若干のずれが発生するので、二輪走行にした。 また、大きい円を描くためのペンを持たせるアーム部分が、ベースから大きくはみ出るため、逆側にブロックを長く出しその先にガイドローラーをつけ、さらにそのブロックの上にRCXをのせることにより、重心を安定させた。 小さい円用のペンは、ベース中心部の穴から出し入れする。 **アーム(ペン部分)の作成 [#oc5d8658] ペンを二本差し入れするため、ギアを一直線にくむことを考えたしかしこれでは、ベースの内側にたくさんのギアを入れなければならなかったため一度外側に出す形にした。 #ref(2008b/A8/課題1左/IMGP0112.JPG,15%,ギア構造) ペンを接続するギアは、ブロックを組み頑丈に固定した。大きな円を描く方のペンを接続するギアは、そのブロックを床に着けることによりロボットが安定して動けるようにした。 #ref(2008b/A8/課題1左/IMGP0116.JPG,15%,ギア構造) **プログラム [#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を上げる turn_90; //90°回転 OnFwd(OUT_A+OUT_C); Wait(100); //退場 Off(OUT_A+OUT_C); } ***大幹 [#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); } *感想・考察 [#u62dde8a] ロボットを頑丈に作ったため、プログラミングではあまり苦労をしなかった。 しかし、プログラムが長くなりすぎてしまったので、もう少しサブルーチンを使うなど工夫すればよかった。 *コメントをどうぞ [#bad4d2ab] #comment 書くべきことはきちんと書けています。サブルーチンはこれからどんどん使うので、使ったものを書き直してみてください。あと、似顔絵の図や写真をお願いします。 F.I このページは、ロボットに関連した書きかけの項目です。