*似顔絵ロボットの製作 [#u85f0c57] 目次 ''目次'' #contents **はじめに [#v8af37e3] 今回ロボット製作、プログラミングの練習として出された1つ目の課題は似顔絵を描くロボット作り!といってもただ似顔絵ロボットを作るだけでなく、いくつかルールがあります。 ~''ルール'' -紙はA4の白紙を使うこと -キットに入っている部品(レゴ)と自分たちで用意したペン以外は使ってはいけない -似顔絵を描くとき人が紙をおさえてはならない -絵を描くとき、絨毯の上でやるか机の上でやるか選ぶことができる ~こんなところです。これがかなり厳しいルールでロボット作りは本当に苦労しました。 では、そろそろロボットの方を紹介していきましょう! **製作したロボット、プログラム [#r92596fb] ***ロボットの構造 [#ubdef5c2] 何回かロボットの改良もしたので改良前のものも少し紹介したいと思います。 ~&ref(20120513_006.jpg,left);''&size(40){⇒};''&ref(20120522_174052.jpg,right); ~左が改良前、右が改良後。直進するときや旋回するときに、動きが安定するよう前方をキャスターから下の写真のような滑りやすいブロックに変えました。 ~&ref(20120522_174116.jpg,left); ~また、紙の上にロボットが乗るのではなく、ペンの部分を長くして紙の外側から絵を描けるようにすることで紙をほとんど動かさずにすむようになりました。 タイヤの部分についても少し改良を加えました。最初はモーターに直でタイヤをつないでいましたが、ギアを何個かかませてタイヤの動きをゆっくりにしました。 ~&ref(20120520_213204.jpg); ~ペンの部分に関しては下の写真のような構造をしています。 ~&ref(20120518_191317.jpg); ~モータの回転によって軸も回転しそれによってペンのついているブロックの端が持ち上がります。そうするとその反対側についているペンが地面に着くというギミックです。モーターがオフになるとゴムによって自動的に元の位置に戻る仕掛けになっています。 ***プログラム [#a62bccd4] &ref(似顔絵1.jpg); ~上のような似顔絵を描くプログラムです。ちなみに、 -(1)⇒右輪郭、左輪郭 -(2)⇒両目、鼻 -(3)⇒右眉毛 -(4)⇒口 -(5)⇒左眉毛のように対応しています。 #define STOP_TIME 100//作業のあと停止する時間を定義 #define line_time01 140//(1)の線を描く時間を定義 #define line_time02 30//(2)の線を描く時間を定義 #define line_time03 20//(3)の線を描く時間を定義 #define RIGHT_TURN_TIME 97//右に旋回する時間を定義 #define LEFT_TURN_TIME 90//左に旋回する時間を定義 #define line_time04 10//(4)の線を描く時間を定義 sub turn_right() { OnFwd(OUT_C);OnRev(OUT_A);Wait(RIGHT_TURN_TIME); Off(OUT_AC);Wait(STOP_TIME); }//右に90度旋回するためのサブルーチン sub turn_left() { OnFwd(OUT_A);OnRev(OUT_C);Wait(LEFT_TURN_TIME); Off(OUT_AC);Wait(STOP_TIME); }//左に90度旋回するためのサブルーチン sub draw_1st_line() { OnFwd(OUT_B);OnRev(OUT_AC);Wait(line_time01); Off(OUT_ABC);Wait(STOP_TIME);OnFwd(OUT_AC); Wait(100);Off(OUT_AC);Wait(STOP_TIME); }//(1)の線を描くためのサブルーチン sub draw_2nd_line() { OnFwd(OUT_B);OnRev(OUT_AC);Wait(line_time02); Off(OUT_ABC);Wait(STOP_TIME); }//(2)の線を描くためのサブルーチン sub draw_3rd_line() { OnFwd(OUT_AB);Wait(line_time03);Off(OUT_AB);OnRev(OUT_A); Wait(line_time03);Off(OUT_A);Wait(STOP_TIME); }//(3)の線を描くためのサブルーチン sub draw_4th_line() { OnFwd(OUT_A);OnRev(OUT_C);Wait(line_time04);Off(OUT_AC); Wait(STOP_TIME);OnFwd(OUT_B); Wait(STOP_TIME);OnFwd(OUT_C);OnRev(OUT_A); Wait(line_time04*2);Off(OUT_ABC);Wait(STOP_TIME); OnFwd(OUT_A);OnRev(OUT_C);Wait(line_time04);Off(OUT_AC); Wait(STOP_TIME); }//(4)の線を描くためのサブルーチン sub draw_5th_line() { OnFwd(OUT_BC);Wait(line_time03);Off(OUT_BC);OnRev(OUT_C); Wait(line_time03);Off(OUT_C);Wait(STOP_TIME); }//(5)の線を描くためのサブルーチン sub go_straight() { OnFwd(OUT_AC);Wait(45);Off(OUT_AC);Wait(STOP_TIME); }//直進して紙のまわりを移動するためのサブルーチン task main() { draw_1st_line();turn_left();//右の輪郭を描く go_straight();turn_right();//i移動 draw_3rd_line();//右の眉毛を描く OnRev(OUT_AC);Wait(20);Off(OUT_AC);Wait(STOP_TIME); draw_2nd_line();//右目を描く OnFwd(OUT_AC);Wait(20);Off(OUT_AC);Wait(STOP_TIME); turn_left();go_straight();turn_right();//移動 OnRev(OUT_AC);Wait(30);Off(OUT_AC);Wait(STOP_TIME); draw_2nd_line();//鼻を描く OnRev(OUT_AC);Wait(40);Off(OUT_AC);Wait(STOP_TIME); draw_4th_line();//口を描く OnFwd(OUT_AC);Wait(100);Off(OUT_AC);Wait(STOP_TIME); turn_left();go_straight();turn_right();//移動 draw_5th_line();//左眉を描く OnRev(OUT_AC);Wait(13);Off(OUT_AC);Wait(STOP_TIME); draw_2nd_line();//左目を描く OnFwd(OUT_AC);Wait(22);Off(OUT_AC);Wait(STOP_TIME); turn_left();go_straight();turn_right();OnFwd(OUT_AC);Wait(20);Off(OUT_AC); Wait(STOP_TIME);//移動 draw_1st_line();//左の輪郭を描く } ~プログラムは以上です。 ~ちなみに完成した絵がこちら↓ ~&ref(20120523_225321.jpg); ~・・・。まあ、一応顔には見えますよね!?でも、直線が曲がっちゃってるところあるし、すごく情けない顔になってしまいましたwww ***工夫した点、頑張った点 [#rca7d767] まず何より考えたのが絵の描き方。紙の上に載って書こうとするとどうしても紙が動いてしまうので、その方針は良かったかなと思います。あと、ギアでモーターの速さを落としたことや、ぺんの動きはがんばりました。また、プログラムに関しても、90度正確に旋回できるよう何回も検証したり、顔の構造が変にならないように時間や動きを設定したり、動きが多いとどうしても誤差が大きくなってしまうので、できるだけ無駄な動きをなくしたりといろいろ苦労しました。 **まとめ [#y8b72831] 今回の課題、とにかく疲れた・・・。似顔絵を描くだけなのに、ここまで時間がかかるとは・・・。やりきった感は半端じゃなかったですけどねwwwでも完成した後はロボット作りやプログラムに関してたくさんのアドバイスをいただきました。重心の位置をタイヤの上に置いたり、ペンの長さをもっと短くして動きのブレをすくなくしたり・・・。なによりどんなロボット作りにも一貫して言えることが、使うパーツや、組み込むプログラムはできるだけ少なく!とのことです。まだまだ改善点はたくさんあるので、この次のロボット作りに生かすことができればなあと思います。今回はこのページを読んでいただきありがとうございました。次回の課題もあるのでよかったらまた読んでみてください。ではではまた次の機会に〜。