[[2008b/A2/課題1/メンバーページへ:http://yakushi.shinshu-u.ac.jp/robotics/?2008b%2FA2]]

*目次 [#p14a0371]

#contents

*課題1/似顔絵を作成する [#l9f49ea1]

**1課題の概要 [#laef7acc]

A3の用紙に相棒の似顔絵を作成するロボットを作成せよ。
 

**2ロボット本体の制作過程 [#rcc5b998]

***土台構成について [#b06a3ad2]

~土台となる部分は作成用の本に書いてあった四輪のタイプを使用した。
~土台の部分には特に手を加えず、そのままの形で製作。

***ペンを持たせる部分について [#dd15e398]

~ここの部分には過去の作品のアイディアを一部使用しながらも二人で話し合いながら工夫し、完成。予定よりもかなり少ない部品でつくることに成功した。&br;主な工夫点については後に記載する。
**3ロボット本体の完成 [#wd6ff4c6]

完成したロボットがこちら
~正面~
#ref(081105_1817~02.jpg,nolink)

~真上から~
#ref(081105_1817~01.jpg,nolink)

***主な工夫点 [#k2f9f5e3]

~ペンを動かすにはギアを使って上下に移動する方法を採用。&br;
様々なギアを使い横向きに回転する動力を縦につたえることができた。&br;
少々雑ではあるが簡単な絵で仕組みを説明すると、&br;
#ref(sikuni002.jpg,nolink)
&br;
また、なるべく少ない部品で組み立てることで、小型化することができた。
***ロボットの欠点と改善に向けて [#x6a8730d]

~このロボットの弱点、言い換えれば改良すべき点は、非常に衝撃に弱いことである。&br;毎回ロボット(特にアームの部分)をばらして持ち帰らなければ簡単にパーツがばらばらになってしまう点である。
&br;全体的に前のほうにパーツが多い所為か前に重心がかかっているらしく、アームの部分だけが外れることもよくある。
&br;また、ペンがしっかりと固定できていないため、直線がしっかり描けず、ふにゃふにゃした線になってしまうことである。&br;
なので改良すべき点は重心の位置をなるべくロボットの土台まで持ってくること、パーツが外れないよう補強すること、ペンの固定の強化である。
&br;だからといってパーツを多く使いすぎれば小型の意味がなくなってしまうので難しいところである。
**4ロボットのプログラム [#ya63dbaf]

***その1 [#r8891161]
~作成者 ちん
  #define A OUT_A   //OUT_AをAで省略できるようにする。
  #define C OUT_C    //OUT_CをCで省略できるようにする。
  #define TURN 92    //90度曲がるのに必要なおおよその時間
  #define B OUT_B  //OUT_BをBで省略できるようにする。
  sub turn_left()  //左に曲がるためのサブルーチン
  {
	OnFwd(A); OnRev(C);
	Wait(TURN);
	Off(A+C);
  }
  
  
  sub turn_right() //右に曲がるためのサブルーチン
  {
	OnFwd(C); OnRev(A);
	Wait(TURN);
	Off(A+C);
  }
  
  
  task main()
  {
	OnRev(B); Wait(60);//1 
	Off(B);
	OnFwd(A); OnRev(C);  
	Wait(385);
	Off(A+C);
	OnFwd(B); Wait(60);
	Off(B);
  	
  	
	OnRev(A+C);   //2
	Wait(35);
	Off(A+C);
	OnRev(B); Wait(65);
	Off(B);
	OnRev(A+C); Wait(20);
	Off(A+C);
	OnFwd(B); Wait(60);
	Off(B);
    	
	OnRev(A+C);  //3
	Wait(5);
  	
	turn_right();  //4
  	
	OnFwd(A+C);  Wait(100);  //5
  	
	turn_left();  //6
  	
	OnFwd(A+C);  Wait(35); //7
  	
	turn_left();  //8
  	
	OnFwd(A+C); Wait(5);  //9
	Off(A+C); 
	OnRev(B); Wait(65);
	Off(B);
	OnFwd(A+C); Wait(20);
	Off(A+C); 
	OnFwd(B); Wait(60);
	Off(B);
	OnFwd(A+C); Wait(10);
	Off(A+C);
	OnRev(B); Wait(65);
	Off(B);
	OnFwd(A+C); Wait(20);
	Off(A+C);
	OnFwd(B); Wait(60);
	Off(B);
	OnFwd(A+C);Wait(100);
  	
	turn_right(); //10
  	
	OnFwd(A+C); Wait(65); //11
  	
	turn_right();  //12
  	
	OnFwd(A+C); Wait(10); //13
	Off(A+C);
  	
	OnRev(B); Wait(65); //14
	Off(B);
  	
 	repeat(3)  //15
	  	{
  		OnFwd(OUT_A); Wait(10);
  		Off(OUT_A);
  		OnFwd(OUT_C); Wait(10);
  		Off(OUT_C);
  		}           
  	
  	Off(A+C);  //16
  	OnFwd(B); Wait(65);
  	Off(B);
   }
   		//終了

このプログラムで描いた似顔絵がこちら~
#ref(Image001.jpg,nolink)

~どうやって描いたか簡単な絵でまとめました。&br;
#ref(nigaoe001.jpg,nolink)

その1制作者のコメント

~【工夫した点】
~ただ直線と円だけで似顔絵を描くのは味気ないと思い、口の部分をジグザグにした。&br;描いてみると思ったよりもうまくジグザグが表現できていてよかった。&br;プログラム面ではサブルーチンを使用。なるべく見やすいように簡略化を計った。&br;
また、見やすくするだけではなくOUT_AなどをdefineでAと置くことにより、製作時間もわずかながら短縮化を計った。
~【苦労した点】
~始めはロボットに中心にペンがあるときに描くようなプログラムを作ってしまい、&br;後でペンが前にあることを考慮して作らないといけないことが発覚。
また一から作り直すのが特に苦労した。&br;また、ペンが前にあるとこを考慮してプログラムを組んでも予想と結構違った動きをするので何度も修正するのに苦労した。
~【今後の課題】
今後の課題としてはもう少し目と口の位置を調整して離れすぎないように描くようプログラムを修正したい。&br;また毎回描くたびに違った絵を描いてしまうことが多いので、同じ絵が描けるよう本体も共に修正、改良を加えていきたい。
***その2 [#z70c203c] 
~作成者(しゅう)



 #define a OUT_A  
 #define b OUT_B 
 #define c OUT_C 
 int m;
 int l;
   
 sub cercle() //円を描く
 {
	OnFwd(a ); OnRev(c); Wait(m);
	}
 
 sub draw_left() //左目を描く
 {	
 	
	OnFwd(a); Wait(20);
	Off(a);
	OnRev(b); Wait(30+5);
	Off(b);
	OnFwd(a);Wait(40);
	OnFwd(b);Wait(30+5);
	Off(b);
	Off(a);
	OnRev(a); Wait(l+20);
	Off(a);
	OnRev(a + c); Wait(l);
	Off(a+c);Wait(0);
	}
 
 sub draw_right() //右目を描く
 {
 	
	OnFwd(c); Wait(l);
	Off(c);
	OnRev(b); Wait(l+5);
	Off(b);
	OnFwd(c);Wait(l+10);
	OnFwd(b);Wait(l+5);
	Off(b);
	Off(c);
	OnRev(c); Wait(l+20);
	Off(c);
 	
	}
 
 sub back() //機体をバックさせる
 {
	OnRev(a + c); Wait(l);
	}
 sub st() //機体を静止させる
 {
	Off(a+c);Wait(0);
 }
 sub penup() //ペンを上げる
 {
	OnFwd(b);Wait(l+10);
	Off(b);
 }
 sub pendown() //ペンを下げる
 {
  	OnRev(b); Wait(l+10);
  	Off(b);
 	}
 task main()
 {  	 
 	m = 375;
 	l = 30;
 	
 	pendown();
 	cercle();
 	penup();
 	OnRev(a + c); Wait(l+10);
 	st();         // ここまでで、顔の輪郭を描く
 	
 	draw_left();
 	st();	//左目を描く
  	
 	draw_right();
 	st();	//右目を描く
 
 	OnRev(a + c); Wait(l);
 	st();
  	pendown();
	back();
 	penup();
  	st(); 	//鼻を描く
 	
 
 	
 	OnFwd(a ); OnRev(c); Wait(190);
 	Off(a + c);
 	OnRev(a + c); Wait(l*4);
 	OnFwd(c); Wait(l *2);
 	Off(c);
 	pendown();
 	OnFwd(a ); OnRev(c); Wait(l*3);
 	st();	
 	penup();
 	st();	//口を描く
 		 
 	back();
 	st();	//終了
 	
 	}
上記のプログラムの似顔絵描き順を書いてみました。
#ref(無題.JPG,nolink)
それで出来上がった作品が、これです。
#ref(081105_1921~01.jpg,nolink)
その2制作者のコメント
~【工夫した点】
サブルーチンやdefineを使い、出来るだけ繰り返しをなくすようにした。
~【苦労した点】
目や口は、円(顔の輪郭)を描いてから描くプログラムを組んだので、Waitの時間を制御するのに苦労しました。
~【今後の課題】
機体は、ペンの設置部分をより強度があるものにしたい。
プログラムは、サブルーチンは確かに便利だったが、Waitもサブルーチンの中に組み込んでしまった。&br;なので、Wait時間が微妙に違うところは、新たにプログラムを書かないといけなかった。それも、関数みたいに表せたらより楽にプログラムを組むことが出来ると思いました。
*コメント [#pd858ac7]
コメントがあればどうぞ
- わかりやすくていい感じです。この調子でがんばってください -- [[なかむら]] &new{2008-11-12 (水) 16:59:47};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS