課題:自分の氏名か出身地の7画以上の漢字を書く"書道ロボット"を制作する。
・私は出身地である鹿児島の「鹿」という字を選びました。選んだ理由は、難しそうだったからです。
・書道ロボットを制作するにあたって、まず直面した問題が、どういった動きで字を書くロボットにするかでした。使えるモーターの数は3つと限られているので、各モーターにどんな役割をさせるかペアの北村君と考え、上下運動(ペンの上げ下げ)に1つ、左右運動(ペン固定台を動かす)に1つ、前後運動(ロボット本体を動かす)に1つのモーターを使うロボットにしようと決めました。理想はプリンターのような動きをする書道ロボットの制作ということで始めました。
・目標はあってもなかなかうまくいかないものだと実感しました。RCXの作品例等を参考にしながら、理想に近づけていこうと二人で協力してロボットを完成させていきました。
↑制作風景…制作初期段階。完成にはもう少しかかりそうです。
・紆余曲折ありながらも、完成した書道ロボット。私たちの班の書道ロボットの特徴は、制作初期構想にもあったプリンターのような動きをするところにあります。ロボット本体を前後に動かすために車輪を使い、ペンを固定している部分を左右に動かすために、レゴのギザギザしているパーツとギアをかみ合わせることにより実現しました。ロボット本体は大きいため、持ち運びの際簡単に壊れてしまうことが予想できたので、パーツを細部に上手く使い頑丈に固定しました。動きはとても安定しているので、字を書くのに支障はありません。
↑書道ロボット全体…結構どっしりとしたロボットになりました。
↑左右運動のギミック…赤い矢印で示しているところにモーターとつながっているギアがあります。そのギアとギザギザパーツとをかみ合わせ、写真正面から見て反時計周りにギアが回転するとギザギザパーツが右に引き寄せられ、左に動かすときは時計回りにギアを回転させることで、左右の運動ができる仕組みになっています。この動きと前後運動とを組み合わせることによりプリンターのような動きができます。このロボットの最も重要なギミックかもしれません。
#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); }
・上記のプログラムが書道ロボットを動かす基盤となるものです。このプログラムはペアの北村君が作成したもので、関数を用いたプログラムです。前後・左右運動をする際のモーターのパワーを1から10段階で調節できるようになっています。このプログラムのおかげで字を斜めに書いたり、緩やかに曲げたりすることができます。move(左右運動,前後運動,移動時間)となっています。
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に入らなくなってしまいます。そこで、人筆で書ける部分はなるべく人筆で書くようプログラムを組み、プログラムを簡略化していきました。苦労した点は、字のバランスをきれいに整えるために何度も時間調節をしたことです。作成に微調整も含め4時間近くかかりました。時間がかかった理由として、細かい調節のたびにプログラムの転送に時間を取られすぎてしまったことが挙げられます。まだまだ改善する点がありますが、一応はこのプログラムが完成形です。
・上の写真が書道ロボットで書いた「鹿」になります。私の中では良い出来であると思っていますが、どうでしょうか?唯一気になるのが、左側のヒの字のはねるところが鋭すぎているということくらいです。ちなみに、筆ペンで書いてます。
・今回の課題を通してロボット制作の難しさ、プログラムを組むことがいかに大変な作業であるかを実感しました。授業時間外に課題を進めることが多く、大変であったと思いますが、夢中になって活動していた自分がいました。試行錯誤の連続でロボットを完成させ、プログラムを組み、動かしてみてはやり直しの繰り返しが、今ではとても良い経験であったと思えます。ペアの北村君にはプログラムの基盤作成をしてもらい、とても助かりました。良いペアに巡り合えたと感謝しています。今回の課題の結果はとても良いものであったと、達成感があります。次回の課題にも意欲的に取り組んでいこうと思います。