[[2018a/Member]]

書道ロボット

*課題 [#r3439b87]
**課題の内容 [#tcf6d48e]
これまで住んだことのある都道府県名,市町村名,地区名などの中から2文字以上のものを選び,それをA4の紙を書くロボットを製作せよ.
**選んだ文字 [#k42737f7]
私は埼玉県出身なので,「埼玉」という文字を書くことにした.

*ロボット本体の説明 [#nd70e026]
#ref(IMG_2047 (1).jpg)
ロボットの全体図
**前後移動 [#abbb9ff9]
最初は床をタイヤで移動するように製作していたが,紙の上を移動する際に紙が巻き込まれるトラブルが発生したため,前後移動はそれを防ぐようにレールの上をタイヤで移動するようにした.
**左右移動 [#ff8b125e]
#ref(IMG_2046 (1).jpg)
ギアの歯のブロックを細長い板のブロックの上側に付けたものをモータで左右に動かすようにした.
**アーム部分 [#xb8c5f9a]
#ref(IMG_2045.png)
ペンはゴムで固定し,アームの上下にもゴムを利用している.アームとモータの接続部分が一箇所だと上下移動の際にブレが生じたため接続部分を二箇所にした.また,アームが地面から離れても上下移動の際にブレが生じたため,地面とアームの距離を短くした.
*プログラムの説明 [#m5331874]
**文字の説明 [#b95443de]
#ref(IMG_2054 (1).jpg)
#ref(IMG_2053 (1).jpg)
図をみて分かる通り,漢字にいくつかの点が打ってあるが,これは点ごとに座標と番号を決め,番号の順にアームを移動させてそれに合わせてアームを上下するようにプログラムを組んだためである.
**プログラム概要 [#m9e229ae]
今回は誰でも簡単に使えるようにするためx,y座標型で組むことにした.

mx,myに値を代入して上下左右の移動,mxyr,mxylに値を代入してそれぞれ右斜め,左斜めのアームの移動を行った.mxyr,mxylに代入する値はそれぞれの点のx座標で,それによって斜め上,斜め下の移動も値の大きさのみで変えられるようになった.しかし,斜め移動の設定をそのようにしたため,斜め移動の角度を変更することができないというのが欠点であり,課題でもある.
 #define d OnFwd(OUT_C);Wait(60);Off(OUT_C);//ペンを下げる
 #define u OnRev(OUT_C);Wait(60);Off(OUT_C);//ペンを上げる
ペンの上下に関する定義
 #define mx(a)\
        if (a-x>0) {OnFwd(OUT_A);Wait(a-x);Off(OUT_A);x=a;}\
        else  {OnRev((OUT_A);Wait(x-a);Off(OUT_A);x=a;}
x座標の移動に関する定義
 #define my(b)\
        if (b-y>0) {OnFwd(OUT_B);Wait(b-y);Off(OUT_B);y=b;}\
        else {OnRev(OUT_B);Wait(y-b);Off(OUT_B);y=b;}
y座標の移動に関する定義
 #define mxyr(r)\
        if (r-y>0) {OnRev(OUT_A);OnFwd(OUT_B);Wait(r-y);Off(OUT_AB);x=x+y-r ;y=r;}\
        else {OnRev(OUT_AB);Wait(y-r);Off(OUT_AB);x=x-y+r;y=r;}
右斜めの移動に関する定義
 #define mxyl(l)
        if (l-y>0) {OnFwd(OUT_AB);Wait(l-y);Off(OUT_AB);x=x-y+l;y-l;}\
        else {OnFwd(OUT_A);OnRev(OUT_B);Wait(y-l);Off(OUT_AB);x=x+y-l;y=l;}
左斜めの移動に関する定義
 task main()
 {
   int x=0;
   int y=0;
   int r=0;
   int l=0;
   mx(220);
   my(220);//「埼」1に移動
   d;
   mx(180);//2
   mx(200);//3
   my(240);//4
   my(180);//5
   u;
   mxyl(160);//6
   d;
   mxyr(200);//7
   u;
   mx(100);
   my(220);//8
   d;
   mx(20);//9
   u;
   mx(60);
   my(240);//10
   d;
   mxyr(200);//11
   u;
   mxyr(220);//12
   d;
   mxyr(200);//13
   u;
   mx(100);
   my(180);//14
   d;
   mx(20);//15
   u;
   mx(40);//16
   d;
   my(120);//17
   mxyl(140);//18
   u;
   mx(100);
   my(170);//19
   d;
   my(150);//20
   mx(60);//21
   my(170);//22
   mx(100);//23
   u;
「埼」のプログラム
   mx(200);
   my(110);//「玉」1に移動
   d;
   mx(40);//2
   u;
   mx(180);
   my(60);//3
   d;
   mx(60);//4
   u;
   mx(200);
   my(10);//5
   d;
   mx(40);//6
   u;
   mx(120);
   my(110);//7
   d;
   my(10);//8
   u;
   mx(120);
   my(110);//7
   d;
   my(10);//8
   u;
   mx(100);
   my(50);//9
   d;
   mxyr(30);//10
   u;
 }
「玉」のプログラム
**プログラムの書き方の例 [#k7d976a1]
例として次のような図形を描くとする.
#ref(DSC_0286.png)
座標は画像のxy座標図の数値を参照

この図形は
 mx(80);
 my(230);
 d;
 mxyl(220);
 mx(180);
 mxyr(200);
 u;
このプログラムで描くことができる.

それぞれmx(80)はx座標の80へ行けという指示.

my(230)はy座標の230へ行けという指示.

dはペンを下ろせという指示.

mxyl(220)は左斜めにy座標の220へ行けという指示.

mxyr(200)は右斜めにy座標の200へ行けという指示.

uはペンを上げろという指示である.これらの定義を活用すれば,ある程度の文字や図形を書くプログラムを誰でも比較的簡単に書くことができるはずだ.
**工夫した点,苦労した点 [#x7d5a425]
最初に書いた通り誰でも簡単に使えるようにするためにx軸,y軸の数値を入力するだけでその場所に行けるような定義を作った.ペンの現在地を変数に記憶させ,入力された値で逆算することによって移動距離を導き出す仕組みになっている.が,その計算結果でマイナスの値が出ると移動距離を時間で制御しているので,もちろん不具合が出てしまった.そこで資料を参考にif構文を使い,マイナスの値が出るときには計算結果が正の値になるよう式にマイナス1をかけ,モーターを逆回転さることで,マイナスの値にも対応させた.

例
 #define mx(a) \//x軸移動
  if (a-x>0) {OnFwd(OUT_A);Wait(a-x);Off(OUT_A);x=a;}\
  else {OnRev(OUT_A);Wait(x-a);Off(OUT_A);x=a;}
「x」が現在地で,「a」が今から移動させる座標.移動後にaの値をxに代入することで現在地を更新する.

*まとめ [#v30f1c65]
**実際に書いた漢字 [#n80a482d]
#ref(IMG_2055 (2).jpg)
「埼」のつちへんの斜めに書く線が波線となっているが,これはアームがロボット本体と離れており,ブレが生じやすくなっていたからだと思われる.また,「埼」の右上の「大」の部分が少し歪な形になっているので,プログラムをもう少し細かくして改善していきたい.
**感想 [#d3d025de]
今回初めてこれほど複雑なプログラムを組んだが,最初にしては読みやすい文字が書けたという点では良い結果だったと思う.課題は,文字をよりシンプルなプログラムで書くことを重視したため,正しい書き順で書けなかったことである.また機会があればその点に注意して製作していきたい.
*参考にした過去のページ [#i9aced24]
http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2Fmiso%2FMission1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS