課題については課題1を参照。
一人暮らしには、何事にも判断が必要になるということで「判」という字を選んだ。
今回のロボットは最初に取扱説明書に書いてあった車に筆ペンを稼働させるアームを取り付けた構造にした。筆ペンの固定方法に関しては、一番上のバーで筆ペンが書くときに上方向の移動を、側面4本のバーと輪ゴムで左右と下方向の移動を抑えている。
また、ペンの先の延長線上にタイヤがあるようにしている。このようにした理由は後述の【プログラムについて/回転時】で説明する。
さらに上の写真のように、ロボット本体とアーム部分の分解を容易にすることで、収納ケースへの収納やアームの微調整をしやすくしている。
ロボットでの書き順は、本来の書き順ではなくこのようにした。
ロボットが直進する際にアーム部分の重さによって、左右同じ出力にすると前進した際に徐々に右に曲がってしまう。そこで、左右の出力を
OnFwd(OUT_B,27); OnFwd(OUT_C,24);
というように違う値にすることによって、なるべく真っ直ぐ進むようにした。
また、進む時間を
#define STRAIGHT_TIME_0 0 #define STRAIGHT_TIME_1 114 #define STRAIGHT_TIME_2 228 #define STRAIGHT_TIME_3 342 #define STRAIGHT_TIME_4 456 #define STRAIGHT_TIME_5 570 #define STRAIGHT_TIME_6 684 #define STRAIGHT_TIME_8 912 #define STRAIGHT_TIME_10 1140 #define STRAIGHT_TIME_11 1254 #define STRAIGHT_TIME_12 1368 #define STRAIGHT_TIME_14 1596
と1単位「114」とし、12パターンの秒数を設定した。このようにすることで、後の「task main」のところで、線の長さや書き始めの位置の調整をしやすくした。
ロボットをそのまま回転してしまうと上の写真の部分の長さによって、書き始めの位置に誤差が出てしまうため、次のように回転するようにした。
1.書き終えた位置(水色の点)の上に右のタイヤが乗るように前進する。
OnFwd(OUT_B,52); OnFwd(OUT_C,50); Wait(550); Off(OUT_BC);
2.右のタイヤを中心に回転する。
OnFwd(OUT_C,50); Wait(1020); Off(OUT_C);
3.書き終えた位置にペン先が来るように後進する。
OnRev(OUT_B,52); OnRev(OUT_C,50); Wait(650); Off(OUT_BC);
なお、上に示したプログラムは時計回りに90度回るときのものだが、2の部分でモーターの回転する向きや秒数を変えるだけで、角度や回転の向きの変更が可能である。
今回は「時計回りに90度」・「時計回りに45度」・「反時計回りに90度」・「反時計回りに45度」のプログラムを定義した。
ペンを設置する部分にはそれなりに重さがあるため、ある一定の角度を超えると自然と前に倒れてしまう。そこで、上げるときの出力を大きくすることで対処した。
ペンを上げるプログラム
OnRev(OUT_A,25); Wait(800); Off(OUT_A);
ペンを下げるプログラム
OnFwd(OUT_A,10); Wait(800); Off(OUT_A);
ロボットに送信したプログラムは以下の通り。
#define STRAIGHT_TIME_0 0 #define STRAIGHT_TIME_1 114 #define STRAIGHT_TIME_2 228 #define STRAIGHT_TIME_3 342 #define STRAIGHT_TIME_4 456 #define STRAIGHT_TIME_5 570 #define STRAIGHT_TIME_6 684 #define STRAIGHT_TIME_8 912 #define STRAIGHT_TIME_10 1140 #define STRAIGHT_TIME_11 1254 #define STRAIGHT_TIME_12 1368 #define STRAIGHT_TIME_14 1596 #define pen_down OnFwd(OUT_A,10);\ Wait(800);\ Off(OUT_A);\ #define pen_up OnRev(OUT_A,25);\ Wait(800);\ Off(OUT_A);\ #define turn_right_90 OnFwd(OUT_B,52);\ OnFwd(OUT_C,50);\ Wait(550);\ Off(OUT_BC);\ OnFwd(OUT_C,50);\ Wait(1020);\ Off(OUT_C);\ OnRev(OUT_B,52);\ OnRev(OUT_C,50);\ Wait(650);\ Off(OUT_BC);\ #define turn_left_90 OnFwd(OUT_B,52);\ OnFwd(OUT_C,50);\ Wait(550);\ Off(OUT_BC);\ OnRev(OUT_C,50);\ Wait(1020);\ Off(OUT_C);\ OnRev(OUT_B,52);\ OnRev(OUT_C,50);\ Wait(650);\ Off(OUT_BC);\ #define turn_right_45 OnFwd(OUT_B,52);\ OnFwd(OUT_C,50);\ Wait(550);\ Off(OUT_BC);\ OnFwd(OUT_C,50);\ Wait(510);\ Off(OUT_C);\ OnRev(OUT_B,52);\ OnRev(OUT_C,50);\ Wait(650);\ Off(OUT_BC);\ #define turn_left_45 OnFwd(OUT_B,52);\ OnFwd(OUT_C,50);\ Wait(550);\ Off(OUT_BC);\ OnRev(OUT_C,50);\ Wait(510);\ Off(OUT_C);\ OnRev(OUT_B,52);\ OnRev(OUT_C,50);\ Wait(650);\ Off(OUT_BC);\ #define straight OnFwd(OUT_B,27);\ OnFwd(OUT_C,24);\ #define back OnRev(OUT_B,27);\ OnRev(OUT_C,24);\ task main () { straight; Wait(STRAIGHT_TIME_3); Off(OUT_BC); // 3前進 turn_right_90; // 90度時計 straight; Wait(STRAIGHT_TIME_4); Off(OUT_BC); // 4前進 turn_right_45; // 45度時計 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_2); Off(OUT_BC); // 1画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_2); Off(OUT_BC); // 2前進 turn_right_45; // 45度時計 back; Wait(STRAIGHT_TIME_0); Off(OUT_BC); // 0後進 turn_left_90; // 90度反時計 straight; Wait(STRAIGHT_TIME_3); Off(OUT_BC); // 3前進 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_6); Off(OUT_BC); // 2画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_4); Off(OUT_BC); // 4前進 turn_right_90; // 90度時計 back; Wait(STRAIGHT_TIME_1); Off(OUT_BC); // 1後進 turn_left_90; // 90度反時計 straight; Wait(STRAIGHT_TIME_5); Off(OUT_BC); // 5前進 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_8); Off(OUT_BC); // 3画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_3); Off(OUT_BC); // 3前進 turn_right_90; // 90度時計 straight; Wait(STRAIGHT_TIME_8); Off(OUT_BC); // 8前進 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_14); Off(OUT_BC); // 4画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_14); Off(OUT_BC); // 12前進 turn_right_90; // 90度時計 straight; Wait(STRAIGHT_TIME_6); Off(OUT_BC); // 6前進 turn_left_45; // 45度反時計 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_2); Off(OUT_BC); // 5画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_2); Off(OUT_BC); // 2前進 turn_right_45; // 45度時計 straight; Wait(STRAIGHT_TIME_6); Off(OUT_BC); // 6前進 turn_left_90; // 90度反時計 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_3); Off(OUT_BC); // 6画目 pen_up; // ペン上げる straight; Wait(STRAIGHT_TIME_3); Off(OUT_BC); // 3前進 turn_right_90; // 90度時計 straight; Wait(STRAIGHT_TIME_5); Off(OUT_BC); // 5前進 turn_left_90; // 90度反時計 straight; Wait(STRAIGHT_TIME_2); Off(OUT_BC); // 2前進 pen_down; // ペン下ろす back; Wait(STRAIGHT_TIME_11); Off(OUT_BC); // 7画目 pen_up; // ペン上げる }
タイヤ痕が気になるが、文字は判別できるであろう。7画目の長さをもう少し長くいた方が良かったかもしれない。
今回の課題はペアによって、車にアームを取り付けたものにするか、縦と横方向に動きを分けたものにするかに分かれた。私のペアは車にアームを取り付けるタイプにした。制作してみると、マシン自体はペンをどう取り付けるかというポイントさえクリアできれば良かったが、プログラムが難しかった。特に、正確に直角に曲がるための秒数の試行錯誤や、回転したときのペンの位置の誤差の修正は、車タイプにしたが故の大きな課題であった。また、ペア以外の人のプログラムを見ると、自分のプログラムはもっと簡単なものにできると感じたので、次回の課題では、プログラムの簡素化を目標に取り組んでいきたい。