二人とも同じロボットを使用しました。
ですが、それぞれのロボットに対するコメントを載せた為に、写真が重複しますがあまり気にしないで下さい。
では、これよりまたたびとサエグサのプログラムを記載します。
↑あまりオリジナリティーはないですが普通に動きます。
最初に作った基礎部分をそのまま運用し、アームの部分は見本を参考にして見よう見まねで作りました。
シンプルですが、それだけ安定性はあります。
ただ、アームは右前にある為に、プログラムはそれを意識して微調整の動きが必要になってしまいました。
↑これを回転させる事によってペンが上下に動きます。
この軸の動力を輪ゴムを使って伝達して、アームに伝えます。
動きが少し速いのでまるでチョップのようになりますが(笑)
/*「中」の字を書く*/ sub pen_down(){ OnRev(OUT_B); Wait(20); Float(OUT_B); } sub pen_up(){ OnFwd(OUT_B); Wait(20); Float(OUT_B); } task main(){ /*一画目*/ pen_down(); //ペン下げ OnFwd(OUT_A+OUT_C); //一画目 Wait(70); pen_up(); //ペン上げ Float(OUT_A+OUT_C); Wait(30); /*微調整*/ OnRev(OUT_A+OUT_C); //次の場所へ移動 Wait(78); OnFwd(OUT_C); //90°ターン Wait(90); OnRev(OUT_C); //微調整のためにバック Wait(60); /*二画目*/ pen_down(); //ペン下げ OnFwd(OUT_A+OUT_C); //二画目 Wait(150); Off(OUT_A+OUT_C); pen_up(); //ペン上げ Wait(10); OnFwd(OUT_A+OUT_C); //微調整の為に前進 Wait(85); OnRev(OUT_C); //90°ターン Wait(95); OnRev(OUT_A+OUT_C); 微調整の為にバック Wait(10); pen_down(); //ペン下げ OnFwd(OUT_A+OUT_C); Wait(70); pen_up(); //ペン上げ Float(OUT_A+OUT_C); Wait(30); /*微調整*/ OnFwd(OUT_A+OUT_C); //次の場所へ移動 Wait(65); OnRev(OUT_C); //90°ターン Wait(94); OnRev(OUT_A+OUT_C); //微調整の為にバック Wait(15); /*三画目*/ pen_down(); //ペン下げ OnFwd(OUT_A+OUT_C); //三画目 Wait(150); pen_up(); //ペン上げ Float(OUT_A+OUT_C); Wait(30); /*微調整*/ OnRev(OUT_A+OUT_C); //次の場所へ移動 Wait(70); OnFwd(OUT_C); //90°ターン Wait(92); OnRev(OUT_C); //次の場所へ移動 Wait(185); /*四画目*/ pen_down(); //ペン下げ OnFwd(OUT_A+OUT_C); //四画目(最後) Wait(200); pen_up(); //ペン上げ Float(OUT_A+OUT_B+OUT_C); //終了 }
↑目を凝らしてみれば見えてきます・・・か?
蛍光ペンですいません。拡大して見る事を推奨します。
二画目と三画目の間が少し開いてしまっています。
それ以外ではしっかりと噛み合って出来ていると思います。
「足」可動式だったものを、タイヤに変更しより安定性を持たせました。さらに、ペンの上げ下げにギアとゴム動力を利用することによって、驚くほど機敏な筆運び(上げたり下げたりするだけですが)が可能になりました。
この棒が、モーターで回転させられることによって、(この画像では左側にある)ギアが動き、黄色いワームが上下してペンを動かします。単純ですが、とても効率的な動きをしてくれました。
一番↑ の画像をみれば分かるように、このロボットはペンを(正面から見ると)左側に持っています。そのため、線を曲げたいときは、線の書き始めが、どこになるかをいちいち計算してプログラムしなければなりませんでした。そのため、画数の多い文字になればなるほど、プログラムが長く複雑になってしまいました。
長所は、ともかく動きが機敏なこと。安定した直線が引けることです・
短所は、機敏すぎること。線の書き始めを設定するのが難し過ぎる事、そのためプログラムが長すぎる事です。
ともかく、サブルーチンやディファイン(define)を用いて、できる限りプログラムが短くなるように努力しました。
#define pen_down Off(OUT_A+OUT_C); OnRev(OUT_B); Wait(20); #define pen_up Off(OUT_A+OUT_C); OnFwd(OUT_B); Wait(20) #define LFwd OnFwd(OUT_A) #define LRev OnRev(OUT_A) #define LOff Off(OUT_A) #define RFwd OnFwd(OUT_C) #define RRev OnRev(OUT_C) #define ROff Off(OUT_C) task main() { // 1 pen_down; LFwd; RFwd;Wait(100); pen_up; LFwd; RFwd;Wait(30); LRev;ROff;Wait(195);/*turn1*/ LFwd; RFwd;Wait(20); // 2 pen_down; LRev; RRev;Wait(100); pen_up; LFwd; RFwd;Wait(90); LRev; ROff;Wait(200); LOff;LFwd; RFwd;Wait(40); // 3 pen_down; LRev; RRev;Wait(150); pen_up; LFwd; RFwd;Wait(215); RRev;Wait(45);/*turn3*/ LRev; RRev;Wait(50); //4 pen_down; LRev; RRev; Wait(25); pen_up; LFwd; RFwd; Wait(75); RFwd; Wait(45); LRev; Wait(45); LRev; RRev; Wait(200);/*back*/ RFwd;Wait(20); LRev;Wait(20);/*turn4*/ LRev;RRev;Wait(10); //5 pen_down; LFwd; RFwd;Wait(35); pen_up; LFwd; RFwd; Wait(80); RRev;Wait(50); LFwd;RFwd;Wait(0); //6 pen_down; LRev; RRev;Wait(100); LOff; ROff; pen_up; LFwd; RFwd;Wait(50); LRev; RFwd; Wait(30); LFwd;RFwd;Wait(50); LFwd;RRev;Wait(20); //7 pen_down; LRev; RRev;Wait(80); pen_up; LFwd; RFwd; Wait(100); LFwd; RRev; Wait(100); //8 pen_down; LRev; RRev; Wait(120); pen_up; Off(OUT_A+ OUT_B+OUT_C); }
長い、長過ぎる……。プログラムを組んでいるうちに、自分でも訳が分からなくなりそうでした。いちを、それを防ぐために「//*(このプログラムで実行されること)*//」などを後ろにつける等の工夫をしたのですが、効果のほどはイマイチ……。
ギア回転の時間を、その場の直感で設定するのではなく、ある程度ルールを決めて設定するべきだったと思いました。文字を書くという事を意識し過ぎたために、分かりやすいプログラムを書くという基本的な事が出来なかったようです。文字を書いている最中にギアの停止を全く挟まなかった事も、書くたびに誤差が生まれる原因となってしまいました。一画書き終わるごとにギアを停止させるなどの工夫をするべきだったと反省しています。また、ロボット設計段階を振り返って、ペンをなるべくロボットの重心に近い位置に来るように設計しておけば、回転にするたびにペンの位置が大きくずれてしまう事を防げたのに、と思いました。今回の課題は、自分としてはあまり満足のいくものが作れませんでしたが、それだけに学んだ事も多かったと思います。この反省を、次回に活かして、今度こそ自分で納得のいくものを作りたいです。