目次

お絵かきロボット

課題

お絵描きロボット

A3の紙に相棒の似顔絵を書くロボットを作成せよ。

メンバー

みのう・みさいづ

ロボットの製作

製作したロボット

ロボット画像1
ロボット画像2
  • 土台部分(足回り)はLEGOの説明書通り

工夫した点

  • 土台部分、本体及びペンの動作に関わるところは、それぞれ一体になっており、取り外し、組み立てが容易である。
    取り外した様子
  • ペンの動作部にウォームギアを使用して速度を落とし、制御しやすくした。
  • ウォームギアを使用したことにより、ペン側からの力はモータに伝わらないので、ペンが自然に下がったりしない。

今後改善すべき点

  • 土台部分と本体とのつながりが弱いので、その部分の強度を改善したい。
  • ペンの持ち方、動き方についても改善したい。
  • 動作させる場所によって動き方が変わり、出来た絵が歪んでしまうので、その点を改善したい。

プログラムの作成(みのう)

完成した似顔絵

完成した似顔絵(みのう)

作成したプログラム

#define FORTY_FIVE_DEG 52

int pen_can_up=0;
int pen_can_dw=1;

#define up_pen repeat(pen_can_up){OnRev(OUT_B);Wait(53);Off(OUT_B);}pen_can_up=0;pen_can_dw=1;
#define dw_pen repeat(pen_can_dw){OnFwd(OUT_B);Wait(50);Off(OUT_B);}pen_can_dw=0;pen_can_up=1;
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
#define go_back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);
#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 turn_left_f(t) OnRev(OUT_A);OnRev(OUT_C);Wait(65);OnRev(OUT_A);OnFwd(OUT_C);Wait(t);OnFwd(OUT_A);OnFwd(OUT_C);Wait(65);Off(OUT_A+OUT_C);
#define turn_right_f(t) OnRev(OUT_A);OnRev(OUT_C);Wait(65);OnFwd(OUT_A);OnRev(OUT_C);Wait(t);OnFwd(OUT_A);OnFwd(OUT_C);Wait(65);Off(OUT_A+OUT_C);

task main () {
	draw_outline();

	// begin move eye place
	go_back(100);
	turn_left(105);
	go_straight(90);
	// end move eye place
	draw_eye();

	// begin move hair place
	go_back(120);
	// end move hair place
	draw_hair();

	// begin move nose place
	go_straight(10);
	turn_right(110);
	go_straight(75);
	// end move nose place
	draw_nose();

	// begin move mouth place
	go_back(60);
	turn_left(110);
	go_straight(35);
	// end move mouth
	draw_mouth();
}

sub draw_outline() {
	dw_pen;
	go_straight(100);
	up_pen;
	turn_left_f(FORTY_FIVE_DEG);

	dw_pen;
	go_straight(40);
	up_pen;
	turn_left_f(FORTY_FIVE_DEG);

	dw_pen;
	go_straight(60);
	up_pen;
	turn_left_f(FORTY_FIVE_DEG);

	dw_pen;
	go_straight(40);
	up_pen;
	turn_left_f(FORTY_FIVE_DEG);

	dw_pen;
	go_straight(100);
	up_pen;
}

sub draw_eye() {
	dw_pen;
	go_straight(20);
	up_pen;

	go_straight(35);

	dw_pen;
	go_straight(20);
	up_pen;
}

sub draw_hair() {
	dw_pen;
	turn_left(210);
	up_pen;
}

sub draw_nose() {
	dw_pen;
	go_straight(25);
	up_pen;
}

sub draw_mouth() {
	dw_pen;
	go_straight(60);
	up_pen;
	turn_left_f(FORTY_FIVE_DEG);
	dw_pen;
	go_straight(10);
	up_pen;
}

工夫した点

  • ペンを2回以上連続で上げたり下げたりしないよう(ifを使って良いか分からなかったので)repeatを使った。
  • サブルーチンを使うことにより、それぞれの動作を容易にコメントアウトでき、途中から途中までの動作チェックを容易にした。

今後改善すべき点

  • 線の角のつなぎがうまくいかないので改善したい。
  • 髪がずれてしまっているのでその点を改善することと、量ももう少し増やしたい。
  • マクロを使用したせいか、プログラムの転送に時間がかかったので、その点を改善したい。

プログラムの作成(みさいづ)

完成した似顔絵

完成した似顔絵(みさいづ)

作成したプログラム

#define TURN_QUARTER OnFwd(OUT_A);OnRev(OUT_C);Wait(54);Off(OUT_A+OUT_C);//右に45度曲がる
#define TURN_HALF OnFwd(OUT_A);OnRev(OUT_C);Wait(120);Off(OUT_A+OUT_C);//右に90度曲がる
#define TURN_HALFandQUARTER OnFwd(OUT_A);OnRev(OUT_C);Wait(180);Off(OUT_A+OUT_C);//右に135度曲がる
#define TURN_QUARTERpeper OnFwd(OUT_A);OnRev(OUT_C);Wait(58);Off(OUT_A+OUT_C);//右に45度曲がる紙の上で
#define TURN_HALFpeper OnFwd(OUT_A);OnRev(OUT_C);Wait(108);Off(OUT_A+OUT_C);//右に90度曲がる紙の上で
#define pen_down OnFwd(OUT_B);Wait(55);Off(OUT_B);//ペン下げる
#define pen_up OnRev(OUT_B);Wait(55);Off(OUT_B);//ペン上げる
task main()
{   
   pen_down;  //髪書きスタート
   OnFwd(OUT_A+OUT_C);
   Wait(200);
   Off(OUT_A+OUT_C);
   pen_up;
   
   OnRev(OUT_A+OUT_C);
   Wait(60);
   Off(OUT_A+OUT_C);
   TURN_HALFandQUARTER;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(70);
   Off(OUT_A+OUT_C);
   
   pen_up;
   OnRev(OUT_A+OUT_C);
   Wait(60);
   Off(OUT_A+OUT_C);
   TURN_QUARTER;
   OnFwd(OUT_A+OUT_C);
   Wait(58);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(140);
   Off(OUT_A+OUT_C);//髪書き終わり
   
   pen_up;
   OnRev(OUT_A+OUT_C);//輪郭スタート
   Wait(60);
   Off(OUT_A+OUT_C);
   TURN_HALF;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(200);
   Off(OUT_A+OUT_C);
   
   pen_up;
   OnRev(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   TURN_QUARTERpeper;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   
   pen_up;
   OnRev(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   TURN_QUARTERpeper;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(80);
   Off(OUT_A+OUT_C);
   pen_up;
    
   OnRev(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   TURN_QUARTERpeper;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_up;
   
   OnRev(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   TURN_QUARTERpeper;
   OnFwd(OUT_A+OUT_C);
   Wait(65);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(140);
   Off(OUT_A+OUT_C);//輪郭終わり
   pen_up;
   
   OnRev(OUT_A+OUT_C);//目スタート
   Wait(170);
   Off(OUT_A+OUT_C);
   TURN_QUARTER;
   OnFwd(OUT_A+OUT_C);
   Wait(85);
   TURN_QUARTER;
   OnFwd(OUT_A+OUT_C);
   Wait(30);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(40);
   Off(OUT_A+OUT_C);
   pen_up;
   OnFwd(OUT_A+OUT_C);
   Wait(40);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(40);
   Off(OUT_A+OUT_C);//目終わり
   pen_up;
   
   OnRev(OUT_A+OUT_C);//鼻スタート
   Wait(135);
   TURN_HALF;
   OnFwd(OUT_A+OUT_C);
   Wait(80);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(50);
   Off(OUT_A+OUT_C);//鼻終わり
   pen_up;
   
   OnRev(OUT_A+OUT_C);//口スタート
   Wait(40);
   TURN_HALF;
   OnFwd(OUT_A+OUT_C);
   Wait(40);
   Off(OUT_A+OUT_C);
   pen_down;
   OnFwd(OUT_A+OUT_C);
   Wait(55);
   Off(OUT_A+OUT_C);
   pen_up;//口終わり
}

工夫した点

  • 紙の上とそうでない場合の時での曲がる時間を変えた。
  • マクロを使い、プログラムを簡略化した。

今後改善すべき点

  • プログラムがうまくまとめられず、長くなってしまい、またデータの転送に時間がかかった。
  • 線と線とのずれをうまく調節できなかった。

反省・感想

  • ペンの動作部の製作に時間をかけすぎてしまい、プログラムの調整の時間が足りなくなってしまった。今後は時間配分を考えて製作したい。また、今回は限られた部材でロボットを作るなどの様々な経験が出来たので、今後に生かしていきたい。(みのう)
  • 微調整がうまくいかず、時間を大幅に使ってしまった。プログラムを簡略化していれば、時間の節約になり、またうまく調節ができると思うので、その点を改善していきたいと思います。(みさいづ)

コメントをどうぞ

  • 拝見しました。とても解り易かったです。 -- ドドンパ? 2010-05-20 (木) 22:29:09
  • いろいろ工夫しています。
    ロボットが機能ごとにパーツにわかれるというのは、改良するときに楽でよいです。
    一つ目のプログラムは、ifを使わないでつくったペンが下がっている状態ではペンを下げる命令をしても下げないための工夫は面白いです。二人目のプログラムでも、紙の上とそれ以外で分けたのは注意深いと思います。特定の角度の回転をいくつか作っているみたいですが、最大公約数が45なので45°回転をつくってrepeatを用いれば、少し簡略化できるかもしれません。 -- FI? 2010-05-21 (金) 08:43:26
  • 良く工夫がされている所が多く見られます。プログラムについて色々試し、簡略化してみて下さい -- TAKA? 2010-05-21 (金) 14:02:04


添付ファイル: file100519parts.jpg 213件 [詳細] file100518robo.jpg 192件 [詳細] file100519face_d.jpg 179件 [詳細] file100519face_n.jpg 186件 [詳細] file100518lf.jpg 194件 [詳細] file100518lb.jpg 201件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-21 (金) 14:02:04 (3322d)