目次
#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);



***こちらがスガのプログラムです。 [#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);
 }

完成です。



***この方が松のプログラムとなっています。 [#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);
 } 



**感想 [#y6aeb1ee]
プログラムがこんなに難しいものだとは思いもしていなくてくじけそうになりました。
やることがほとんど初めてのことでうまくプログラムできなかったり、微調整とかが大変でなかなかに疲れましたが、かなり楽しかったです。自分のプログラムで絵が描けた時は本当に感動して嬉しかったです。

今回は基本的なことを多く覚えました。
まだ次の課題もあるので、そこでは今回学んだことを生かしてさらに高度なロボットとプログラムを作ります。


**コメント [#q5f93569]
コメントやアドバイスがありましたらどうぞよろしくお願いします。
- ロボットの説明やプログラムの方針等、しっかりしています。あとは、似顔絵の写真を貼ったり、2人目のプログラムの説明を入れましょう。 -- [[FI]] &new{2009-05-21 (木) 18:45:26};

#comment

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS