2009a

似顔絵ロボットの作成

目次

ロボットの全体像

このロボットを作成するに当たって、初期の段階ではベルトコンベアー方式を用いていました。しかし、それでは回転したり細かい箇所を描くことにおいてやや困難である思い、以下のようなロボットを作ってみました。

 

robotSmall1.JPG

どうでしょうか?ぱっと見たところちょっと分かりにくいかもしれませんね。なぜならこれは冊子に載っていたものを参考にしたのではなくて、自分たちのオリジナルで作ったものだからです。では具体的に説明します。まず、下の写真をご覧ください。

ロボット(後方から)

small7236.JPG

これはロボットを下から撮影したものです。大きな特徴としては左右それぞれ2個ずつの車輪で成り立っており、外側がグレーの歯車で、内側がやや小さめのタイヤとなっています。こうしてサイズの違う車輪を複数用いることで細かい動きを可能にしたのです。

ロボット(横から)

small7234.JPG

これはロボットを横から撮影したものです。左向きが進行方向になります。このアングルからの写真で分かると思いますが、左側にある小さいタイヤが前輪となります。これは直接運動を作用せずただ前方のバランスを取るために装着されています。運動は後方にあるモーターから後輪に伝えられ、その動きに応じて前輪が作用します。写真の通り黄色い電源が後方に直立しているので、ロボット全体のバランスを調節するのに苦労しました。 ロボット(上方から)

small7233.JPG

この写真はロボットを上方から見たものです。一番左にある大きなタイヤはロボットを安定させるために用いた重りのようなものです。しかし、最終的にはこの重りなしでうまくロボットを作動することができました。中央やや右側に見える青く細長いものがペンで、それを左側にある青い輪ゴムと2つの滑車が運動することによって、ペンの上下運動を可能にしているのです。 では、そのペン周辺の構造を見て見ましょう。

ペン周辺部の仕組み

small7241.JPG

まず、ペンを緑の輪ゴムで黄色い部品と固定しました。これは反対側でも同様に固定されています。そしてその黄色い部品を黒い棒にくくりつけ、その黒い棒が写真右側の滑車によって動かされることによってペンが上下に動く仕組みになっています。正直この部分がロボット作成において一番苦労したところでした。

small7247.JPG

これはそこの部分をさらに分解してみたものです。これで反対側も同様の構造をしていることが分かると思います。

似顔絵を描く工程

そして次はいよいよ似顔絵の製作工程に移ります。 まず顔のどのパーツから描こうか考えましたが、結果的に外から内に、上から下への順で行こうということになりました。 具体的には、

ヾ蕕領愕圓鯢舛 右目を描く 左目を描く ど,鯢舛 ジを描く

というふうにやってみました。

以下はそのプログラムです。

タイラーさんの顔

22052009.jpg

//This is a program to draw faces
//100miliseconds = 580mm as of 5.15.09
//465 miliseconds = 360 degrees as of 5.15.09

#define PEN_MOVE_TIME  250 //kore ha pen no ugoiteru jikan
#define TIME_FOR360    465
#define PEN_SPEED      7
#define WHEEL_SPEED    7

sub raisePen()
{
  SetPower(OUT_B, PEN_SPEED);
  OnRev(OUT_B);
  Wait(PEN_MOVE_TIME);
  Off(OUT_B);
}

sub lowerPen()
{
  SetPower(OUT_B, PEN_SPEED);
  OnFwd(OUT_B);
  Wait(PEN_MOVE_TIME);
  Off(OUT_B);
  Wait(35);
} 

void turn(int leftRight,int degrees)
{
  SetPower(OUT_A+OUT_C, WHEEL_SPEED);
  
  if (leftRight == 0)
  {
    OnFwd(OUT_A);
    OnRev(OUT_C);
  }
  else
  {
    OnFwd(OUT_C);
    OnRev(OUT_A);
   }
  
  Wait(degrees);     //*465)/360
  Off(OUT_A+OUT_C);
  
}

void driveF(int driveF_time)
{
  SetPower(OUT_A+OUT_C, WHEEL_SPEED);
  OnFwd(OUT_A+OUT_C);
  Wait(driveF_time);
  Off(OUT_A+OUT_C);
}


task main()
{
//100miliseconds = 580mm as of 5.15.09
//465 miliseconds = 360 degrees as of 5.15.09


  //顔の左側
  lowerPen();ペンをおろす
  driveF(225);
  
  //あご
  repeat(17)
  {
  turn(0,14);
  Wait(20);
  driveF(20);
  }

  //顔の右側
  driveF(200);
  raisePen();ペンをあげる
  
  //おでこ
  turn(0,116);
  lowerPen();ペンをおろす
  driveF(220);
  raisePen();ペンをあげる
  
  // おでこから目
  turn(0,58+116);
  driveF(60);

  
  //左目
  lowerPen();ペンをおろす
  turn(1,407);
  raisePen();ペンをあげる
  
  // 右目へ行く
  driveF(100);
  lowerPen();ペンをおろす
  turn(1,583);
  raisePen();ペンをあげる
  
  //  右目から鼻
  driveF(100);
  turn(1,117);
  driveF(50);
  
  //鼻を描く

  turn(0,348);
  lowerPen();ペンをおろす
  turn(0,233);
  raisePen();ペンをあげる


  //口へ向かう
  driveF(100);
  turn(1,117);
  driveF(50);
  turn(0,117);
  
  //口を描く
  lowerPen();ペンをおろす
  repeat(17)
  {
  turn(0,14);
  Wait(20);
  driveF(10);
  }
  raisePen();
  
}

バビロンさんの顔

//This is a program to draw faces
//100miliseconds = 580mm as of 5.15.09
//465 miliseconds = 360 degrees as of 5.15.09

#define PEN_MOVE_TIME  250 //kore ha pen no ugoiteru jikan
#define TIME_FOR360    465
#define PEN_SPEED      7
#define WHEEL_SPEED    7

sub raisePen()
{
  SetPower(OUT_B, PEN_SPEED);
  OnRev(OUT_B);
  Wait(PEN_MOVE_TIME);
  Off(OUT_B);
}

sub lowerPen()
{
  SetPower(OUT_B, PEN_SPEED);
  OnFwd(OUT_B);
  Wait(PEN_MOVE_TIME);
  Off(OUT_B);
  Wait(35);
}

void turn(int leftRight,int degrees)
{
  SetPower(OUT_A+OUT_C, WHEEL_SPEED);

  if (leftRight == 0)
  {
    OnFwd(OUT_A);
    OnRev(OUT_C);
  }
  else
  {
    OnFwd(OUT_C);
    OnRev(OUT_A);
  }

  Wait(degrees);     //*465)/360
  Off(OUT_A+OUT_C);

}

void driveF(int driveF_time)
{
  SetPower(OUT_A+OUT_C, WHEEL_SPEED);
  OnFwd(OUT_A+OUT_C);
  Wait(driveF_time);
  Off(OUT_A+OUT_C);
}


task main()
{
//100miliseconds = 580mm as of 5.15.09
//465 miliseconds = 360 degrees as of 5.15.09



  lowerPen(); 顔の左側
  driveF(225);


  repeat(18)あごの部分
  {
   turn(0,14);
  Wait(20);
  driveF(20);
  }


  
  driveF(200);  //顔の右側
  raisePen();ペンをあげる

  turn(0,135);おでこ
  lowerPen();ペンをおろす
  
  repeat(21)髪の毛
  {
  driveF(10);
  turn(1,116);
  Wait(20);
  turn(0,118);
  }
 
  
  raisePen();ペンをあげる

  turn(0,58+116);おでこから左目
  driveF(70); 

  lowerPen();右目へ
  turn(1,407+10);
  raisePen();ペンをあげる


  driveF(100);鼻
  lowerPen();ペンをおろす
  turn(1,583+30);
  raisePen();ペンをあげる


  driveF(100);鼻から口へ
  turn(1,117);
  driveF(50);


  turn(0,348);
  lowerPen();ペンをおろす
  turn(0,233+30);
  raisePen();ペンをあげる



  driveF(40);口の部分
  turn(1,117);
  driveF(60);
  turn(0,117);


  lowerPen();ペンをおろす
  repeat(14)下唇
  {
  turn(0,14);
  Wait(20);
  driveF(10);上唇
  }
  raisePen();ペンをあげる

}

コメントをどうぞ

  • ロボットの説明の文章と写真はわかりやすくまとまっていますので、あとは見出しをつけてみてください。プログラムの方は説明が足りないかなぁと思います。これはなにをする関数だとかそういったことを入れてみてください。
    それと、「ひとりにつき一つ以上のプログラムを作成すること。」の条件がありますので、誰が書いたプログラムかも明記してください。(こさか)
    (追伸:commentは#が半角でないと機能しないです!) -- FI? 2009-06-12 (金) 21:52:41
  • ロボットがオリジナルである点、その説明が詳しい点、プログラムを初めに部分に分けて考えている点など良い点がたくさんあります。ただ、プログラムがうまく貼れていない点や、説明がない点を直して、自分たちの良いところがフルに伝わるようにしてください -- FI? 2009-06-12 (金) 21:52:41
  • プログラムはかなり高度なことをやっている印象ですが、それぞれの関数やサブルーチンが何をするのかがわからないですので、ひとつひとつに、説明をつけてみてください。 -- こさか? 2009-07-02 (木) 21:18:59
  • 詳しい説明がついてわかりやすくなりました。ところどころ、//lowerPen();のようにコメントアウトされてしまっていますが、それはそれでいいのでしょうか? -- こさか? 2009-07-10 (金) 12:18:42
  • コメントアウトされた命令は実行されないので、実行する必要がある命令はコメントアウトしないようにしてください。もし、実行する必要のない命令ならば、コメントアウトした理由を書いておいていただけると、読む側は理解しやすいです。(なぜ削除でなく、コメントアウトしたのか?たとえば、「//driveF(220);」の行を削除するのではなく、コメントアウトしたのはなぜか。) -- こさか? 2009-07-17 (金) 03:39:49
  • ロボットの説明も詳しいですし、プログラムの方もいろいろとチャレンジしています。まだならっていなかったはずのifを使って、右に曲がるのと左に曲がるのを一つにまとめているのは面白いと思います -- FI? 2009-07-24 (金) 14:09:31


添付ファイル: file22052009.jpg 245件 [詳細] filesmall7247.JPG 236件 [詳細] filesmall7241.JPG 242件 [詳細] filesmall7233.JPG 251件 [詳細] filesmall7234.JPG 241件 [詳細] filesmall7236.JPG 252件 [詳細] filerobotSmall1.JPG 235件 [詳細] filerobotSmall1.bmp 130件 [詳細] fileDSC07256.JPG 141件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-24 (金) 17:50:19 (3681d)