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