[[2015a/Member] * 課題内容 [#r7252e96] ** 書道ロボット [#c49fa0f3] 各自の名前の中の一文字(7画以上)をA4用紙に書く.私は「垣」という文字を書くことにした. *** 注意点 [#qc1c573f] -マクロや関数,サブルーチンなどを使い,main関数がなるべく単純になるようにプログラムを作ること. -定数名やマクロなどは分かりやすい名前を用いること. -余裕をもってA4の紙の中に収まる大きさにすること.読める範囲ならばいくら小さくてもよい. -ペン以外はキットの部品を使うこと. -輪ゴムは切れやすく高価なので慎重に扱い,張力がかかりすぎないようにする. [[課題1>2015a/Mission1]]参照 * 目次 [#u1067348] #contents * ロボット本体 [#gcfb165d] ** 全体 [#r341cea1] モーターを3つ使い,縦の動き(青矢印),横の動き(黄矢印),ペンの上下(赤矢印)ができるようにロボットを組み立てた. #ref(./DSC_0104_001 (2).jpg,20%) ** 縦の動き [#de8dde34] 一つのモーターで左右のタイヤを動かすため,写真のようにギアを組み合わせた. また,曲がる必要がないから前輪を二つ取り付け本体を安定させた. #ref(./DSC_0131 (2).JPG,10%) ** 横の動き [#f16a8b61] このロボットの仕組みでは,ペンの取り付け部が地面と平行に移動しなければならない.そのため,写真のようにラックギアを使って平行移動を可能にした. #ref(./DSC_0110 (2).JPG,10%) 本体に取り付けることができないから,実際に文字を書くときにどうやって安定させるかが問題だった. そこで,土台を作りその上を滑らせてみることにした. 土台にはブロックが引っかからない部品を使った. #ref(./DSC_0123 (2).JPG,10%) 組み合わせると次のようになる. &ref(./DSC_0126 (2).JPG,10%); &ref(./DSC_0124 (2).JPG,10%); ** ペンの上下 [#ue11fe42] 写真のように.ペンをギアの回転で地面からペンを離したり,つけたりする. #ref(./DSC_0113 (2).JPG,10%) * プログラム [#g10520a3] ** 定数 [#u9bdca39] PEN_TIMEでペンを上げ下げする時間を定義し,WAIT_TIMEでロボットの動作を安定させるためにそれぞれの動作の間に「間」を作った. #define PEN_TIME 3 #define WAIT_TIME 20 ** マクロ [#te698e20] side_go(t),side_back(t)で横の動き,length_go(t),length_back(t)で縦の動きをマクロで定義し,引数を取った. #define side_go(t) OnFwd(OUT_B);Wait(t);Off(OUT_B);Wait(WAIT_TIME); #define side_back(t) OnRev(OUT_B);Wait(t);Off(OUT_B);Wait(WAIT_TIME); #define length_go(t) OnFwd(OUT_C);Wait(t);Off(OUT_C);Wait(WAIT_TIME); #define length_back(t) OnRev(OUT_C);Wait(t);Off(OUT_C);Wait(WAIT_TIME); ** サブルーチン [#g1fd70ad] ペンの上げ下げのプログラムは多く使用するためサブルーチンを使った.ここでペンを動かす時間に定数PEN_TIMEを使っている. sub down_pen() { OnRev(OUT_A);Wait(PEN_TIME);Off(OUT_A); //ペンを上げる Wait(WAIT_TIME); } sub up_pen() { OnFwd(OUT_A);Wait(PEN_TIME);Off(OUT_A); //ペンを下げる Wait(WAIT_TIME); } また,プログラムの中で一番苦労したのは3画目の斜めの線だ. 最初は斜めを書くには,ペンを置いて縦と横を同時に動かせば斜め線が引けると思っていたが、これでは横の動きに比べ,縦のタイヤが動作するのが遅いため曲線になってしまった. そこでペンを置かずに縦と横を同時に動かして勢いをつけてからペンを置き,そのまま縦と横を動かし続けた. プログラムが複雑になってしまったが,このプログラムで斜めの線を描くことができた. sub naname() { OnFwd(OUT_C);OnFwd(OUT_B);Wait(8); //斜めに勢いをつける OnRev(OUT_A);Wait(PEN_TIME);Off(OUT_A); //斜めに動きながらペンを固定 Wait(3);Off(OUT_BC); //斜めを描く OnFwd(OUT_A);Wait(PEN_TIME);Off(OUT_A); } ** 書き順 [#k3dad481] このロボットでは横線を右から左に書くのと,左から右に書くのでは少し傾きが違い同じ線が引けなかった. 今回の課題では書き順は指定されていないが,書き順通りにプログラムした(個人的にこだわりたかったからという理由もある). 書き順通りにすれば横線を左から右に統一でき,同じ線が引けるようになった. ** main関数 [#s7cf0e51] task main() { down_pen();side_go(7);up_pen(); //一画目 length_go(5);side_back(3); down_pen();length_back(13);up_pen(); //二画目 side_back(17);length_back(8); naname(); //三画目 length_go(2);side_go(3); down_pen();side_go(8);up_pen(); //四画目 side_back(8);length_back(6); down_pen();length_back(10);up_pen(); //五画目 length_go(10); down_pen();side_go(8);length_back(12);up_pen(); //六画目 side_back(8);length_go(7); down_pen();side_go(8);up_pen(); //七画目 side_back(8);length_back(5); down_pen();side_go(8);up_pen(); //八画目 side_back(9);length_back(5); down_pen();side_go(11);up_pen(); //九画目 } * 「垣」を書く [#g961c2c4] まず文字を書く前にロボットの初期状態を確認しなければならない. 部品同士が摩擦を起こしすぎていないか,ペンの高さは低すぎないか高すぎないか. それと横の動きをする部品は少し出した状態から始めなければならない. 確認を怠るとへんとつくりが合体してしまったりバランスの悪い文字になったりする. 確認をしてから書いてみると右図のようになる. &ref(./DSC_0134 (2).JPG,10%,right); 納得のいくバランスの良い文字が書けた. * まとめと反省 [#yfdea09a] ギア比を調節して速さを変えることをしていないから,それぞれの部分で同じ分モーターを動かしても速さが大きく異なるという問題があった. 今回はプログラムの方をロボットに合わせたが、細かくプログラミングするよりも,安定したロボットを作った方がよいことが分かった.