目次 #contents *課題1 似顔絵を描くロボット [#u796d914] **ロボットの構造の工夫 [#b2dce520] このロボットの雛形は、マインドストームの四輪駆動型ロボットです。 ・はじめにモーターとアームを繋ぐときにすぐにできるだろうと気楽な感じでゴムで繋ごうとしたのですが、すぐに外れるし空回りしてうまく動力が伝わらなくてあきらめました。 横の動きによってよじれの生じるゴムの使用は避け、ギアによる駆動機構を搭載しました。 ・ギアにすることでペンの動きをゆっくりにすることができ、勢いを抑えれるようにしました。そしてギアを固定するのと見た目を良くするためにブロックでギアを囲みました。 #ref(2009a/A9/課題1左/090521_1856~01.jpg) ・ペンを上げ下げするときに地面につく衝撃でペンがぶれてしまいうまく線を引けなかったのでしっかり固定させる方法を探すのにかなり苦労しました。 ペンを固定する部分はゴムでの固定は避け、両方から挟んでいくつかの支点でささえるようにしました。その結果なかなかの強度になりました。 #ref(2009a/A9/課題1左/090521_1819~01.jpg) ・ペンの上下の動きに耐えれるようにモーター2の部分をしたから支えるようしました。 #ref(2009a/A9/課題1左/090521_1855~02.jpg) ・はじめに作った時はタイヤが本体と接触してしまいうまく回転しなかったので車輪と本体の間にパーツを入れて接触しないようにしました。 ・完成はこれです。シンプルですが強度はあります。 #ref(2009a/A9/課題1左/090521_1855~01.jpg) **ロボットの基本的なプログラム [#m71871cc] 全員に共通する基本的なプログラムです。大体こんな感じで作っていけば似顔絵ができそうだ、という話になりました。 ・顔の輪郭を描く。 ・眼を描くための軌道修正をする。 ・眼を描く。 ・口を描くための軌道修正をする。 ・口を描く。 あとはそれぞれ変化を加えて似させる。 ・プログラムに関数、マクロ、サブルーチンを使い整理する。 **それぞれのプログラム [#e011d77f] ***これがハるのプログラムです。 [#g62daa50] マクロを使いました。 #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C); #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C); #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define pen_updown OnRev(OUT_B);Wait(10);OnFwd(OUT_B);Wait(10);Off(OUT_B); task main() { まずは輪郭を。 OnFwd(OUT_A); Wait(850); Off(OUT_A); 位置を調整し、目を描く。 OnFwd(OUT_B); Wait(10); Off(OUT_B); turn_left(200) go_straight(50) pen_updown go_straight(50) pen_updown さらに位置を調整し、長めの口をかく。 turn_left(100) go_straight(50) turn_left(100) go_straight(100) OnRev(OUT_B); Wait(10); Off(OUT_B); OnFwd(OUT_A+OUT_C); Wait(150); Off(OUT_A+OUT_C); 上を向いた松の顔です。 #ref(2009a/A9/課題1左/090522_1757~01.jpg) ***こちらがスガのプログラムです。 [#u64b3710] プログラムを簡単にして繰り返しをさけるためにマクロを使いました。おかげで何度も同じプログラムを書かずにすみました。 #define pen_up OnFwd(OUT_B);Wait(10);Off(OUT_B); //ペンを上げる #define pen_down OnRev(OUT_B);Wait(10);Off(OUT_B);//ペンを下げる task main() { まず輪郭を描きます。 pen_down; //輪郭を描く OnFwd(OUT_A); Wait(765); Off(OUT_A); pen_up; OnFwd(OUT_C); Wait(50); 次に目を描きます。目を描くときは同じ動きだったのでrepeatを使いました。 repeat(2){ //目を描く OnFwd(OUT_A+OUT_C); Wait(20); pen_down; Wait(30); pen_up; } 鼻を描きます。 OnRev(OUT_A+OUT_C); //鼻へ移動 Wait(200); OnFwd(OUT_A); Wait(40); OnFwd(OUT_A+OUT_C); Wait(140); pen_down; //鼻を描く Wait(15); pen_up; Wait(50); ここで方向転換を正確にしたかったので一度offにしてスピードをおとしました。 Off(OUT_A+OUT_C); Wait(50); そして最後に口を描きます。 OnFwd(OUT_C); //口へ移動 OnRev(OUT_A); Wait(240); OnFwd(OUT_A+OUT_C); Wait(170); pen_down; //口を描く Wait(20); OnFwd(OUT_A+OUT_C); Wait(30); pen_up; OnFwd(OUT_A+OUT_C); Wait(300); Off(OUT_A+OUT_C); } 完成です。 ハるの顔です。横を向いて黄昏れている感じ。 #ref(2009a/A9/課題1左/090522_1757~02.jpg) ***この方が松のプログラムとなっています。 [#q47d0ece] 関数を使いました。 #define pen_move 10 ペンを上げます。 sub pen_up() { OnFwd(OUT_B); Wait(pen_move); Off(OUT_B); } ペンを下げます。 sub pen_down() { OnRev(OUT_B); Wait(pen_move); Off(OUT_B); } ここがメイン! task main() { pen_down(); 輪郭を書きます。 OnFwd(OUT_A); Wait(850); Off(OUT_A); pen_up(); OnFwd(OUT_C); Wait(50); 目です、チョンチョンと書きます。 repeat (2) { OnFwd(OUT_A+OUT_C); Wait(20); pen_down(); Wait(30); pen_up(); } 旋回して、 Toggle(OUT_A+OUT_C); Wait(160); Off(OUT_A+OUT_C); OnFwd(OUT_C); Wait(60); OnRev(OUT_A); Off(OUT_C+OUT_A); 口を書きます、にっこりです。 pen_down(); Wait(60); OnFwd(OUT_C); Wait(60); OnRev(OUT_A); Off(OUT_C+OUT_A); pen_up(); 顔の上からどきます。 OnRev(OUT_A+OUT_C); Wait(300); Off(OUT_A+OUT_C); } スガです。だいたいこんな感じ。 #ref(2009a/A9/課題1左/090522_1757~03.jpg) **感想 [#y6aeb1ee] プログラムがこんなに難しいものだとは思いもしていなくてくじけそうになりました。 やることがほとんど初めてのことでうまくプログラムできなかったり、微調整とかが大変でなかなかに疲れましたが、かなり楽しかったです。自分のプログラムで絵が描けた時は本当に感動して嬉しかったです。 今回は基本的なことを多く覚えました。 まだ次の課題もあるので、そこでは今回学んだことを生かしてさらに高度なロボットとプログラムを作ります。 **コメント [#q5f93569] コメントやアドバイスがありましたらどうぞよろしくお願いします。 - ロボットの説明やプログラムの方針等、しっかりしています。あとは、似顔絵の写真を貼ったり、2人目のプログラムの説明を入れましょう。 -- [[FI]] &new{2009-05-21 (木) 18:45:26}; - 強度を追求するための工夫の説明がとても分かりやすいです。スガさんのプログラムの説明がわかりやすくよく書けていますので、松さんとハるさんも参考にしてみてください! -- [[こさか]] &new{2009-05-21 (木) 22:59:05}; - コメントありがとうございます。分かりました。改善します。 -- [[スガ]] &new{2009-05-22 (金) 17:00:14}; - プログラムの説明の分かりやすさが断然違います!わかりやすく説明することで、ご自分の理解度も上がったことと思います。 -- [[こさか]] &new{2009-05-28 (木) 23:09:14}; #comment