- 追加された行はこの色です。
- 削除された行はこの色です。
*書道ロボット [#o5bd7aa3]
*課題1「書道ロボットの作成」レポート [#o5bd7aa3]
#contents
**1 ロボット [#m49b12b9]
***本体の概要 [#p6fbb454]
#ref(2017b/Member/smith/Mission1/kadai1-1.JPG,50%,作成したロボット)
・このロボットは、掲載ガイドにあるモータ2つで4輪のタイヤを動かすロボットをベースに作成し、本体が車のように直接動いてその軌跡を本体の上にあるペンで描くようにしている。モータAは左の2つのタイヤ、モータCは右の2つのタイヤ、モータBはペンに対応している。しかし、ペンが本体の重心より前にあるので、その補正をしないといけないことや、動かす度にタイヤの摩擦など様々な要因で補正値が変動するなど、いくつかの欠点を持っている。また、今回書いた文字は「上町」である。
***ペンの動作 [#jb4f7c84]
#ref(2017b/Member/smith/Mission1/kadai1-5.jpg,50%,ペンの機構)
・ペンは、図のように書くときにアームが下がり、書かないときは上がるというようなシンプルな機構にしている。中途半端な位置でモータを止めるとペンが上げきれなかったり、勢いをつけすぎるとこの機構のモータが本体から外れたりしたのでその調整が必要だった。
***ペンの軌跡の補正 [#yd61123c]
&ref(2017b/Member/smith/Mission1/kadai1-6.jpg,50%,ロボットの動き);
&ref(2017b/Member/smith/Mission1/kadai1-7.jpg,50%,ロボットの軌跡);
&ref(2017b/Member/smith/Mission1/1-8.jpg,50%,ペンの軌跡);
&ref(2017b/Member/smith/Mission1/kadai1-9.jpg,50%,補正方法);
・上図のロボットの軌跡を赤線、ペンの軌跡を青線とすると、曲がるときにロボットの動きそのままで書くと上図上段右のように少し変な描写になる。これを防ぐために、上図下段のように手前でペンを上げで余分に進み、曲がった後少し後退してからペンを下げる手順が必要になった。
***書く漢字の単純化 [#f0e7f061]
#ref(2017b/Member/smith/Mission1/kadai1-10.jpg,50%,単位);
・書く文字を単純化するために、上図のように長さの基準を作り、それをもとにして各線の長さは基準の何倍というような考え方をした。これにより少しはプログラムを楽に組めるようになった。
**2 プログラミング [#u9df1c12]
***基本動作 [#v2ecc7c8]
・まず、動作の基礎となる本体の前進、後退、右・左折、ペンの上げ下げのプログラムを組んだ。
#define F 80 //文字の交差でペンの描写が直角になるように入れる補正の余分に前進する時間
#define B 90 //文字の交差でペンの描写が直角になるように入れる補正の曲がった後に後進する時間
#define W 95 //直角に曲がる時間
#define right OnFwd(OUT_AC);Wait(F);Off(OUT_AC);OnFwd(OUT_A);OnRev(OUT_C);Wait(W);Off(OUT_AC);OnRev(OUT_AC);Wait(B);Off(OUT_AC); //右折するプログラム
#define left OnFwd(OUT_AC);Wait(F);Off(OUT_AC);OnFwd(OUT_C);OnRev(OUT_A);Wait(W);Off(OUT_AC);OnRev(OUT_AC);Wait(B);Off(OUT_AC); //左折するプログラム
#define straight(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //前進するプログラム(tは前進する時間)
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); //後進するプログラム(tは後進する時間)
#define up OnFwd(OUT_B); //ペンを上げるプログラム
#define down OnRev(OUT_B); //ペンを下げるプログラム
・1〜3行目の数値は上から、ペンの補正のために本体を余分に進む時間、ペンの補正のために本体を後退させる時間、直角に曲がるのにかかる時間を表している。
・4,5行目は、本体が右・左折するプログラムで、それぞれペンの補正のために余分に進んだあと、90度に右・左折し、また補正のために後退するようになっている。
#define F 80
#define B 90
#define W 95
#define right OnFwd(OUT_AC);Wait(F);Off(OUT_AC);OnFwd(OUT_A);OnRev(OUT_C);Wait(W);Off(OUT_AC);OnRev(OUT_AC);Wait(B);Off(OUT_AC);
#define left OnFwd(OUT_AC);Wait(F);Off(OUT_AC);OnFwd(OUT_C);OnRev(OUT_A);Wait(W);Off(OUT_AC);OnRev(OUT_AC);Wait(B);Off(OUT_AC);
#define straight(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);
#define up OnFwd(OUT_B);
#define down OnRev(OUT_B);
・6,7行目は、本体が前進・後退するプログラムでtには進むまたは戻る時間をいれる。
・8,9行目は、ペンの上げ下げをするプログラムである。ペンを上げるときは、モータを止めるとペンの重みでアームごと下がること、ペンを下げるときは、モータを止めるとペンが跳ねて線が点線になることから、両方Bのモータを止めずに動かしている。
***サブルーチン「上」 [#z2154ed9]
・つぎに、実際に文字を書くプログラムを組んだ。2文字を1文字ずつサブルーチンで組み、最後にメインでまとめている。1文字目の「上」はこのように組んだ。
sub kami()
{
up;
straight(30);
left;
down;
down; //手順1はじめ
straight(30); //ペンを下げて0.3秒間前進、その後ペンを上げる
up; //手順1おわり
left; //手順2はじめ
down; //左折してペン下げし、0.5秒待った後に0.3秒間直進
Wait(50);
straight(30);
up;
back(30);
right;
down;
Wait(50);
straight(45);
up;
left;
back(30);
down;
Wait(50);
straight(60);
straight(30); //手順2おわり
up; //手順3はじめ
back(30); //ペンを上げて0.3秒間後退した後右折
right; //手順3おわり
down; //手順4はじめ
Wait(50); //ペンを下げて0.5秒間待った後に0.3秒間前進
straight(30); //手順41おわり
up; //手順5はじめ
left; //ペンを上げ左折した後0.3秒間後退
back(30); //手順5おわり
down; //手順6はじめ
Wait(50); //ペンを下げて0.5秒間待った後に0.6秒間前進
straight(60); //手順6おわり
}
#ref(2017b/Member/smith/Mission1/kadai1-2.jpg,50%,「上」のイメージ)
・「上」の書く順番は、
1、ペンを下げ、直進し、ペンを上げる。
2、左折し、ペンを下げて直進する。
3、ペンを上げ後退し、右折する。
4、ペンを下げて直進する。
5、ぺンを上げ左折し、後退する。
6、ペンを下げて直進する。
となるようにしている。(上の図を参考に)
***サブルーチン「町」 [#he1694f1]
・2文字目の「町」はこのように組んだ。
sub mati()
{
straight(15);
up;
left;
straight(15); //手順1 メインタスクによりペンが下がっているので0.15秒間前進
up; //手順2はじめ
left; //左折してペン下げした後に0.5秒間待って0.45秒間前進
down;
Wait(50);
straight(45);
up;
left;
back(30);
down;
Wait(50);
straight(90);
up;
back(15);
right;
down;
Wait(50);
straight(30);
up;
left;
back(15);
down;
Wait(50);
repeat(4) {
straight(45); //手順2おわり
up; //手順3はじめ
left; //ペン上げして左折した後0.3秒間後退
back(30); //手順3おわり
down; //手順4はじめ
Wait(50); //ペン下げして0.5秒間待った後0.9秒間前進
straight(90); //手順4おわり
up; //手順5はじめ
back(15); //ペン上げして0.15秒間後退した後右折
right; //手順5おわり
back(15); //手順6 0.15秒間後退
down; //手順7はじめ
Wait(50); //ペン下げして0.5秒間待った後0.3秒間前進
straight(30); //手順7おわり
up; //手順8はじめ
left; //ペン上げして左折した後0.15秒間後退
back(15); //手順8おわり
down; //手順9はじめ
Wait(50); //ペン下げして0.5秒間待つ
repeat(4) { //0.3秒間前進してペン上げした後左折し、ペン下げして0.5秒間待つのを4回繰り返す
straight(30);
up;
left;
down;
Wait(50);
Wait(50); //手順9おわり
}
}
#ref(2017b/Member/smith/Mission1/kadai1-3.jpg,50%,「町」のイメージ)
・「町」の書く順番は
1、「上」を書いたあとにペンを上げ、延長上を前進したあとペンを下げ、前進する。
2、ペンを上げ左折し、ペンを下げて前進する。
3、ぺンを上げ左折し、そのまま後退する。
4、ぺンを下げ前進する。
5、ぺンを上げ後退し、右折する。
6、そのまま後退する。
7、ペンを下げ前進する。
8、ペンを上げ左折し、後退する。
9〜12、ペンを下げ前進し、ペンを上げ左折する行動を4回繰り返す
となるようにしている。(「上」と同様、上の図を参考)
***メインタスク [#ad17dc20]
・そして、2つのサブルーチンをメインで合体させる。
task main()
{
kami();
up;
kami(); //「上」のサブルーチン
up; //ペンを上げて0.6秒間前進
straight(60);
down;
down; //ペンを下げて0.5秒間待つ
Wait(50);
mati();
Off(OUT_B);
mati();//「町」のサブルーチン
Off(OUT_B); //本体の停止
}
これが今回作ったプログラムである。
**3、実行結果と課題 [#j13158fe]
・上記のように作ったロボットを実行した結果がこれである。
#ref(2017b/Member/smith/Mission1/kadai1-4.JPG,50%,実行結果)
・1で書いたように動かす度に補正値が変動してしまい、その調整がうまくいかずに本番では文字が崩れてしまった。思った通りの文字を書くためにはそういった補正値ができるだけ変動しないようなロボット本体の改造が必要だと思われる。例えば、今回使った大きめのタイヤは、地面の材質やタイヤのゴミの付着などにより、動かす度にコンディションが違ってくる。それを最小にするためにタイヤの数を減らしたり、タイヤのいくつかのゴムを外したりすればいいかもしれない。このような今回出た問題点を次の課題に活かしていきたいと思う。