目次 #contents *課題 [#b3dac50c] 自分の似顔絵を描く、お絵かきロボットを製作すること。~ 条件としては~ ・ペン以外はキットの部品を使うこと。~ ・プログラムはなるべく簡単に作ること。~ ・A4サイズの紙に収まる大きさにすること。~ である。~ [[(2016年前期/課題1より):http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission1]] *ロボットの説明 [#s126c317] #ref(2016a/Member/ryo/Mission1/image1.JPG,120%,ロボット本体) これがロボットの全体像。 #ref(2016a/Member/ryo/Mission1/image5.JPG,100%.タイヤ) ペンを持たせるため、タイヤを二個取り付け挟んだ。~ また、タイヤの片側をモータとつなげ、もう片方は空回りさせ、上下運動をできるようにした。 #ref(2016a/Member/ryo/Mission1/image3.JPG,120%,ロボット本体) タイヤだけではペンが安定しなかったため、タイヤ下に補助を取り付けた。~ ペンはタイヤ間の距離を考慮し、太さが合うペンを取り付けた。 *下書き [#fa9bc848] #ref(2016a/Member/ryo/Mission1/image1 (5).JPG,80%.下書き) できるだけロボットの移動距離が短くなるように順路を考えた。~ また、プログラミングのしやすさを考え、直角を多用できるように下書きした。~ 髪以外左右対称にしたため、移動距離などがプログラミングしやすかった。 *プログラムの説明 [#x04133ba] **定義の説明 [#v552995a] #define go_fwd(t) t秒間直進。 #define Turn_L #define Turn_R これらは直角に回転するよう定義したもの。~ ペンを上げ直角回転し、位置の修正、ペンを下げるまでを一つとした。~ Turn_Lが左回転、Turn_Rが右回転。 #define Turn_L_i #define Turn_L_ii #define Turn_L_iii これらは髪の毛を描くときに使った定義。~ それぞれ左回転をするが、回転時間を変え、角度を変えた。~ ペンを上げ直角回転し、位置の修正、ペンを下げるまでを一つとした。~ #define pen_up #define pen_down これらはペンの上下に関する定義。~ pen_upでペンを上げpen_downでペンを下げる。 **プログラム [#z44098e9] (行変更の際の記号が¥となっている) #define go_fwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC) //t秒直進 #define Turn_L pen_up;\ OnRev(OUT_AC);Wait(65);Off(OUT_AC);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(93);Off(OUT_AC);\ OnFwd(OUT_AC);Wait(62);Off(OUT_AC);\ //90度左回転 pen_down; #define pen_up OnFwd(OUT_B);Wait(15);Off(OUT_B); #define pen_down OnRev(OUT_B);Wait(15);Off(OUT_B); #define Turn_L_i pen_up;\ OnRev(OUT_AC);Wait(65);Off(OUT_AC);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(55);Off(OUT_AC);\ OnFwd(OUT_AC);Wait(65);Off(OUT_AC);\ pen_down; #define Turn_L_ii pen_up;\ OnRev(OUT_AC);Wait(65);Off(OUT_AC);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(68);Off(OUT_AC);\ OnFwd(OUT_AC);Wait(65);Off(OUT_AC);\ pen_down; #define Turn_L_iii pen_up;\ OnRev(OUT_AC);Wait(65);Off(OUT_AC);\ OnFwd(OUT_C);OnRev(OUT_A);Wait(160);Off(OUT_AC);\ OnFwd(OUT_AC);Wait(72);Off(OUT_AC);\ pen_down; #define Turn_R pen_up;\ OnRev(OUT_AC);Wait(65);Off(OUT_AC);\ OnFwd(OUT_A);OnRev(OUT_C);Wait(93);Off(OUT_AC);\ OnFwd(OUT_AC);Wait(62);Off(OUT_AC);\ //90度右回転 pen_down; task main() { repeat(2) { go_fwd(90); Turn_L; go_fwd(80); Turn_L; } //輪郭 pen_up; go_fwd(50); pen_down; Turn_L_i; go_fwd(29); Turn_L_ii; go_fwd(58); //髪の毛 Turn_L_iii; pen_up; go_fwd(24); pen_down; Turn_R; go_fwd(24); //右目 pen_up; go_fwd(10); pen_down; Turn_L; go_fwd(34); //口 Turn_L; pen_up; go_fwd(10); pen_down; go_fwd(24); //左目 } 輪郭部分でrepeatを使って簡略化することができた。~ 回転した後、位置のずれが起こるため、回転する際に後退、回転、前進の順に動かし、位置の修正を行った。~ ペンの上下、回転、位置の修正までを一つの定義にまとめ、プログラムを短くすることを心がけた。 *感想と考察 [#w8b136a8] *感想 [#w8b136a8] #ref(2016a/Member/ryo/Mission1/kao.JPG,100%.タイヤ) これが完成品。下書きに近い顔を描くことができたと思う。定義やrepeatを使い、簡略化できた。~ 回転の後、位置ずれが起こるため、後退・前進を使って修正したが、その時間を調節することが一番大変だった。~ 電池の減り具合でロボットのスピードも変わってしまうため、そこも苦戦した。~ 何度も繰り返し試験運転をしなければいけなかったため、大変ではあったが、その分、成功した時の達成感は大きかった。~ 次の課題も頑張りたい。