#contents
*はじめに [#pd674da9]
課題は似顔絵を描くロボットの製作である。~

注意点は、~
・ マクロや関数、サブルーチンなどを使い、main関数がなるべく単純になるようにプログラムを作ること。~
・ 定数名やマクロなどは分かりやすい名前を用いること~
・ 余裕をもってA4の紙の中に収まる大きさにすること。いくら小さくてもよい。~
・ ペン以外はキットの部品を使うこと~
・ 輪ゴムは切れやすく高価なので慎重に扱い、張力がかかりすぎないようにすること。~

([[2016年度前期 課題1:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission1]]より)
*ロボットの説明 [#e151420e]
#ref(DSC_0731.png)~
~
#ref(DSC_0733.png)~
サンプルのロボットにペンを持つためのアームを取り付けた。~
輪ゴムは使用していないが、しっかり固定されるように工夫した。~
輪ゴムは使用していないが、できるだけ少ない部品でしっかり固定されるように工夫した。~
*プログラムの説明 [#lb1e430b]
**プログラム [#h6e3fdb7]
 #define turn_left(t,w1,w2) OnFwd(OUT_A,w1); OnRev(OUT_C,w2); Wait(t);Off(OUT_AC); //左に曲がる
 #define turn_right(t,w1,w2) OnFwd(OUT_C,w1); OnRev(OUT_A,w2); Wait(t);Off(OUT_AC); //右に曲がる
 #define pen_up OnFwd(OUT_B,8);Wait(1000);Off(OUT_B); //ペン先を上げる
 #define pen_down OnRev(OUT_B,8);Wait(1010);Off(OUT_B); //ペン先を下げる
 #define go_rev(t,s1,s2) OnRev(OUT_A,s1); OnRev(OUT_C,s2); Wait(t); Off(OUT_AC); //後退する
 #define go_fwd(t,s1,s2) OnFwd(OUT_A,s1);OnFwd(OUT_C,s2);Wait(t);Off(OUT_AC); //前進する
 #define nouse turn_right(300,30,30);go_fwd(200,30,30); //鼻を描く
 #define en1 OnFwd(OUT_A,20);OnFwd(OUT_C,50);Wait(5500);Off(OUT_AC); //輪郭を描く
 #define mayu pen_down;go_fwd(300,40,45);pen_up;go_fwd(500,40,40);pen_down;go_fwd(300,40,40);pen_up; //眉を描く
 #define kami OnRev(OUT_A,30);Wait(400);Off(OUT_AC);OnRev(OUT_C,30);Wait(400);Off(OUT_AC); //髪を描く
 #define eye pen_down;turn_right(200,20,20);pen_up;turn_left(200,20,20);go_fwd(500,50,65);pen_down;turn_right(200,20,20);pen_up; //目を描く
 task main(){
        pen_up ;
	pen_down ;
	en1 ;
	pen_up ;
	pen_down;
      repeat(6){
	kami;
       }
	pen_up;
	turn_right(300,50,50); //移動
	go_fwd(500,50,50);
	pen_down;
	go_fwd(350,40,40); //口を描く
	pen_up;
	go_rev(500,50,50); //移動
	turn_left(300,30,30);
	go_fwd(300,40,40)
	pen_down;
	nouse;
	pen_up;
         go_rev(400,40,40); //移動
	turn_left(200,40,40);
	eye;
         go_rev(600,50,65); //移動
         mayu;
 }
**工夫したところの説明 [#f8495715]
 #define turn_left(t,s1,s2) OnFwd(OUT_A,s1); OnRev(OUT_C,s2); Wait(t);Off(OUT_AC); //左に曲がる
 #define turn_right(t,s1,s2) OnFwd(OUT_C,s1); OnRev(OUT_A,s2); Wait(t);Off(OUT_AC); //右に曲がる
 #define go_rev(t,s1,s2) OnRev(OUT_A,s1); OnRev(OUT_C,s2); Wait(t); Off(OUT_AC); //後退する
 #define go_fwd(t,s1,s2) OnFwd(OUT_A,s1);OnFwd(OUT_C,s2);Wait(t);Off(OUT_AC); //前進する
左右でモーターの速度が異なったので、その都度調整ができるよう時間と左右の速度を変数とした。~
 #define pen_up OnFwd(OUT_B,8);Wait(1000);Off(OUT_B); //ペン先を上げる
 #define pen_down OnRev(OUT_B,8);Wait(1010);Off(OUT_B); //ペン先を下げる
筆圧を下げないために、若干ペン先を下す時間を変えた。~
 #define kami OnRev(OUT_A,30);Wait(400);Off(OUT_AC);OnRev(OUT_C,30);Wait(400);Off(OUT_AC); //髪を描く
この動きを6回繰り返すことで前髪を作った。~
**完成した似顔絵 [#cba615a5]
#ref(DSC_0737.png)
鉛筆で描いたので少し見づらいかもしれない。~
*反省・感想 [#vbf3dbde]
**反省点 [#wd0815a8]
・横にペンを付けたせいで、ペンの移動先の予測が困難になり多角形が作れなかった。~
・ペンと紙の摩擦の影響か、輪郭の円がいつも同じように描くことができず、運任せになってしまった。~
・やはり途中から筆圧が変わってしまい、後半は線が薄くなったりしてしまった。~
**感想 [#gac1478e]
初めはもっと簡単にプログラミングができると高を括っていたが、車輪のモーターの速度が左右で異なることから始まり、思ったようにロボットを動かすことができずかなり苦労した。~
同じプログラムを使っても、毎回微妙に似顔絵が異なってしまった。~
その原因が最後までわからず、改善できなかったことが悔しいと思う。~
今回は単純な顔しか描けなかったが、いずれはもっと複雑な顔を描けるようしたい。~

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