目次

課題について

課題については課題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.書き終えた位置(水色の点)の上に右のタイヤが乗るように前進する。

1

OnFwd(OUT_B,52);
OnFwd(OUT_C,50);
Wait(550);
Off(OUT_BC);

2.右のタイヤを中心に回転する。

2

OnFwd(OUT_C,50);
Wait(1020);
Off(OUT_C);

3.書き終えた位置にペン先が来るように後進する。

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画目の長さをもう少し長くいた方が良かったかもしれない。

感想

今回の課題はペアによって、車にアームを取り付けたものにするか、縦と横方向に動きを分けたものにするかに分かれた。私のペアは車にアームを取り付けるタイプにした。制作してみると、マシン自体はペンをどう取り付けるかというポイントさえクリアできれば良かったが、プログラムが難しかった。特に、正確に直角に曲がるための秒数の試行錯誤や、回転したときのペンの位置の誤差の修正は、車タイプにしたが故の大きな課題であった。また、ペア以外の人のプログラムを見ると、自分のプログラムはもっと簡単なものにできると感じたので、次回の課題では、プログラムの簡素化を目標に取り組んでいきたい。


添付ファイル: file書き順.jpg 74件 [詳細] file文字.JPG 66件 [詳細] file3.jpg 107件 [詳細] file2.jpg 89件 [詳細] file1.jpg 160件 [詳細] fileペンの誤差.JPG 77件 [詳細] fileペン先ータイヤ.JPG 71件 [詳細] fileロボット分解.JPG 80件 [詳細] fileロボット側面.JPG 78件 [詳細] fileロボット前面.JPG 76件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-23 (火) 18:56:06