目次
A4の用紙に、相方の似顔絵を描くロボットを製作する。 細かなルールは以下の通りである。
全体はこんな感じです。ペンの上げ下げにアームを用いた「アーム型」ロボットです。
両側からペンを挟み込むようにして固定します。ギアは、上下速度を遅くするために段分けして調整しました。
また、ペンを自重でおろすため、アームの先に気休め程度のおもりとしてブロックをつけています。
なお動作の際には、ぐっPは油性ペン、ひろはボールペンを使用しています。
ガイドブック46ページのキャスターを参考に製作。
問題点:走行中に用紙に引っかかり、用紙がずれてしまう。
用紙に引っかからないように、キャスターを本体の内側に設置することに。取り付け場所が狭いため、摩擦の少なそうな部品で代用。(黄色のブロックをずらしているのは、後でとりやすくするため)
問題点:それでも摩擦が生じ、用紙が曲がってしまう。
ならばいっそのこと、キャスターを用紙の外に出してしまおう!ということで製作。
問題点:動作の際に、非常にスペースをとる。しかし、スペースさえ確保できれば今までで一番描きやすい。
#define BACK_TIME 18 //髪の部分の後退時間を指定 #define GO_TIME 10 //直進、後退時間を指定 #define UP_TIME 10 //アームの上げ時間を指定 #define DOWN_TIME 200 //アームの下げ時間(待ち時間)を指定 #define WAIT_TIME 50 //待ち時間を指定 void turn_right(int t) //t秒間の右旋回を定義 { OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_AC); Wait(WAIT_TIME); } void turn_left(int t) //t秒間の左旋回を定義 { OnRev(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_AC); } void left_back() //左後退を定義 { OnFwd(OUT_C); Wait(BACK_TIME); Off(OUT_C); } void right_back() //右後退を定義 { OnFwd(OUT_A); Wait(BACK_TIME); Off(OUT_A); } void back() //後退を定義 { OnFwd(OUT_AC); Wait(GO_TIME); Off(OUT_AC); } void go_straight() //直進を定義 { OnRev(OUT_AC); Wait(GO_TIME); Off(OUT_AC); } void go_right() //右折を定義 { OnRev(OUT_A); Wait(BACK_TIME); Off(OUT_A); } void arm_up() //アームアップを定義 { OnRev(OUT_B); Wait(UP_TIME); Off(OUT_B); } void arm_down() //アームダウンを定義 { OnFwd(OUT_B); Wait(2); //最初に勢いをつけて、 Float(OUT_B); Wait(DOWN_TIME); //あとは自重で下ろす。 } void shita_yose() //下方向への幅寄せを定義 { turn_right(10); //右旋回 back(); //後退 turn_left(10); //左旋回 } void ue_yose() //上方向への幅寄せを定義 { turn_left(10); //左旋回 back(); //後退 turn_right(10); //右旋回 } task main() //ここからメインプログラム { turn_right(165); //輪郭 repeat(2){ //髪始め right_back(); left_back(); } right_back(); //髪終わり arm_up(); go_right(); //位置調整 shita_yose(); repeat(2){ //目始め go_straight(); arm_down(); go_straight(); arm_up(); } //目終わり repeat(2){ ue_yose(); //位置調整 go_straight(); } turn_left(20); arm_down(); turn_left(15); //口 arm_up(); back2(8); //位置調整 arm_down(); turn_right(6); //鼻 arm_up(); }
sub pen_up() //ペンを上げる { OnRev(OUT_B); Wait(12); Off(OUT_B); } sub pen_down() //ペンを下げる { OnFwd(OUT_B); Wait(5); Float(OUT_B); Wait(100); } sub hanten(){ //180度回転 OnRev(OUT_A); OnFwd(OUT_C); Wait(90); Off(OUT_A+OUT_C); } sub tyokkaku(){ OnFwd(OUT_A); //90度回転 OnRev(OUT_C); Wait(45); Off(OUT_A+OUT_C); } sub susumu(){ //前進 OnFwd(OUT_A+OUT_C); Wait(11); Off(OUT_A+OUT_C); } task main(){ pen_up(); tyokkaku(); pen_down(); //輪郭 hanten(); pen_up(); //輪郭終わり tyokkaku(); //移動 susumu(); pen_down(); //口 OnFwd(OUT_A); OnRev(OUT_C); Wait(12); Off(OUT_A+OUT_C); OnRev(OUT_A); OnFwd(OUT_C); Wait(24); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(12); Off(OUT_A+OUT_C); pen_up(); //口終わり susumu(); //移動 pen_down(); //鼻 susumu(); pen_up(); //鼻終わり tyokkaku(); //移動 Off(OUT_A+OUT_C); pen_up(); susumu(); susumu(); pen_down(); //目 susumu(); pen_up(); //目1回 susumu(); pen_down(); //目 susumu(); pen_up(); susumu(); susumu(); //目2回 Off(OUT_A+OUT_C); //完成:-) }
円の半径がずれて、輪郭や髪が中途半端になってしまった。口も斜めになってしまったが、これはこれで斜めから見たようにみえるので(たぶん)OKである。
最後に、コメントがあれば是非書き込んでいってください。