#contents *課題1 [#l3557eef] これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作せよ。 **選んだ文字 [#n085448b] 新潟の『上越』 *ロボットの説明 [#i4341026] #ref(./robot1.jpg,ロボット) 最初は前輪の前方にアームを取り付けていたが、ロボットを90度動かすプログラムを動かしても書ける字は直角とはならなかった。&br; そこで、アームを出来るだけタイヤに近づけるように作ろうとしたが、後ろのタイヤがうまく動かなかったり、うまくバランスがとれなかったりと写真のようなフォルムになるまで大変だった。&br; 完成したロボットでは、歯車が回転することによって筆が上下し、タイヤとタイヤの間に筆が位置しているため、曲がる動作と書ける字がしっかり一致するようになっている。&br; また、ロボット本体の位置も重心を考えて調整している。&br; また、曲がる角度の出力が電池の残量で変化してしまい、同じ電池では常に同じプログラムで動かすことはできなかった。&br; 後述のプログラムは新品の電池で3回程度動かすとちょうどうまく書けるようになった。 *プログラムの準備 [#r734f8da] #ref(./frame.png,プログラムを書く前の設計図) プログラムを書く前にどこから書き始めるか決めた。そしてその後どういう動きをさせるか考えた。出来るだけ90°の曲がりで書けるようにした。&color(#ff0000,){赤マル};がプログラム開始地点、&color(#008000,){緑};がペンを下ろしての動き、&color(#ffa500,){オレンジ};と&color(#ffc0cb,){ピンク};がペンをあげての動き。数字は直進する出力を示す。ただし最終的なプログラムでは全て1.2倍となっている。同じ長さとすぐにわかるものは省略している。 ***この工程の利点 [#i4893564] この設計図を作ることによりプログラムを書くスピードの向上(図を見ながらひたすら手を動かすだけだった),そして予期しない動きが出たときの原因即解明といったような成果があった。 *プログラム [#a3b3af49] **定義 [#e949f8b4] #define arm_down OnFwd(OUT_A,50);Wait(150);Off(OUT_A);&br; &size(20){アームを下げる}; #define arm_up OnRev(OUT_A,50);Wait(150);Off(OUT_A);&br; &size(20){アームを上げる}; #define go_straight OnFwd(OUT_B,40);OnFwd(OUT_C,41);&br; &size(20){直進}; #define turn_right OnFwd(OUT_C,45);OnRev(OUT_B,45);Wait(700);Off(OUT_BC);&br; &size(20){右に90度曲がる}; #define turn_left OnFwd(OUT_B,45);OnRev(OUT_C,45);Wait(700);Off(OUT_BC);&br; &size(20){左に90度曲がる}; **プログラム [#s59e2564] 以下プログラムの準備における画像の通り動くようなプログラムである&br; 後述の通り改善すべきプログラムとなった ***上 [#u0473301] task main() { arm_down go_straight Wait(450); Wait(450); //プログラムの準備における始点(オレンジの丸)から左方向に直進 Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(180); Off(OUT_BC); turn_left go_straight Wait(540); Wait(540); //上の縦棒を下から直進 Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(180); Off(OUT_BC); turn_left turn_left //↓上のうえの横棒を形成 go_straight Wait(120); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(120); Off(OUT_BC); Off(OUT_BC); // ↑ここまで turn_left go_straight Wait(360); Off(OUT_BC); turn_left turn_left //ここから上の下の横棒続き go_straight Wait(270); Off(OUT_BC); turn_right go_straight Wait(120); Off(OUT_BC); arm_up ***越 [#tdd2a1ae] turn_left turn_left //向きを変えて準備画像オレンジ線のように越のそうにょう下部分へ go_straight Wait(225); Off(OUT_BC); arm_down arm_down //越始点にたどり着いた go_straight Wait(630); Wait(630); //そのまままっすぐ右方向へ Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(360); Off(OUT_BC); turn_right turn_right //ここから走の縦棒 go_straight Wait(180); Off(OUT_BC); turn_right turn_right //横の突起部分 go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_right turn_right //ここから縦棒再開 go_straight Wait(450); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left turn_left //縦棒上から下へ go_straight Wait(720); Off(OUT_BC); turn_right turn_right //下の横棒へ go_straight Wait(180); Off(OUT_BC); turn_right turn_right //↓走の左下部分 go_straight Wait(180); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(360); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); arm_up Off(OUT_BC); //↑ここまで arm_up //筆をあげて走の横棒までオレンジの移動 go_straight Wait(450); Off(OUT_BC); turn_right turn_right //横棒のため向き転換 arm_down go_straight Wait(450); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(450); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); Off(OUT_BC);//ここまで走の真ん中横棒 arm_up go_straight go_straight //オレンジの移動 Wait(90); Off(OUT_BC); turn_right turn_right //向き転換 arm_down go_straight Wait(360); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(360); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); Off(OUT_BC); //ここまで走の上横棒 arm_up turn_left go_straight go_straight //ピンクの移動 Wait(570); Off(OUT_BC); arm_down; arm_down; //上下反転Lを形成 go_straight Wait(420); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(510); Off(OUT_BC); turn_left go_straight Wait(600); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(510); Off(OUT_BC); Off(OUT_BC); //ここまで arm_up go_straight go_straight //オレンジの移動 Wait(180); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); OnFwd(OUT_C,35); //斜めに回転// OnFwd(OUT_C,35); //斜めに回転 OnRev(OUT_B,35); Wait(700); Off(OUT_BC); arm_down go_straight go_straight //斜めの棒 Wait(600); Off(OUT_BC); turn_right turn_right //↓横切る棒 go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_right turn_right //↑ここまで go_straight Wait(180); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(180); Off(OUT_BC); turn_right turn_right //↓また横切る棒 go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); turn_right turn_right //↑ここまで go_straight Wait(600); Off(OUT_BC); turn_left go_straight Wait(90); Off(OUT_BC); Off(OUT_BC); //斜め棒終わり arm_up turn_left turn_left go_straight turn_left //180°くらい回転 go_straight //ピンク移動 Wait(180); Off(OUT_BC); arm_down go_straight go_straight //最後の点を正方形の要領で形成 Wait(90); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); turn_right go_straight Wait(90); Off(OUT_BC); arm_up } *書けた文字 [#y13eb1f8] #ref(./S__47513650.jpg,上越) 一応読める&ruby(漢字){感じ}; *改善すべきだったところ [#q63fa6d6] 電池残量の変化にも対応できるロボットにすべき&br; 出力が大きく,移動速度が速かったために電池の影響をより受けやすかったかもしれない&br; 文字の枠をなぞるように書くのではなくこまめにアームの上げ下げをする一線の字を書くべきだった(結果としてプログラムが非常に長くなってしまった)