目次 #contents *課題について [#t84a4a10] 詳細はこちら[[2019a/Mission1]] なお、書く文字は「松本」とした *ロボットについて [#te2e297b] ロボットの動きについて,まずx軸・y軸・z軸の3種類の軸を定義しそれぞれの方向に直進するようにモーターの向きを決定した.字を書く平面(紙上)をxy平面としたため,x軸方向の移動で横線を,y軸方向の移動で縦線を書き,z軸で紙上からペン先が離れるようになる.ロボットの構造としてはそれぞれの軸方向に動くための3つのモータを搭載し,部品もモータを中心とした3つの部分から成っていると考えることができる #ref(image.png) **部品1について [#o83e8d44] この部分は5輪であり(部品の多い前方に2輪,中部に1輪,NXT本体を支える後方に2輪)地面を走りy軸方向の移動を行う **部品2について [#p6ec88db] 部品1上に設置されたレールを走りx軸方向への移動を行う **部品3について [#rf38b0df] 部品2に固定され部品2と共に移動する部品であり,先端にペンを設置しこの部品が駆動することでペン先が紙上に移動するようになっている なお,z軸に対してペンを複数回移動させるとペン先が持ち上がらない不具合が発生することが判明した.これは重力とモータ部品が原因であると考えた.モータ部品に対しては元々の仕様なためプログラムをこの不具合に合わせて調整することで対応する(詳細は次段落【プログラムについて】にて説明する) *プログラムについて [#o83be828] **基本動作 [#cdc40b59] 基本的に字を書く時に必要な動作は +「ペン先を紙上に下ろす」 +「ペン先を紙から離す」 +「x軸方向に移動する」 +「y軸方向に移動する」 この4つである.これらの動作を組み合わせて,あるいは同時に進行されることで字を書く.漢字は基本的に左→右,上→下へと線を引くのでこの2種類の線の引き方とペンの上げ下げ,また線を引いた後の移動(右→左,下→上)のプログラムを下記の通りそれぞれ一つの動作として定義した #define up(r) OnRev(OUT_A,30);Wait(r);Off(OUT_A); //上に持ち上げる #define down OnFwd(OUT_A,30);Wait(30);Off(OUT_A); //下げる #define line_x(s,r) down;OnFwd(OUT_B,20);Wait(s);Off(OUT_B);up(r);//x軸正方向に線を引く #define line_y(t,r) down;OnFwd(OUT_C,20);Wait(t);Off(OUT_C);up(r);//y軸正方向に線を引く #define move_x(s) OnRev(OUT_B,20);Wait(s);Off(OUT_B);//x軸負方向に移動する #define move_y(t) OnRev(OUT_C,20);Wait(t); Off(OUT_C);//y軸負方向に移動する なお,左→右をx軸正方向,上→下をy軸正方向として以後説明する.各線の長さについては駆動時間を変化させることで対応したためここではs,tが時間を表す.実際に線を引くときにはs,tに具体的な数値を入れる.(プログラムのupにも時間を変更できるようにrが使用されているが,これの理由ついては前段落【ロボットについて】で説明した不具合に関係するため,まとめて後述する) またx軸方向とy軸方向の移動を同時に行うことで斜めに線を引くことが可能である.そのため書く字「松本」に斜線が多いことも考慮し斜線もここに定義する #define line_xy(s,t,r) down;OnFwd(OUT_B,20);Wait(s);OnFwd(OUT_C,20);Wait(t);Off(OUT_BC);up(r);//左斜めに線を引く #define line__xy(s,t,r) down;OnRev(OUT_B,20);Wait(s);OnFwd(OUT_C,20);Wait(t);Off(OUT_BC);up(r);//右斜めに線を引く 6つの定義した動作をまとめると下の通りになる |動作名|プログラム名|内容| |動作1|up|ペンを持ち上げる| |動作2|down|ペンを下げる| |動作3|line_x(s,r)|x軸正方向に1000×s秒線をかく| |動作4|line_y(t,r)|y軸正方向に1000×t秒線をかく| |動作5|move_x(s)|x軸負方向に1000×s秒移動する| |動作6|move_y(t)|y軸負方向に1000×t秒移動する| |動作7|line_xy(s,t,r)|xy軸正方向に線を引く| |動作8|line__xy(s,t,r)|x軸負方向,y軸正方向に線を引く| また全段落の【ロボットについて】に説明があったように動作1,2を複数回行うとさせると動作2に対して1の動作が大きくなることが判明した.このため駆動時間・モータの出力を一定のままで字を書くプログラムを組んでいくと途中からペン先が紙から離れなかったり, 部品3のペンを固定している部品が上部へ強制的に上がってしまうことで部品2,3が部品1のレール上から離れてしまうといった事態が発生する. これを解消するため動作2は数値を固定にし,動作1を繰り返すごとに動作を大きくしペン先をより高く持ち上げることにした.変数rは初期値を50とし数回ごと+5の55として調整する **松の字 [#g0f950c3] 長さについて、まず1画目、2画目の十を基準に比を考えて長さを決定した。また部品1, 2では使用したタイヤが異なるためプログラム上で同じ時間回転するようにしても実際に書かれる線の長さは異なる.なおここでは(s,t)=(900,1000)とした 以下プログラムを記載するが上記の動作1〜6についての定義については省略する task main () { line_x(900,50);//1画目 move_x(450);//移動 move_y(250);//移動 line_y(1000,55);//2画目 move_y(750);//移動 line__xy(450,500,55);//3画目 move_x(450);//移動 OnFwd(OUT_B,20);Wait(450);Off(OUT_B);//移動 move_y(500);//移動 line_xy(450,250,50);//4画目(左側木へん完成) move_x(450);//移動 move_y(250);//移動(木へんの交点へ移動) OnFwd(OUT_B,20);Wait(900);Off(OUT_B);//5画目書き出し位置へ移動 line__xy(450,250,55);//5画目 move_x(450);//移動 OnFwd(OUT_B,20);Wait(450);Off(OUT_b);//移動 move_y(250);//5画目始点へ移動 OnFwd(OUT_B,20);Wait(450);Off(OUT_B);//移動 line_xy(450,250,50);//6画目 move_x(900);//移動 line__xy(450,250,55);//7画目前半 down; line_x(450,50);//7画目後半 move_x(225);移動 move_y(125);8画目始点へ移動 line_xy(450,250,55);8画目 } **本の字 [#f4a43044] 松の字の木へんと同じプログラムでs,tのみ変更した.以下松の字のプログラムと同様一部を省略して記載する.このときロボットは松の字の最終画を引き終わったところからスタートすることとしている. task main() { move_x(1000);//移動 OnFwd(OUT_B,20);Wait(1000);Off(OUT_B);//移動 move_y(625);//本の1画目始点へ移動 line_x(1800,53);//1画目 move_x(500);//移動 move_y(250);//移動 line_y(1000,50);//2画目 move_y(750);//移動 line__xy(900,625,50);//3画目 move_x(900);//移動 OnFwd(OUT_B,20);Wait(900);Off(OUT_B);//移動 move_y(625);//移動 line_xy(900,625,55);//4画目 move_x(1350);//移動 line_x(450,50);//5画目 } *まとめ [#j068f8fa] #ref(image2.png) どうしても斜めの線を引くときに部品2が不安定な状態となってしまい部品1から落ちてしまうことが多かった.また部品2,3の接続部も2つのパーツで繋いだのみであったため時折緩んで外れてしまうことがあった. プログラムに関しては数値を半分にしても引かれる線がきっちり半分にならず,また斜線もずれが大きかったので細かな調整と詳細なプログラムが必要だと感じた.