目次 #contents *課題 [#h280bf5b] **課題の内容 [#te86bb7f] ロボットにペンを取り付けて七画以上の文字を一文字書かせる。 **文字について [#e4f37a04] ***書かせる字と選んだ理由 [#k332aba1] 「時」を選んだ。大学生は余りある時間をどのように使うか考えさせられるという点と、直角が多く書きやすいのではないかと考えたのが主な理由である。 ***書き順 [#r9b5b947] 当初は書き順通りに書いてみようと試みたものの、負担が大きいためにロボットができるだけ単純な動きをするような書き順にすることにした。実際の書き順は下図のとおりである。 *機体 [#wbcbfae6] **全体 [#n3a3b618] -NXT本体を中心として、左右のタイヤ、後輪、筆ペンの昇降機構などを部品ごと分解できるようにして構成されている。分解できるようにしたのは、持ち運びしやすくするためである。 -タイヤを縦にして取り付けた所謂高床式の構造になっており、それ故のバランスの悪さ、強度の低さをカバーするために左右対称に取り付けた部品をそれぞれつなぐなどして強度を高めている。 -重心は若干後ろにあるために後輪の摩擦が大きくなって回転時の抵抗となってしまったので、もう少し重心の位置や後輪として使う部品を考えればよかったと思う。 **ペンの昇降 [#hdcbb3f6] 何よりも重要視したのはペン先がロボットの回転軸に来るようにすることである。軸からずれてしまうと、回転時に線もずれてしまう。今回製作したロボットの回転軸はちょうどタイヤの間にあったので、NXT上部に取り付けた昇降機構からペンをタイヤの間に潜り込ませるようにした。またブレを最小限にするためにペンを固定する部品とペン先の降下位置を誘導する部品を取り付けた。 *プログラム [#ucc5b263] **時間制御 [#t5dcb937] 最初は回転も直進も時間制御でやろうとした。実際それなりにうまくは行くのだが、電圧の関係でどうしても毎回同じ動きにならなかったため回転とペンの昇降に関しては角度制御することにした。 **角度制御 [#i9a13ffa] 下記のようにまずは各動作を定義した。直進は時間制御だが、Syncを使うことによって。 #define TYOKUSHIN1 OnFwdSync(OUT_BC,30,0);Wait(200);Off(OUT_BC);Wait(1000); #define TYOKUSHIN2(t,s) OnFwdSync(OUT_BC,t,0);Wait(s);Off(OUT_BC);Wait(1000); #define TYOKUSHIN3 OnFwdSync(OUT_BC,30,0);Wait(600);Off(OUT_BC);Wait(1000); #define TURN_L RotateMotorEx(OUT_BC,30,275,100,true,true);Wait(1000); #define UP RotateMotor(OUT_A,30,60);Wait(1000); #define DOWN RotateMotor(OUT_A,-30,60);Wait(1000); **最終的なプログラム(本文) [#qa23a6ca] ***日 [#ed5bdc16] 一筆書きで四角形を描くイメージ。単純な動作であるため安定して綺麗に書くことができた。 task main() { DOWN; TYOKUSHIN2(30,300); TURN_L; TYOKUSHIN2(30,300); TURN_L; TYOKUSHIN3; TURN_L; TYOKUSHIN2(30,300); TURN_L; TYOKUSHIN2(30,350); TURN_L; TYOKUSHIN2(30,300); UP; ***土 [#k79a5b87] 「土」に入る前に「日」の最後の直線からそのままの流れで「寸」の部分の横棒を書き、「土」に向けて方向転換をする。 TYOKUSHIN1; DOWN; TYOKUSHIN3;//「寸」の横棒 UP; TURN_L; TYOKUSHIN1; TURN_L; DOWN; そして最難関の「土」部分。十字の形になっているがゆえ、線と線の間隔のずれに悩まされた。特に右回転時のずれが大きく、前述のように左回りのみすることにした。また、できるだけ回転をしないようにTYOKUSHIN2の変数に代入する値を変えて後退動作を多く組み込んだ。 TYOKUSHIN3; UP; TYOKUSHIN2(-30,300);//縦棒を書く位置まで後退 TURN_L; TURN_L; TURN_L;//右回りの誤差が大きいため左回りで270度旋回 DOWN; TYOKUSHIN2(30,400);//縦棒 UP; TYOKUSHIN2(-30,200);//もう一本の横棒を書く位置まで後退 TURN_L; TYOKUSHIN2(30,300);//横棒の始点に移動 DOWN; TYOKUSHIN2(-30,500);//動作簡略化のためバックで書く UP; ***ハネ、点 [#q10e9de1] 地味にこだわった部分。より人間が書く字に近づけるために工夫した。 TURN_L; TYOKUSHIN2(30,300);//「土」の長い横棒の位置にペン先が降りるように調整 DOWN; TYOKUSHIN3; RotateMotorEx(OUT_BC,30,140,100,true,true);//定義したものと回転角度が異なる Wait(1000); TYOKUSHIN2(-20,300);//ペンを上げずにそのまま書くことで「ハネ」を作った UP; TYOKUSHIN2(-30,300); DOWN; UP;//ただペンを上げ下げするだけにして、「点」らしくした } *書いた字 [#oe3e12ad] **失敗例 [#g5e081b7] **成功例 [#wf1b5c9e] *反省と感想 [#t0342853]