[[2018a/Member]]

書道ロボット

*課題 [#s38c0ba9]

これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び,それをA4の紙を書くロボットを製作せよ。

私は愛知県出身なので愛知という文字にした。


*ロボット本体の説明 [#nd70e026]
#ref(IMG_2047all.jpg)
ロボットの全体図

**前後移動 [#t2a93289]

最初は床をタイヤで移動するように製作していたが、紙の上を移動する際に紙が巻き込まれるトラブルが発生したため、前後移動はそれを防ぐようにレールの上をタイヤで移動するようにした。

**左右移動 [#t882e33e]
#ref(IMG_2046motar.jpg)
ギアの歯のブロックを細長い板のブロックの上側に付けたものをモータで左右に動かすようにした。

**アーム部分 [#l1fd5e58]
#ref(IMG_2045arm.png)
ペンはゴムで固定し、アームの上下にもゴムを利用している。アームとモータの接続部分が一箇所だと上下移動の際にブレが生じたため接続部分を二箇所にした。また、アームが地面から離れても上下移動の際にブレが生じたため、地面とアームの距離を短くした。

*プログラムの説明 [#tfc6c1e6]
**コンセプト [#db2f07b7]

誰でも簡単に使える、分かりやすいプログラムを目指して制作した。

**プログラムの全容 [#j8e29460]

  1.#define d OnFwd(OUT_C);Wait(60);Off(OUT_C);//ペン下げ
  2.#define u OnRev(OUT_C);Wait(60);Off(OUT_C);//ペン上げ
  3.#define mx(a) \//x軸移動
  4.   if (a-x>0) {OnFwd(OUT_A);Wait(a-x);Off(OUT_A);x=a;}\
  5.   else {OnRev(OUT_A);Wait(x-a);Off(OUT_A);x=a;}
  6.#define my(b) \//y軸移動
  7.   if (b-y>0) {OnFwd(OUT_B);Wait(b-y);Off(OUT_B);y=b;}\
  8.   else {OnRev(OUT_B);Wait(y-b);Off(OUT_B);y=b;}
  9.#define mxyr(r) \//右斜め上下移動
 10.   if (r-y>0) {OnRev(OUT_A);OnFwd(OUT_B);Wait(r-y);Off(OUT_AB);x=x+y-r;y=r;}\
 11.   else {OnRev(OUT_AB);Wait(y-r);Off(OUT_AB);x=x-y+r;y=r;}
 12.#define mxyl(l) \//左斜め上下移動
 13.   if (l-y>0) {OnFwd(OUT_AB);Wait(l-y);Off(OUT_AB);x=x-y+l;y=l;}\
 14.   else {OnFwd(OUT_A);OnRev(OUT_B);Wait(y-l);Off(OUT_AB);x=x+y-l;y=l;}
 15.task main ()
 16.{
 17.   int x = 0;
 18.   int y = 0;
 19.   int r = 0;
 20.   int l = 0;
 21.   mx(80);my(230);d;mxyl(220);mx(180);mxyr(200);u;
 22.   mxyr(220);d;mxyr(200);u;
 23.   mx(80);my(220);d;mxyl(200);u;
 24.   mx(200);d;my(190);u;my(200);d;mx(40);mxyl(190);u;
 25.   mx(180);my(200);d;mxyl(180);u;
 26.   mx(160);my(200);d;mxyr(180);mx(80);mxyl(190);u;
 27.   mx(120);my(200);d;mxyr(180);u;mxyr(200);d;mxyr(180);u;
 28.   mx(100);my(170);d;mx(140);mxyl(150);mx(180);u;
 29.   mx(100);my(170);d;mxyl(130);mx(160);u;
 30.   mx(140);my(170);d;mxyr(130);mx(60);u;
 31.
 32.   mx(180);my(110);d;mxyl(70);u;
 33.   mxyr(90);d;mx(120);u;
 34.   mx(200);my(70);d;mx(120);u;
 35.   mx(160);my(90);d;my(60);mxyl(20);u;
 36.   mxyr(60);d;mxyr(20);u;
 37.   mx(100);my(80);d;my(40);u;
 38.   my(80);d;mx(40);my(40);u;
 39.   mx(100);d;mx(40);u;
 40.
 41.	
 42.}
*WINDOWSで「\」の半角での書き方がわからなかったためここでは「\」とする

**定義についての説明 [#debdc5fc]

このプログラムには1〜14行目にかけて6つの動作が定義されている。1、2行目はペンの上げ下げの動作、3行目からはペンのx軸の動き、6行目からはy軸の動き、9行目からは右斜め上下の動き、12行目からは左斜め上下の動きが定義されている。

**プログラムの書き方の例 [#c7bfb676]

例としてこのような図形を書くとする。
#ref(DSC_0286.png)
*座標は画像のxy座標図の数値を参照

この図形は
 21.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はペンを上げろという指示である。これらの定義を活用すれば、ある程度の文字や図形を書くプログラムを誰でも比較的簡単に書くことができるはずだ。

**工夫した点、苦労した点 [#i65af65c]

最初に書いた通り誰でも簡単に使えるようにするためにx軸、y軸の数値を入力するだけでその場所に行けるような定義を作った。ペンの現在地を変数に記憶させ、入力された値で逆算することによって移動距離を導き出す仕組みになっている。が、その計算結果でマイナスの値が出ると移動距離を時間で制御しているので、もちろん不具合が出てしまった。そこで資料を参考にif構文を使い、マイナスの値が出るときには計算結果が正の値になるよう式にマイナス1をかけ、モーターを逆回転さることで、マイナスの値にも対応させた。

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

*まとめと改善点 [#n8304968]
#ref(DSC_0287aichi.png)
このような文字が書くことができた。我ながら上出来だと思う。文字の大きなはみだしがないことからある程度正確な座標にペンを置くことができていると思う。また、人が書きやすいプログラムをかけたと思う。しかし改善点も少なくない、努力の末だいぶ小さくはなったが仕様上ペン先のぶれが生じてしまうのと、同じ傾きの斜め線しか書けないことと、曲線が書けないことなどが挙げられる。もし次があるならば、これらの課題をクリアしたいと思う。


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