目次
今回の課題は以前住んだことのある土地の名前を二文字以上の漢字で書くという課題。自分は「北見」という漢字を書いた。
今回のロボットは、X軸、Y軸で動くロボットを作成した。これにより、ロボットの作成は非常に苦労したがプログラミングの作成や微調整はとても楽にできた。
台車は一般的なX軸Y軸で動くロボットと同じような形をしている。工夫した点は、上に乗るペンロボットが横に倒れたり、脱輪しないように高架の端にストッパーを付けたこと。また、Y軸方向に動きやすくするため高架の先に小さな車輪を付けたが一点でしか支えておらず、下の写真のように傾いてしまったので高架に大きなタイヤを付けてバランスをとった。しかし、完全に改善できたわけではなかった。
個人的にこのペンロボットの作成が最も苦労した。まず、リア側に車輪が4つついてるのは内側の車輪でロボットを動かし、外側の車輪で高架のストッパーに軽く接触させ脱輪やブレを防いだ。フロント側は車輪がついていないが、とくに抵抗はなく動作に問題はなかった。
ペンの回転部分はモーター部分にまっすぐな棒状のパーツを付けたシンプルな構造にした。この場合ペンがベストな力加減で紙に当たらないと字がかすれたり、ペン先の抵抗が大きくなりスムーズに進まなかったりした。この問題は最後まで解決できなかったのでここをもっと改善すれば安定して字が書けたと思う。
はじめは、下の写真のような形をしたロボットだった、しかしペンの位置が高くペンが上下するときにペンロボットが揺れて誤差が大きくなってしまっていた。そのため高さの低い形に改善した。時間はかかったものの、結果パーツも省略もでき、ブレも多少改善もされよかったと思う。
まず、書き順
#define PEN_SPEED 30 //ペンロボットのスピードを定義 #define MAIN_SPEED 30 //台車ロボットのスピードを定義 (どちらも早いとペンロボットのぶれが大きくなり誤差が生じてしまうため遅めに設定) sub yokoR (int time) //ペンロボットをX軸正方向に移動 (引数はこの場合動く時間を指定する) { OnRev(OUT_C,PEN_SPEED); Wait(time); Off(OUT_C); Wait(3000); } sub tateU (int time) //台車ロボットをY軸正方向に移動 { OnRev(OUT_A,MAIN_SPEED); Wait(time); Off(OUT_A); Wait(3000); } sub yokoL (int time) //ペンロボットをX軸負方向に移動 { OnFwd(OUT_C,PEN_SPEED); Wait(time); Off(OUT_C); Wait(3000); } sub tateD (int time) //台車ロボットをY軸負方向に移動 { OnFwd(OUT_A,MAIN_SPEED); Wait(time); Off(OUT_A); Wait(3000); } sub naname () //斜め左下方向に移動 { OnFwd(OUT_A,25); OnFwd(OUT_C,15); Wait(600); Off(OUT_AC); Wait(3000); } sub nanameR () //斜め右上方向に移動 { OnRev(OUT_A,25); OnRev(OUT_C,15); Wait(600); Off(OUT_AC); Wait(3000); } sub pen_down (int kakudo) //ペンを下げる (引数はこの場合動かす角度を指定する) { RotateMotor(OUT_B,10,kakudo); Off(OUT_B); Wait(3000); } sub pen_up (int kakudo) //ペンを上げる { RotateMotor(OUT_B,-10,kakudo); Off(OUT_B); Wait(3000); }
sub nanameは二文字目「見」5画目にのみ使用、sub nanameR(ReverseのR)は5画目の書き始めの場所まで戻るときに使用。
また、動作が終わるたびに慣性でロボットが揺れて誤差の原因になってしまうのですべての動作の最後に停止時間3秒をプログラムしたが、そのせいか書き終えるまで相当な時間がかかってしまった。
このように、基本的な動きをすべてサブルーチンで定義することでタスクメインが非常にシンプルになり、描く線の長さも引数を用いることで適切な時間を設定するだけで調節することができる。
task main () { pen_up (40); pen_down (41); //はじめ手でペンを紙につけようとしてもうまく当たらないことが多かったので、ペンを上げてそれよりちょっと多めに下げる動作を行うことでうまくあたるようにしてみた。 yokoR (300); //一画目 pen_up (40); tateU (300); //二画目に移動 pen_down (40); tateD (800); //二画目 pen_up (40); yokoL (300); //三画目に移動 pen_down (36); yokoR (450); //三画目 pen_up (40); yokoL (100); tateU (770); //四画目に移動 yokoR (230); pen_down (38); tateD (850); //四画目 yokoR (400); pen_up (40); yokoL (380); //五画目に移動 tateU (600); pen_down (40); yokoR (400); //五画目
ここまでが「北」
pen_up (40); yokoL (600); tateD (1000);
二文字目の一画目に移動
pen_down (41); tateD (900); //一画目 pen_up (40); tateU (880); //二画目に移動 pen_down (38); yokoR (500); tateD (900); //二画目 yokoL(500); pen_up (40); tateU (360); //三画目に移動 pen_down (37); yokoR (500); //三画目 pen_up (40); tateU (350); //四画目に移動 pen_down (38); yokoL (500); //四画目 pen_up (40); tateD (570); //五画目に移動 yokoR (180); pen_down (36); naname (); //五画目 pen_up (40); nanameR (); //六画目に移動 yokoR (100); pen_down (38); tateD(400); //六画目 yokoR(450); pen_up (20); }
結果
はじめは基本的に、ペンの上げ下げの角度は40°、同じ長さの線を描くときは同じ時間、という風にしていたのだがそれではうまくいかなかった。理由は、ペンの紙の当たり具合によって摩擦が変化し、同じ時間を指定してもペンが紙に当たっているときとそうでないときで進む距離が変わってきてしまうことにあると思う。また、ペンの重さのせいか、同じ角度でペンを上下させるよう指定しているのにだんだんペンが下がりすぎるようになってしまっていた。そのためロボットを走らせては引数を微調整してきれいな字を書けるようにした。結果うまくいくときもあったが本番ではうまくいかなかった。この不安定さはロボットとして致命的だと思うので良いロボットができたとは言えない。今回の課題はロボットの制作に時間を費やした割には課題の多いものとなってしまった。次回は今回の反省点も生かして効率よく良いロボットを完成させたい。