相手の似顔絵をかこう!
•A4の紙に相棒の似顔絵を書くロボットを作成せよ。
•ひとりにつき一つ以上のプログラムを作成すること。
•ペン以外はキットに含まれる部品を使うこと。
•キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。
•改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
・TOKIO
・なら
•本体のAとCに車輪のモーターをつなげ、Bの部分にペンを振り下ろすためのモーターを取り付けた。
•シンプルで小回りの利く四輪車!
•できるだけ軽量にするために最低限のパーツしかついていないスッキリBody! これによりスムーズな動きができる。
•いかにもペンを持っていそうな?アーム!(ペンを上下させることも考えたが、より「絵を描いている感」を出すためにアームを振り下ろすことにした。)
•ペンを下ろしてからすぐに移動したり、上げてる最中に移動してしまうと、若干だが線がずれたりペン先が跳ねて点線になってしまったりしたので、プログラムを組む際に一瞬止めるようにした。
意外とこれが重要だった。
私たちは、エレベーター式のものよりアーム式のほうがシンプルなロボットになると考えアームを用いた。
小回りはきかないが、緩やかな曲線を旋回することでかけるし、なにより線をかいていているところがはっきり見えるところがよかった。また、ペンの高さ(筆圧)調節も簡単だったと思う。
初めは、手のような形をしたアームにペンを持たせていたが高さ調節が調整しにくく、しかもペンの安定性に欠けたので改良してシンプルな形のアームにした。
初めのアーム
このアームはいかにも手でペンを握っているように見え気に入っていたが、ペンを下ろすとすぐに線が歪んでしまい、しかもペンがどんどん上がっていってしまい安定性に欠けた。
改良した後のアーム
こちらは、高さ調節(筆圧)も容易にでき、しかも安定性がある。
また、初めアームを直接モーターに取り付けていたが、それだとほんの少しモーターを回転させただけで、超高速でペンを振り下ろしてしまうので、間にギアを使った。
初めはこのように直接アームを取り付けていた。
改良して間にギアを入れてみた。気持ち振り下ろす速さに変化があったように感じる。
そして、ペンを振る時の衝撃に耐えられるように少しまわりをブロックで補強した。
・ここで、簡単な似顔絵を描くプランを説明する。
ならはらの軌跡
激似ですね。
しかし、当初はこの予定ですべて直線で描くつもりだったが、シンプルなプログラムにし、より少ない工程で顔を描きたかったので、3番、6番の線は左旋回を使い曲線で描いた。
したがって6番の線は当初の予定とは逆の矢印方向の向きで線を描いている。
8番の線(鼻)も曲線を使い鼻の丸みを描いている。
また、顔を書き終わった後はロボットが自分で紙から遠ざかるようにした。
描いてから思ったが、こちらのほうがより顔っぽかった。
旋回で描いた線が点線になってしまったのは残念ですが・・・
TKOの顔の設計
似ていますね。髪の分け方とか^^
電池の消耗か、かなりずれが生じました。髪を書くときの回転時間の調整に苦戦しました。顔は六角形を作るようにプログラムしました。最初は顔のパーツが顔に収まっていませんでした(笑)
ーTOKIO
#define GO OnFwd(OUT_A);OnFwd(OUT_C); //前に進む #define BACK OnRev(OUT_A);OnRev(OUT_C); //後ろに進む #define Tright OnFwd(OUT_A);OnRev(OUT_C); //右回転 #define Tleft OnRev(OUT_A);OnFwd(OUT_C); //左回転 #define STOP Off(OUT_A+OUT_C); //止まる
sub pen_up() {OnRev(OUT_B);Wait(10);Off(OUT_B);Wait(50);} //ペンをあげる
sub pen_down() { OnFwd(OUT_B);Wait(8);Off(OUT_B);Wait(50);} //ペンを下げる
task main() { GO;Wait(70);STOP;pen_up(); //1番 輪郭 BACK;Wait(80);STOP;Tright;Wait(40); //2番 輪郭 GO;Wait(60);STOP;pen_down(); GO;Wait(50);STOP;Wait(50); Tleft;Wait(047);STOP;Wait(50);pen_up(); //3番 輪郭 Tright;Wait(1);BACK;Wait(75);STOP; //4番 輪郭 pen_down();GO;Wait(75);STOP;pen_up(); BACK;Wait(75);Tright;Wait(50); //5番 右目 STOP;BACK;Wait(30);STOP; pen_down();GO;Wait(18);STOP;pen_up(); GO;Wait(25);Tleft;Wait(20);STOP; //6番 左目 pen_down();Tleft;Wait(18);STOP;pen_up(); BACK;Wait(30);Tright;Wait(90);STOP; //7番 口 pen_down();GO;Wait(30);STOP;pen_up(); Tleft;Wait(15);STOP;BACK;Wait(20);STOP; //8番 鼻 pen_down();Tleft;Wait(15); STOP;Tright;Wait(10);STOP; pen_up(); GO;Wait(200);STOP; }
ーならが作ったプログラ厶
#define Go(gt) OnFwd(OUT_A+OUT_C);Wait(gt);Off(OUT_A+OUT_C); //前進 #define Back(bt) OnRev(OUT_A+OUT_C);Wait(bt);Off(OUT_A+OUT_C); //後退 #define Arm_raise OnRev(OUT_B);Wait(10);Off(OUT_B); //ペン上昇 #define Arm_lower OnFwd(OUT_B);Wait(5);Off(OUT_B); //ペン降下 #define Turn_left(tlt)OnRev(OUT_A);OnFwd(OUT_C);Wait(tlt);Off(OUT_A+OUT_C); //左回転 #define Turn_right(trt) OnFwd(OUT_A);OnRev(OUT_C);Wait(trt);Off(OUT_A+OUT_C); //右回転 #define Pause Off(OUT_A+OUT_C);Wait(50); //停止
task main() {Go(60); Arm_raise(10); Back(60); Turn_left(66); Go(90); Arm_lower; Pause; Go(43); Pause; Arm_raise; Back(60); Turn_left(60); Go(90); Arm_lower; Pause; Go(43); Pause; Arm_raise; Back(60); Turn_left(70); Go(90); Arm_lower; Pause; Go(60); Pause; Arm_raise; Back(60); Turn_left(60); Go(90); Arm_lower; Pause; Go(60); Pause; Arm_raise; Back(55); Turn_left(90); Go(90); Arm_lower; Pause; Go(65); Arm_raise; Back(170); Turn_right(160); Arm_lower; Pause; Go(50); Arm_raise; Back(100); Turn_right(80); Go(80); Arm_lower; Pause; Go(50); Arm_raise; Back(100); Turn_right(50); Go(90); Arm_lower; Pause; Go(60); Arm_raise; Back(130); Turn_right(100); Go(95); Arm_lower; Pause; Go(20); Arm_raise; Back(20); Turn_left(40); Go(30); Turn_left(20); Go(30); Arm_lower; Pause; Go(30); Arm_raise; Go(40); Turn_left(80); Go(40); Arm_lower; Pause; Go(30); Arm_raise; Turn_left(120); Go(60); Turn_left(30); Go(40); Arm_lower; Pause; Go(20); Arm_raise; }
・ペンの着地点が本体と離れていたため描写→(ペンの着地点まで)後退→回転→移動…となりプログラムが複雑になった。(なら)
・電池消耗の影響か作業中に移動距離が変わってしまった。
・紙がずれない工夫が施せなかった。
・なかなか時間が確保できず、ぎりぎりまでロボットやプログラムができなかった。
・サブルーチンを使って最初よりすっきりしたプログラムを書くことができた。