[[2017b/Member]]

#contents
*初めに [#x9fc1f52]
今回の課題は、自分が住んでいたことのある地名をロボットに書かせる、というものであった。A4用紙に収まる大きさで、"2文字"以上であることが条件だった。

*ロボットについて [#v1974f8a]
自分たちの班では、x軸方向(横方向)とy軸方向(縦方向)に動くロボットに分け、y軸方向に動くロボット(以降y軸ロボットと呼ぶ)を土台にした。そのy軸ロボットにレールを取り付け、筆を動かすロボット(以降筆ロボットと呼ぶ)を取り付けたx軸方向に動くロボット(以降x軸ロボットと呼ぶ)がレールの上を走るようにした。

#ref(2017b/Member/arso/Mission1/DSCN1131.jpg,70%,ロボットの全体)
  写真1:ロボットの全体

上の写真1がロボット全体の写真である。上部のロボットがx軸ロボットとそれに取り付けられた筆ロボット、その下がy軸ロボットである。

**y軸ロボット [#h4a385bb]
y軸”ロボットはモーターを縦に取り付けたため、全体的に位置が高くなり、筆ロボットの腕を長くせざるを得ず、字を書く時の誤差が大きくなったり、全体的に安定し難くなった。加えて、モーターの反対側(x軸ロボットが乗るレールの先端)にタイヤを付けたが、モーターから離れている上にモーターと直接つなげる等しなかったため、モーターの動き出しよりも若干後からタイヤが動くことになり、字の誤差が大きくなってしまった。また、コントローラーを後から取り付けるようにしたために、必要以上に固定に部品を使うことになり、ロボットが重くなってしまった。
#ref(2017b/Member/arso/Mission1/DSCN1138.jpg,70%,y軸ロボット)
  写真2:y軸ロボット

写真2では見えていないがコントローラーを後からつけたため、取り付けのための部品が複雑になっている。

**x軸ロボット [#u8a60710]
x軸ロボットもあとから筆ロボットを取り付けるようにしたが、うまく固定できずやはり無駄に部品が多くなってしまった。また、レールから落ちないような工夫をしなかったため、稀にだが脱輪することがあった。レールはあえてでこぼこのある部品を利用し、脱輪しづらくできると思ったが、大きな効果があったかは分からず、むしろ字を書くときにぶれたりする原因になった。もっと別の方法で脱輪は防ぐべきであった。
#ref(2017b/Member/arso/Mission1/DSCN1139.jpg,80%,x軸ロボット)
  写真3:x軸ロボット

写真3ではわかりにくいが、筆ロボットをつけると重さで筆のほうに傾き、x軸ロボットの反対側の車輪はレールについていない。これも脱輪の原因となっていたかもしれない。

**筆ロボット [#reaef9a4]
筆ロボットは筆が接地するようにモーターに腕を取り付けただけだが、上記の通り長い腕が必要となったために、字を書くときに誤差がでたり、筆の上下による跳ねができることがあった。まだしも、腕を短くして筆を用紙と垂直になるようにすべきだったと考える。
#ref(2017b/Member/arso/Mission1/DSCN1130.jpg,80%,筆ロボット)
  写真4:筆ロボット

写真4のように腕が長い。この影響で力のモーメントが大きくなって筆が下がりやすくなってしまい、筆の上げ下げにも注意が必要だった。

*プログラムについて [#sf279d06]
自分は「大分」を書かせることにした。正しい書き順で書けるようなプログラムにした。

プログラムではモーターA,B,Cは以下のように対応している。
 OUT_A  //y軸ロボットのモーター
 OUT_B  //x軸ロボットのモーター
 OUT_C  //筆ロボットのモーター

x軸、y軸ロボットはモーターの強さが正のとき軸の正方向(写真1の筆がある方をロボットの前面としたときの右方向と前方向)に動き、筆ロボットは強さが正のとき筆を下げる。

 #define PLUSX_POWER 15     //x軸ロボットを右側に進める強さ
 #define MINUSX_POWER -15    //x軸ロボットを左側に進める強さ
 #define PLUSY_POWER 20     //y軸ロボットを前方に進める強さ
 #define MINUSY_POWER -20    //y軸ロボットを後方に進める強さ
 
 sub move_pen(int c,int s) //筆を上下に動かすプログラム。cはCのモーターの強さを、sは動作時間を示している。cが正のとき筆を下ろす
 {
     OnFwd(OUT_C,c);
     Wait(s);          //筆を強さcでs/1000秒間動かす
     Off(OUT_C);         //停止
 }
 
 sub go_slant(int a,int b,int t) //斜めの移動をさせるプログラム。a,bはそれぞれA,Bのモーターの強さを、tは動作時間を示している。a,bを共に正にすると右前方にロボットが動く
 {
     OnFwd(OUT_A,a);
     OnFwd(OUT_B,b);
     Wait(t);          //y軸方向に強さa、x軸方向に強さbでt/1000秒間動かす
     Off(OUT_AB);        //停止
 }

 task main()
 {
     move_pen(14,270);      //筆を下ろす
     OnFwd(OUT_B,20);
     Wait(1900);         //右に1.9秒間移動
     Off(OUT_B);
     Wait(500);          //一時停止
     move_pen(-18,250);     //筆を上げる(ここまでが「大」の1画目)
     OnFwd(OUT_B,-18);
     Wait(980);            //左に0.98秒間移動
     Off(OUT_B);         //停止
     OnFwd(OUT_A,PLUSY_POWER);
     Wait(400);         //前に0.4秒間移動
     Off(OUT_A);         //停止(ここまでは移動のプログラム)
     move_pen(14,270);      //筆を下ろす
     OnFwd(OUT_A,MINUSY_POWER);
     Wait(350);         //下に0.35秒間移動
     Off(OUT_A);停止
     go_slant(-20,-15,200);
     go_slant(-20,-16,200);
     go_slant(-20,-17,200);
     go_slant(-20,-18,200);
     go_slant(-20,-19,200);
     go_slant(-20,-20,200);   //左下に1.2秒間移動。この動きを6回に分け、横移動の強さを少しずつ増やし滑らかさが出るようにした
     move_pen(-18,250);     //筆を上げる(ここまでが「大」の2画目)
     go_slant(19,18,1050);    //右上に1.05秒間移動
     move_pen(14,270);      //筆を下ろす
     go_slant(-20,15,1200);    //右下に1.2秒間移動
     Wait(500);         //一時停止
     OnFwd(OUT_B,PLUSX_POWER);
     Wait(500);         //右に0.5秒間移動
     Off(OUT_B);//停止
     move_pen(-18,250);     //筆を上げる(ここまでが「大」の3画目)
     OnFwd(OUT_B,-16);
     Wait(1800);         //左に1.8秒間移動
     Off(OUT_B);         //停止
     OnFwd(OUT_A,MINUSY_POWER);
     Wait(200);         //下に0.2秒間移動
     move_pen(14,270);      //筆を下ろす
     go_slant(-20,-16,200);
     go_slant(-20,-17,200);
     go_slant(-20,-18,200);
     go_slant(-20,-19,200);   //左下に0.8秒間移動。この動きを4回に分け、横移動の強さを少しずつ増やし滑らかさが出るようにした
     move_pen(-18,250);     //筆を上げる(ここまでが「分」の1画目)
     go_slant(20,19,800);    //右上に0.8秒間移動
     OnFwd(OUT_B,PLUSX_POWER);
     Wait(600);         //右に0.6秒間移動
     Off(OUT_B);         //停止
     move_pen(14,270);      //筆を下ろす
     go_slant(-20,17,800);    //右下に0.8秒間移動
     OnFwd(OUT_B,PLUSX_POWER);
     Wait(250);         //右に0.25秒間移動
     Off(OUT_B);         //停止
     move_pen(-18,250);     //筆を上げる(ここまでが「分」の2画目)
     OnFwd(OUT_B,MINUSX_POWER);
     Wait(1900);         //左に1.9秒間移動
     Off(OUT_B);         //停止
     OnFwd(OUT_A,MINUSY_POWER);
     Wait(50);          //下に0.05秒間移動
     Off(OUT_A);         //停止
     move_pen(14,270);      //筆を下ろす
     OnFwd(OUT_B,PLUSX_POWER);
     Wait(1600);         //右に1.6秒間移動
     Off(OUT_B);         //停止
     go_slant(-20,-13,300);
     go_slant(-20,-12,300);
     go_slant(-20,-11,300);   //左下に0.9秒間移動。この動きを3回に分け、横移動の強さを少しずつ減らし滑らかさが出るようにした
     Wait(400);         //一時停止
     go_slant(20,-15,300);    //左上に0.3秒間移動
     move_pen(-18,250);     //筆を上げる(ここまでが「分」の3画目)
     OnFwd(OUT_A,PLUSY_POWER);
     Wait(500);         //上に0.5秒間移動
     Off(OUT_AB);        //停止
     move_pen(14,270);      //筆を下ろす
     go_slant(-20,-15,130);
     go_slant(-20,-16,130);
     go_slant(-20,-17,130);
     go_slant(-20,-18,130);
     go_slant(-20,-19,130);   //左下に0.65秒間移動。この動きを3回に分け、横移動の強さを少しずつ増やし滑らかさが出るようにした
     move_pen(-18,250);     //筆を上げる(ここまでが「分」の4画目)
 }
サブルーチンを引数を複数用いて設定したため、プログラムを書くのは楽だったが、筆の上下や斜めの移動がどの方向であるかがわかりにくくなってしまった点は失敗だった。加えて、引数はもう少しわかりやすい文字で置けばよかったと反省している。また、初めに定義したモーターの強さが何度も数字のままで使われているし、異なる数字も出ている。試行錯誤の結果定義だけでは上手くいかなかったからではあるが、これでは定義した意味がなくなっている。工夫した点としては、「大」の2画目及び「分」の1画目と4画目の左はらいの横方向を細かく分け増減させたことと、部分によってわずかだが動かない時間を作ったことだ。しかし、前者は短い時間の間に1%ずつしかモーターの強さを変えなかったので、変化がつくこともそうでないこともあり、プログラムを組んだ自分としても成功しているとは言えない工夫だった。後者はそれなりに意味があったようで、初めのころに組んだプログラムで試行したときよりは不要な跳ねを減らすことに成功した。

*結果 [#tafec1cc]
発表を行ったときの結果は下の写真5のようになった。何を書いているかはわかると思うが筆が当たったり離れたりしてしまっている。これはプログラムの問題ではなく、始めるときに筆の固定が斜めになっていたようだった。
#ref(2017b/Member/arso/Mission1/DSCN1160.jpg,80%,発表会での結果)
  写真5:発表会当日の結果

発表会の4日前に、最後に試したほぼ同じプログラム(違いは「分」の4画目の前に左方向への移動が入っていること)で行ったときは下の写真6のようになった。重なっている部分もあり少し見づらいが赤線で囲まれているほうである。ところどころ跳ねや跳んでいる点もあるが、「大分」と読めると思う。
#ref(2017b/Member/arso/Mission1/DSCN1150.jpg,80%,発表会前最後の試行結果)
  写真6:発表4日前の試行


*感想と反省 [#u6f9b72c]
結果だけを見ると、筆の位置のずれに気づかなかったことが失敗である。しかし、プログラムを優先しロボットの質を下げてしまったことが大きな間違いだと考える。実際に、タイヤのゴムが別の部品に引っかかって字が歪んでしまう、電池を変えると動きが速くなりすぎて字がはみ出しそうになるなど多くの問題が起こり、途中で何度も考えることになった。プログラムについても、必要な定義などは少なく済んだが、その分引数の数が多くなりメインルーチンの中がごちゃごちゃしてしまった。定義やマクロ、関数をうまく使えなかった結果である。プログラムを少なくまとめたり、見てわかりやすくしておくことの大切さや、それに基づいて動くロボットの重要性をよく理解することができた。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS