こちらが本体です。サンプルのロボットに筆を持つためのアームを取り付けただけの簡単な構造です。
アームを本体の正面に付けました。
アームの構造は、このようになっています。
本体と筆の通る道の差が少なくなうように、なるべく筆が前輪の中心に近い場所に来るようにアームを取り付けた(つもりです)。
また、モーターはすべて回転角度を指定して動かしたので、モーターの位置を地面に近づけることで、筆の根元を持った状態にしました。
これは、筆を上げ下げする際に、モーターをたくさん回してもペンの上下の動きが小さくなるので、コントロールがしやすくした工夫です。
ちなみに、部品が少なくコンパクトなので、分解しやすく組み立てやすいのもメリットです。
実際の書き順にしたかったのですが、プログラムのしやすさを優先したので、それは断念しました。
特に、4画目までは同じ動きで横線を等間隔に書きたかったので、このようになっています。
誤差を少なくするために、いかに短い距離で移動できるかを考えて決めました。
アームには手を掛けず、単に接線みたい?に筆を固定したので、筆の上げ下げをする動作が円を描くような動きをしてしまいました。けれど、書き始めも止めて入れているし、5画目は意外としっかりはらえていたので、その部分はなかなか気に入っています。
スピードは遅めに指定し、コントロールしやすくしました。時間を指定してプログラムした際に電池の残量で動きが変わってしまい、うまくいきませんでした。
そこで、モーターは回転角度を指定して回したので電池の残量に関わらず同じ距離を進むように改善できました。また、前輪のモーターは同期し、まっすぐ進むようにしました。
#define SPEED 25 #define TURN_TIME 500 #define go_foward(t) ResetTachoCount(OUT_BC); RotateMotorEx(OUT_BC,SPEED,t,0,true,true);\ Off(OUT_BC); Wait(TURN_TIME); //回転角tだけ前進 #define back(t) ResetTachoCount(OUT_BC); RotateMotorEx(OUT_BC,SPEED,-t,0,true,true);\ Off(OUT_BC); Wait(TURN_TIME); //回転角tだけ後退 #define change_direction Off(OUT_B); RotateMotor(OUT_C,SPEED,105); Wait(TURN_TIME);\ Off(OUT_C); RotateMotor(OUT_B,SPEED,100); Off(OUT_BC); Wait(TURN_TIME); #define pen_down RotateMotor(OUT_A,10,16); Wait(TURN_TIME); #define pen_up RotateMotor(OUT_A,10,-16); Wait(TURN_TIME); #define turn(t) ResetTachoCount(OUT_BC); RotateMotorEx(OUT_BC,SPEED,t,100,true,false);\ Wait(TURN_TIME); #define turn_right(t) ResetTachoCount(OUT_BC); RotateMotorEx(OUT_BC,SPEED,t,5,true,true);\ Off(OUT_BC); Wait(TURN_TIME);
5行目の定義は、1〜4画目までを書くためのものです。次の画の書き始めに移動する動きをします。
そしてなぜか、バックスラッシュが¥に表示されてしまいました…
最初にプログラムした際に、A4用紙めいっぱいに書くようにプログラムを作ってしまったので紙からはみ出したり、誤差が生じ文字のバランスが崩れて読めない字になってしまったり、書いている途中に紙がクシャクシャになってしまい失敗しました。
そこで、小さめの字を書くように改善したところ、コントロールがしやすくなったことと、誤差も少なくなったことで、最初のよりも思ったように動いてくれるプログラムがかけました。
5,6画目のカーブは、モーターの回転角度を左右でそれぞれ変え、曲線を描くようにしました。
task main() { pen_down; go_foward(100); //1画目 pen_up; change_direction; back(195); pen_down; go_foward(85); //2画目 pen_up; change_direction; back(200); pen_down; go_foward(100); //3画目 pen_up; change_direction; back(230); pen_down; go_foward(150); //4画目 pen_up; go_foward(240); turn(210); //その場で時計回りに旋回 back(360); pen_down; turn_right(100); //5画目 pen_up; change_direction; back(270); pen_down; turn_right(200); //6画目 pen_up; RotateMotor(OUT_C,SPEED,100); RotateMotor(OUT_B,SPEED,250); Off(OUT_BC); Wait(TURN_TIME); back(210); pen_down; back(10); //7画目 pen_up; }
本体の構造により、プログラムの作りやすさに大きな影響があることがよくわかりました。
最初に書いた失敗作の写真も撮っておけばよかったと思いました。
まっすぐに筆を上げ下げできる構造に改善したら、もっと綺麗に字が書けそうです。
このロボットでは紙を押さえておかないと紙がずれてしまいうまく書けなかったので、これも改善したいです。
また、6画目から7画目へ移動する動作がスムーズに行えず、プログラムの量が余計に多くなってしまいました。これも改善したいです。