#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] 初めはもっと簡単にプログラミングができると高を括っていたが、車輪のモーターの速度が左右で異なることから始まり、思ったようにロボットを動かすことができずかなり苦労した。~ 同じプログラムを使っても、毎回微妙に似顔絵が異なってしまった。~ その原因が最後までわからず、改善できなかったことが悔しいと思う。~ 今回は単純な顔しか描けなかったが、いずれはもっと複雑な顔を描けるようしたい。~