*課題1 [#z183b23a] #contents *この課題の目的 [#x7e98ed5] 相棒の似顔絵を描くロボットを作る。 *手段 [#i65f602e] NQCプログラミングとRCX2を使用する。 付属物のほかに、鉛筆を用意した。 *完成品 [#za68a9a3] **お絵描きロボット初号機 [#i11cc446] ・鉛筆を単純に固定したシンプルなもの。 ・ゴムと軸を使って固定されている。 #ref(081030_175331.jpg) **二号機 [#l161d7bb] #ref(081105_161528.jpg) ・一号を改良したもの。鉛筆部分が回るようになっている。 **三号機 [#na7ac058] #ref(081105_173314.jpg) ↓上から見た図。 #ref(081105_172743.jpg) **四号機 [#y39dd4ff] ・鉛筆の安定性が二号三号では悪かったため、固定方法を変更した。 #ref(081106_174454.jpg) ***工夫した点 [#paa11d47] 移動以外のモータで鉛筆をまわす様にしたこと。 小さな動きでサイズの違う二つの円が描けるようになりました。 **プログラム [#a1dd775c] ・完成予定図1 #ref(081106_171837.jpg) ・完成予定図2 #ref(081106_171535.jpg) ***第一段階 A [#mc21d647] void go_straight(int t)// t/100秒間前進 { OnFwd(OUT_A+OUT_C);Wait(t); Off(OUT_A+OUT_C); } void go_back(int t)// t/100秒間後退 { OnRev(OUT_A+OUT_C);Wait(t) Off(OUT_A+OUT_C); } void turn_right(int t)// t/100秒間右回りに回転 { OnFwd(OUT_A);OnRev(OUT_C); Wait(t); Off(OUT_A+OUT_C); } void turn_left(int t)// t/100秒間左回りに回転 { OnFwd(OUT_C);OnRev(OUT_A); Wait(t); Off(OUT_A+OUT_C); } task main() { go_straight(100);//右目 turn_left();//90°左へ go_straight(100);//右頬 turn_left();//60°左へ go_straight(100);//右顎 turn_left();//60°左へ go_straight(100);//左顎 turn_left();//60°左へ go_straight(100);//左頬 turn_left();//90°左へ go_straight(100);//左目 go_back(100); turn_right();//90°右へ repeat(3)//髪の毛 { go_straight(115); turn_left();//150°左へ go_straight(115); turn_right();//150°右へ } } task main() { OnFwd(OUT_A);Wait();//時計回りに一回転 Off(OUT_A); turn_right();//右に90° go_straight(); OnFwd(OUT_3);Wait();//左レンズ Off(OUT_3); go_straight(); OnFwd(OUT_3);Wait();//右レンズ Off(OUT_3); go_straight(); } ***第一段階 B [#uee579b8] #define TURN_T 54 //顔の輪郭用回転時間 #define turn_l OnRev(OUT_A);OnFwd(OUT_C);Wait(81);Off(OUT_A+OUT_C); //turn #defrine turn_r OnFwd(OUT_A);OnRev(OUT_C);Wait(108);Off(OUT_A+OUT_C); sub hair() //髪の毛 { OnFwd(OUT_A+OUT_C); Wait(35); Off(OUT_A+OUT_C); OnRev(OUT_A);OnFwd(OUT_C); Wait(108); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(35); Off(OUT_A+OUT_C); } sub turn() //顔用回転 { OnRev(OUT_A); OnFwd(OUT_C); Wait(TURN_T); Off(OUT_A+OUT_C); } sub go() //直線 { OnFwd(OUT_A+OUT_C); Wait(30); Off(OUT_A+OUT_C); } task main() { OnFwd(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); //目 turn_l; //ここから顔の輪郭 go(); turn(); go(); turn(); go(); turn(); // ここまで turn_l; OnFwd(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); //目 OnRev(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); //輪郭まで後退 OnFwd(OUT_A); OnRev(OUT_C); Wait(54); Off(OUT_A+OUT_C); //向きを変える OnFwd(OUT_A+OUT_C);Wait(5);Off(OUT_A+OUT_C); //額分 //髪ここから hair(); turn_r; hair(); turn_r: hair(); //ここまで OnFwd(OUT_A); OnRev(OUT_C); Wait(54); Off(OUT_A+OUT_C); //向きを変える OnFwd(OUT_A+OUT_C);Wait(5);Off(OUT_A+OUT_C); //額 } しかし両プログラムともこのロボットの形(先頭に鉛筆)だと、 曲がり方の問題からそもそも予定していた線がかけないことが判明。 **改良 [#fc3c8624] ***改善点 [#z555a8b2] ・このプログラムだとうまくいかないことから、本体かプログラムの変更ということでプログラムの方をきれいに描けるよう変更した。 ***改善後のプログラム [#l777a7a5] #ref(081106_171535.jpg) (完成目標図) #define RENZ OnFwd(OUT_B);Wait(298);Off(OUT_B); //レンズを描く #define TURU OnRev(OUT_A+OUT_C);Wait(30);Off(OUT_A+OUT_C);Wait(20); //つる task main() { SetPower(OUT_A+OUT_C+OUT_B,1); OnFwd(OUT_A);OnRev(OUT_C); //顔の輪郭 Wait(1200); Off(OUT_A+OUT_C); //眼鏡ここから TURU; OnFwd(OUT_B);Wait(323);Off(OUT_B);Wait(20); //grass OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C); Wait(20); RENZ; TURU; //眼鏡ここまで } ・こちらが完成した絵。すこし斜めから写っています。 やや筆圧が低く、肉眼では見えるのだがカメラで判別しづらいのが難点。 #ref(20081106180315.jpg) ・以下のように描かれています。 #ref(2008110.jpg) ***工夫点 [#fa3c0086] ・『#define RENZ OnFwd(OUT_B);Wait(298);Off(OUT_B); //レンズを描く』 の部分で先頭の鉛筆が回転します。この事で丸眼鏡が描けました。 *まとめ/考察/感想 [#w43c45f7] ・ややぎこちなく動くので、もう少し滑らかに出来ればよかったと思う。 ・プログラムを作成した後にロボットの動き方と鉛筆の位置との関係に気づいたりしたため、ずいぶんと慌ててしまった。 ・始めた最初のころはテストプレイで奇妙な動きをされてプログラムをどう直せばいいか困ったことがあったが、なんとか動くものを作ることができてよかった。 #br #br *コメントをどうぞ - プログラムの後半の説明を書いてください。似顔絵の図または写真もお願いします。 -- [[F.I.]] &new{2008-11-06 (木) 15:05:39}; - できた似顔絵の図と、ソースにコメントをつけてください。 -- [[なかむら]] &new{2008-11-12 (水) 17:09:43}; - 書くべきことをきちんと書けている良いレポートです。 -- [[FI]] &new{2008-11-26 (水) 18:59:52}; #comment