目次
課題は、ロボットに七画以上の漢字を書かせることである。
詳しくは課題1を参照
大学生活を表す漢字を選ぶということで、免許を取ろうか迷っている私は「車」という漢字を設定した。
ロボット自体は写真の通り単純な作りにした。本体には手を加えずに、前方にモーターをつけてペンを上下させる構造になっている。
一つ工夫した点は、ペンを外側ではなく内側につけたことだ。本体をそのまま動かすので回転するときはペンがタイヤの中心に近いほうがイメージがしやすくなる。 欠点としては、安定感に乏しく揺れが大きい点と課題には関係がないがペンを装着しにくい点だ。
//OUT_A -> ペンの上げ下げ //OUT_B -> 右側のモーター //OUT_C -> 左側のモーター
//OnFwd -> 前進 //OnRev -> 後退 //Wait -> 動作の時間 //Off -> 停止
#define SPEED 50 // モーターの出力 #define PEN_TIME 200 // ペンの上げ下げの時間 #define STR_TIME 500 // 長い直線の時間 #define HALF_TIME 250 // 短い直線の時間 #define TURN_TIME 520 // 回転の時間
よく使うものを先に定義しておく。 長い直線の時間は「車」の一番上と一番下の横棒の時間。 短い直線の時間は「車」の「日」の部分の時間。
sub pen_down() // ペンを下げる { OnRev(OUT_A,SPEED); Wait(PEN_TIME); Off(OUT_A); } sub pen_up() // ペンを上げる { OnFwd(OUT_A,SPEED); Wait(PEN_TIME); Off(OUT_A); }
この二つは、ペンの上げ下げの動作をあらかじめサブルーチンにしたもの。
sub turn_r() // 右に回転 { Wait(1000); // 時間の猶予 OnFwd(OUT_C,SPEED); OnRev(OUT_B,SPEED); Wait(TURN_TIME); Off(OUT_BC); } sub turn_l() // 左に回転 { Wait(1000); // 時間の猶予 OnFwd(OUT_B,SPEED); OnRev(OUT_C,SPEED); Wait(TURN_TIME); Off(OUT_BC); }
この二つは、それぞれ左右に90度回転するサブルーチン。 「車」という字は、全てが直角になっているため90度に設定した。 また、本体の揺れが回転に影響を与えてしまわないように時間の猶予をあたえた。
sub tunagi_f(int t) // 位置調整の前進 { Wait(1000); // 時間の猶予 OnFwd(OUT_BC,SPEED); Wait(t); Off(OUT_BC); } sub tunagi_r(int t) // 位置調整の後退 { Wait(1000); // 時間の猶予 OnRev(OUT_BC,SPEED); Wait(t); Off(OUT_BC); }
これらは、位置を微調整するために作ったもので、使う場所によって時間が異なるため、直接時間を入力するようにした。
sub kaku1() // 一画目 { pen_down(); OnFwd(OUT_BC,SPEED); Wait(STR_TIME); Off(OUT_BC); pen_up(); tunagi_f(250); turn_r(); tunagi_r(220); }
一画目から二画目の直前までのサブルーチン。 一画目を書いた後、前進し、その後右に90度回転し、後退する。
sub kaku2() // 二画目 { Wait(500); pen_down(); OnFwd(OUT_BC,SPEED); Wait(HALF_TIME); Off(OUT_BC); pen_up(); tunagi_f(100); turn_r(); tunagi_r(150); }
二画目から三画目の直前までのサブルーチン。 二画目を書いた後、同じように前進、右回転、後退する。
sub kaku3() // 三画目 { Wait(500); pen_down(); OnRev(OUT_BC,SPEED); Wait(HALF_TIME); Off(OUT_BC); pen_up(); turn_l(); tunagi_f(150); turn_r(); tunagi_f(50); }
三画目から四画目の直前までのサブルーチン。 三画目を書いた後、左回転、前進、右回転、前進する。
sub kaku4() // 四画目 { Wait(500); pen_down(); OnFwd(OUT_BC,SPEED); Wait(HALF_TIME); Off(OUT_BC); pen_up(); turn_l(); tunagi_f(150); turn_r(); }
四画目から五画目の直前までのサブルーチン。 四画目を書いた後、左回転、前進、右回転する。
sub kaku5() // 五画目 { Wait(500); pen_down(); OnRev(OUT_BC,SPEED); Wait(HALF_TIME); Off(OUT_BC); pen_up(); tunagi_f(650); turn_r(); tunagi_r(150); }
五画目から六画目の直前までのサブルーチン。 五画目を書いた後、前進、右回転、後退する。
sub kaku6() // 六画目 { Wait(500); pen_down(); OnRev(OUT_BC,SPEED); Wait(HALF_TIME); Off(OUT_BC); pen_up(); tunagi_f(200); turn_r(); tunagi_r(500); }
六画目から七画目の直前までのサブルーチン。 六画目を書いた後、前進、右回転、後退する。
sub kaku7() // 七画目 { Wait(500); pen_down(); OnFwd(OUT_BC,SPEED); Wait(STR_TIME); Off(OUT_BC); pen_up(); tunagi_f(200); turn_r(); tunagi_r(250); }
七画目から八画目の直前までのサブルーチン。 七画目を書いた後、前進、右回転、後退する。
sub kaku8() // 八画目 { Wait(500); pen_down(); OnRev(OUT_BC,SPEED); Wait(750); Off(OUT_BC); pen_up(); }
八画目のサブルーチン。
一画目以外のサブルーチンには、揺れの影響を少なくするために時間の猶予を与えた。
task main() { kaku1(); // 一画目 kaku2(); // 二画目 kaku3(); // 三画目 kaku4(); // 四画目 kaku5(); // 五画目 kaku6(); // 六画目 kaku7(); // 七画目 kaku8(); // 八画目 }
メインのプログラムは、一画ずつの確認をしやすくするため簡単なものにした。
概ね「車」と書かせることができたが、ところどころはみ出てしまうときがある。 動くことによってペンが揺れてしまい、回転に影響が出ることがあった。 それ以外にも、ペンが真っ直ぐではなく、円周をなぞるように入っていくので前方に行き過ぎることもあった。 ロボット本体の構造をもう少し工夫できたらよかったと思う。 プログラムについては、二画目から八画目のサブルーチンの最初にあるWait(500)はpen_down()のサブに含めれば少し楽になったと思う。 また、ただ前進するだけのOnFwdではなく、一定距離を進むものや設定した角度で回転するようなものを使えば、より正確な漢字を書くことができただろう。
あまり時間がなく、いろんなプログラムに挑戦することができなかった。 初めてプログラミングをやったので、勝手がよくわからなかったけど、一応完成させることができたのでよかった。 次の課題のときは、できれば一つのプログラムだけではなく、二通り以上のプログラムを作り、その良し悪しを比較してみたいと思った。