[[2015b/Member]] #contents *課題内容 [#o0f04a75] ・自分の氏名か出身地の7画以上の漢字を書く書道ロボットを制作する。 私は出身地である鹿児島の「鹿」という字を今回の課題で選びました。 *書道ロボットの説明 [#ea884dd0] **どのようにして字を書くか。 [#c1e6faa1] ・書道ロボットを制作するにあたって、まず直面した問題が、どういった動きで字を書くロボットにするかでした。使えるモーターの数は3つと限られているので、各モーターにどんな役割をさせるかペアの北村君と考え、上下運動(ペンの上げ下げ)に1つ、左右運動(ペン固定台を動かす)に1つ、前後運動(ロボット本体を動かす)に1つのモーターを使うロボットにしようと決めました。理想はプリンターのような動きをする書道ロボットの制作ということで始めました。 **制作過程 [#mb26eb74] ・目標はあってもなかなかうまくいかないものだと実感しました。RCXの作品例等を参考にしながら、理想に近づけていこうと二人で協力してロボットを完成させていきました。 **ロボットの特徴 [#db4df766] ・紆余曲折ありながらも、完成した書道ロボット。私たちの班の書道ロボットの特徴は、制作初期構想にもあったプリンターのような動きをするところにあります。ロボット本体を前後に動かすために車輪を使い、ペンを固定している部分を左右に動かすために、レゴのギザギザしているパーツとギアを嚙合わせることにより実現しました。ロボット本体は大きいため、持ち運びの際簡単に壊れてしまうことが予想できたので、パーツを細部に上手く使い頑丈に固定しました。 #ref(./DSC_0051[1].jpg,35%,制作したロボット) ↑書道ロボット全体 #ref(./DSC_0052[1].jpg,25%,左右運動ギミック) ↑左右運動のギミック *プログラム [#g0b3191b] #define fwd(out,t) OnFwd(out);Wait(t);Off(out);//t秒間前進する #define rev(out,t) OnRev(out);Wait(t);Off(out);//t秒間後退する #define SLOW(m,OUT,t) repeat(t){m(OUT);Wait(1);Off(OUT);}; #define DOWN SetPower(OUT_B,10);fwd(OUT_A,40);OnRev(OUT_A);SLOW(OnFwd,OUT_B,30);Off(OUT_A);Wait(20); #define UP SetPower(OUT_B,10);OnRev(OUT_B);Wait(50);Off(OUT_B); #define SUP SetPower(OUT_B,10);OnFwd(OUT_C);OnRev(OUT_B);Wait(50);Off(OUT_BC);rev(OUT_C,50); void move(int lx, int ly,int time) { int i; int x=lx; int y=ly; if(x<0) x*=-1; if(y<0) y*=-1; SetPower(OUT_A,x); SetPower(OUT_C,y); for(i=0;i<time;i++){ if(lx>0){ OnRev(OUT_A); } if(lx<0){ OnFwd(OUT_A); } if(ly>0){ OnFwd(OUT_C); } if(ly<0){ OnRev(OUT_C); } Wait(1); } SetPower(OUT_A,10); SetPower(OUT_C,10); } ・上記のプログラムが書道ロボットを動かす重要なものとなっています。このプログラムはペアの北村君が作成したもので、関数を用いたプログラムです。前後・左右運動をする際のモーターのパワーを調節できるようになっています。このプログラムのおかげで字を斜めに書いたり、緩やかに曲げたりすることができます。 task main () { UP; //スタート位置へ fwd(OUT_A,775); //1画目:縦に1本線を書く DOWN; move(0,8,25); Off(OUT_AC); UP; //2画目:横に1本線を書く move(7,0,150); Off(OUT_AC); DOWN; move(-7,0,290); Off(OUT_AC); UP; //3画目:下に移動しながらはらう DOWN; move(-1,10,100); UP; //4画目:コの字を書く move(2,-10,95); Off(OUT_AC); DOWN; move(7,0,290); Off(OUT_AC); move(0,5,24); Off(OUT_AC); move(-7,0,312); Off(OUT_AC); UP; //5画目:縦二本線を書く(コの字の中間あたりに) move(4,0,125); Off(OUT_AC); DOWN; move(0,-5,41); Off(OUT_AC); UP; move(3,0,55); Off(OUT_AC); DOWN; move(0,5,44); Off(OUT_AC); UP; //6画目:左側の匕を書く move(-5,0,145); Off(OUT_AC); move(0,10,19); Off(OUT_AC); DOWN; move(0,10,60); Off(OUT_AC); move(10,-1,50); Off(OUT_AC); UP; move(0,-7,4); Off(OUT_AC); DOWN; move(-10,0,87); Off(OUT_AC); UP; //7画目:右側の匕を書く move(0,-10,4); Off(OUT_AC); move(7,0,152); Off(OUT_AC); DOWN; move(0,10,52); Off(OUT_AC); move(10,0,148); Off(OUT_AC); UP; move(-10,0,36); Off(OUT_AC); move(0,-10,45); Off(OUT_AC); DOWN; move(-10,0,147); //後ろに下がって完成 UP; Off(OUT_ABC); move(0,10,150); Off(OUT_AC); } ・関数を用いたことによりプログラムの容量が大きくなりすぎてしまいました。そのため、書き順通りにプログラムを組むとRCXに入らなくなってしまいます。そこで、人筆で書ける部分はなるべく人筆で書くようプログラムを組み、プログラムを簡略化していきました。 *結果 [#g3ebfb34] #ref(./DSC_0048[1].jpg,35%,鹿) ・上の写真が書道ロボットで書いた「鹿」になります。私の中では良い出来であると思っています。 *まとめ・感想 [#ia7817b7] ・