2015b/Member 目次
今回の課題のテーマは「ロボットによる習字」である。七画以上の文字を自ら選択し、その字を書くためのロボット製作、プログラム製作が課題である。A4の紙の中に収まる字を書かなければならない。二人一組で行い、ロボット製作は二人で、プログラムは個々で製作した。
ロボットの製作時間 約15時間 (試作時間を含む)
プログラム製作時間 約10時間
これが製作したロボットである。
私が製作したロボットは「車」と「スライダクランク機構」を基に合体をさせたものである。 車の動きがx軸の前後動作を担い、スライダの動きがy軸の前後動作を担っている。 ペンを上下させる役割を担うのはz軸であり、モータの角度指定を用いて制御している。
スライダクランク機構による動き
モータが回転し節が伸び縮みをする。左の写真が最大の伸びで、 左の写真が最小の伸びである。
1.ギア比を変える。
x軸の動作はモータの回転角度指定により主に行われているが、正確な値を走るためにギア比を1:3にしてスピードを下げ、より力強く動作するようにしている。ギア比を1:1にしてしまうとスピードが速く急発進・急停止の勢いにより誤差が大きくなってしまうので、それを少しでも回避できるようにした。
2.水平な運動
y軸の動作にスライダクランク機構を用いることで、z軸を制御するモータを「水平」に前後が出来るようになったことである。
3.余分な力を与えない
z軸のペンをつける場所に凹凸を作ることで、ペンが左右にぶれることなくしっかりと固定が出来る。操作ミスやプログラムミスでペンが強く当たり過ぎてしまっても、軽い凹凸と輪ゴムで止まっているだけなので本体に過度な力がかかることがなく歪みや破損ということはない。
大きな問題であるのが、z軸のモータが位置する場所によって、y軸の前後の動きに影響が出ることである。腕が一番長く伸びている時と、中間地点にある時とではスライダにかかる力が変化している。そのため、同じ力で引くと、引き切れなかったり・引き過ぎを生じたりしてしまう。
改善策として挙げられることは、ピニオンギアを用いて力を増幅させる。また、そうすることにより速さの勢いによる引き切れない・引き過ぎを抑制できると考えられる。
空白が一つ少ないところは移動のプログラムで、空白が一つ多い行が線を書くプログラムである。
#define UZ RotateMotor(OUT_C,10,-10);//UP Z軸の略 #define DZ RotateMotor(OUT_C,10,10);//DOWN Z軸の略 task main() { DZ; RotateMotor(OUT_A,70,-170);//1画目 UZ; RotateMotor(OUT_A,60,85); RotateMotor(OUT_B,40,-15); DZ; RotateMotor(OUT_B,30,55);//2画目 UZ; RotateMotor(OUT_B,50,-30); DZ; OnFwd(OUT_A,100);//3画目 ←工夫した点、OnFwdによる斜辺 OnFwd(OUT_B,40); Wait(150); Off(OUT_AB); UZ; Rotatemotor(OUT_A,100,-100); Rotatemotor(OUT_B,40,-20); DZ; OnFwd(OUT_A,-100);//4画目 ←工夫した点、OnFwdによる斜辺 OnFwd(OUT_B,40); Wait(100); Off(OUT_AB); UZ; Wait(300); RotateMotor(OUT_A,100,-45); RotateMotor(OUT_B,40,-30); DZ; RotateMotor(OUT_A,100,-120);//5画目 UZ; RotateMotor(OUT_A,100,60); RotateMotor(OUT_B,40,-10); DZ; RotateMotor(OUT_B,40,20);//6画目 UZ; RotateMotor(OUT_A,100,70); DZ; RotateMotor(OUT_A,100,-150);//7画目 UZ; Wait(300); RotateMotor(OUT_A,100,150); RotateMotor(OUT_B,40,12); DZ; RotateMotor(OUT_B,40,10);//8画目 UZ; Wait(200); RotateMotor(OUT_B,40,-15); DZ; RotateMotor(OUT_A,100,-150);//9画目 RotateMotor(OUT_B,40,10); UZ; RotateMotor(OUT_A,100,150); DZ; RotateMotor(OUT_A,100,-150);//10画目 UZ; Wait(300); RotateMotor(OUT_A,100,100); RotateMotor(OUT_B,40,8); DZ; RotateMotor(OUT_B,30,5);//11画目 UZ; RotateMotor(OUT_A,100,-60); RotateMotor(OUT_B,30,-12); DZ; RotateMotor(OUT_30,9);//12画目 UZ; RotateMotor(OUT_A,100,100); RotateMtor(OUT_B,30,5); DZ; RotateMotor(OUT_A,100,-120);//13画目 UZ; Wait(300); RotateMotor(OUT_B,30,-40); RotateMotor(OUT_A,70,-80); DZ; RotateMotor(OUT_A,100,-200);//14画目 UZ; RotateMotor(OUT_A,100,60); RotateMotor(OUT_B,40,-10); DZ; RotateMotor(OUT_B,30,50)//15画目 ←工夫した点、OnFwdによるはね OnFwd(OUT_A,100); OnFwd(OUT_B,-40); Wait(100); Off(OUT_AB); UZ; RotateMotor(OUT_B,40,-15); DZ; RotateMotor(OUT_B,40,5);//16画目 UZ; OnFwd(OUT_A,100);//端によける動作 Wait(1000); Off(OUT_A); }
上記が私が選択した「樹」という字のプログラムであり、実際に書かれた字がこちらである。
RotateMotorで制御
一つ一つの動作角度をviewで確認しながら直線プログラムを作った。時間指定で行うより正確な動作が行えた。
斜めの線やはらいはOnFwdで
斜めの線やはらいを書くのが一番の難題であった。角度指定で行おうとしたが、x軸とy軸のギア比が異なっているため比を考慮しながらプログラムを作ることは難しかった。そこで、斜めの線=放物線だっ!と思い立ちxとyを微小角度で交互にリピートを行ったが、なかなか滑らかな線がでなかった。そこで、OnFwdをうまく使ってはらいを再現しようと試みた。結果、今まで試した中で一番はらっているという雰囲気があった。何度も時間を調節し最適な時間を研究した。
プログラムが長い
文字自体が16画あるためプログラムが長くなるのは仕方がないことであるが、「ペンを下す」「書く」「ペンを上げる」「移動」の動作の繰り返しであるので、サブルーチンを使ってもっと短く事が出来ると考えられる。
「樹」は画数が多くバランスがとりにくい漢字であるが、ロボットとプログラムがうまく連動しあいなかなかの完成度に近づいたと感じる。スライダクランク機構は回転から水平方向を作り出すことが出来るが、遠方と近方では力の大きさが変化するため、そこを考慮しなければならないということが今回の課題で身に染みた。プログラムにあたっては、座標軸を考え回転角や速度を計って製作すれば、理論上は思い通りに進む。しかし、実際にロボットにやらせてみるとバックラッシュや歪み等などから大きな影響を受け理論上通りにはいかない。プログラムを完成させたからと言って安心するのではなく、動かしてみて悪い要因を突き止め、微調整を何度もして完成に近づける、それが大切であると感じた。
今回の課題にあたり自分の中で複数種ロボットを考えたが、最後に皆で発表会をしたときに、自分の中にはなかったアイディアがたくさんありとても見ていて楽しかった。多くのアイディアを取り入れて次へ生かしたい。