目次

課題について

詳細はこちら2019a/Mission1

なお、書く文字は「松本」とした

ロボットについて

ロボットの動きについて,まずx軸・y軸・z軸の3種類の軸を定義しそれぞれの方向に直進するようにモーターの向きを決定した.字を書く平面(紙上)をxy平面としたため,x軸方向の移動で横線を,y軸方向の移動で縦線を書き,z軸で紙上からペン先が離れるようになる.ロボットの構造としてはそれぞれの軸方向に動くための3つのモータを搭載し,部品もモータを中心とした3つの部分から成っていると考えることができる

image.png

部品1について

この部分は5輪であり(部品の多い前方に2輪,中部に1輪,NXT本体を支える後方に2輪)地面を走りy軸方向の移動を行う

部品2について

部品1上に設置されたレールを走りx軸方向への移動を行う

部品3について

部品2に固定され部品2と共に移動する部品であり,先端にペンを設置しこの部品が駆動することでペン先が紙上に移動するようになっている

なお,z軸に対してペンを複数回移動させるとペン先が持ち上がらない不具合が発生することが判明した.これは重力とモータ部品が原因であると考えた.モータ部品に対しては元々の仕様なためプログラムをこの不具合に合わせて調整することで対応する(詳細は次段落【プログラムについて】にて説明する)

プログラムについて

基本動作

基本的に字を書く時に必要な動作は

  1. 「ペン先を紙上に下ろす」
  2. 「ペン先を紙から離す」
  3. 「x軸方向に移動する」
  4. 「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つの定義した動作をまとめると下の通りになる

動作名プログラム名内容
動作1upペンを持ち上げる
動作2downペンを下げる
動作3line_x(s,r)x軸正方向に1000×s秒線をかく
動作4line_y(t,r)y軸正方向に1000×t秒線をかく
動作5move_x(s)x軸負方向に1000×s秒移動する
動作6move_y(t)y軸負方向に1000×t秒移動する
動作7line_xy(s,t,r)xy軸正方向に線を引く
動作8line__xy(s,t,r)x軸負方向,y軸正方向に線を引く

また全段落の【ロボットについて】に説明があったように動作1,2を複数回行うとさせると動作2に対して1の動作が大きくなることが判明した.このため駆動時間・モータの出力を一定のままで字を書くプログラムを組んでいくと途中からペン先が紙から離れなかったり, 部品3のペンを固定している部品が上部へ強制的に上がってしまうことで部品2,3が部品1のレール上から離れてしまうといった事態が発生する. これを解消するため動作2は数値を固定にし,動作1を繰り返すごとに動作を大きくしペン先をより高く持ち上げることにした.変数rは初期値を50とし数回ごと+5の55として調整する

松の字

長さについて、まず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画目
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画目
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画目
  }

本の字

松の字の木へんと同じプログラムでs,tのみ変更した.以下松の字のプログラムと同様一部を省略して記載する.このときロボットは松の字の最終画を引き終わったところからスタートすることとしている.

 task main()
{
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画目
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画目
}

まとめ

image2.png

どうしても斜めの線を引くときに部品2が不安定な状態となってしまい部品1から落ちてしまうことが多かった.また部品2,3の接続部も2つのパーツで繋いだのみであったため時折緩んで外れてしまうことがあった. プログラムに関しては数値を半分にしても引かれる線がきっちり半分にならず,また斜線もずれが大きかったので細かな調整と詳細なプログラムが必要だと感じた.


添付ファイル: fileimage2.png 6件 [詳細] fileimage.png 10件 [詳細] file無題92.png 3件 [詳細] fileIMG_3520.jpg 2件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-06-09 (日) 15:29:24 (76d)