目次
#contents
*1、ロボットの概要 [#t5eff1aa]
#ref(2016b/Member/ats/Mission1/view.gif,50%,全体像(手前が先頭))
今回作成したロボットは、x軸方向(左右)の動力とy軸方向(前後)の動力でペンを操作する方式である。この方式にしたのは、紙面上を動き回る方式に比べて速く、正確に、比較的簡単なプログラムで字を書くことができると考えたからだ。そして今回、私のペアが書いた字は「前」と「期」で、私は「前」のプログラムを担当した。下の写真はその字である。
#ref(2016b/Member/ats/Mission1/finish.jpg,50%,前)
*2、本体について [#w0f9eff2]
**�‖羲屐柄宛絨榮亜� [#hb640575]
台車は本体の一番下の部分で4つのタイヤを備えている。また、ペンの前後移動を行うための動力であるので一つのモーターを使用して移動する。モーターとタイヤの図は以下のとおりである。
#ref(2016b/Member/ats/Mission1/daisha.jpg,50%,図)
1、での全体像の写真を見てもわかるように、レールが右側に偏っている。これは台車のタイヤが紙面に乗らないようにするためである。そのため、バッテリーボックスは台車後方に左側に偏るように設置されていて、これによって本体が右に傾くことを防いでいる。
**�▲譟璽襦丙険Π榮亜� [#v4f5bb99]
レールはペンがついているアームを左右に移動させるための部分である。1つのモーターで動いている。レールは左下の写真のように、2つのモーターに接続されたタイヤと2つのタイヤの計4つのタイヤで構成されている。また、右下の写真のようにアームの左右に壁を設置して(写真では撮影のために手前の壁をとってある)上からアームを押さえることで、アームがレールから落ちないようにし、かつモーターの動きをより確実にアームに伝えられるようにしてある。また、レールは本体の前後のバランスを保つために台車の前輪の真上に設置されている。
&ref(2016b/Member/ats/Mission1/x_rail.gif,50%,上から見たレール); &ref(2016b/Member/ats/Mission1/x_naka.gif,50%,中の構造);
**��アーム(ペンの上げ下げ) [#r0e1068e]
アームにはペンがついていて、レールの上に乗っている。アームにはペンを上げ下げするために1つのモーターがついている。1、の全体の写真を見てもわかるようにアームは長いので、バランスをよくするためにペンを右側に、モーターを左側に設置して両方を長い軸で結んでいる。
&ref(2016b/Member/ats/Mission1/pen_left.gif,50%,左側); &ref(2016b/Member/ats/Mission1/pen_right.gif,50%,右側);
台車やレールと違い、ペンを上げ下げするという動作はゆっくり行う必要がある。そのため上の写真を見てもわかるように多くのギアを使用してモーターの高速回転を遅い速さでペンに伝えるようにした。
*3、プログラムについて(RIS) [#ua9e9968]
プログラムの過程としては最初の斜め線を描いた後、長い横線を書き、月→リの順に書いた。
字を書くにあたっての基礎になる、ペンを上げ下げするプログラムは以下のものとした
#define PEN_TIME 100 //ペンを動かす時間
#define PEN_UP OnFwd(OUT_C);Wait(PEN_TIME);Off(OUT_C); //ペンを上げる(書き終わり)プログラム
#define PEN_DOWN OnRev(OUT_C);Wait(PEN_TIME);Off(OUT_C); //ペンを下げる(書き始め)プログラム
**⑴最初の斜め線 [#md3a16e9]
#ref(2016b/Member/ats/Mission1/finish (2).jpg,100%,)
#define SHORT_LINE_TIME 10 //線の長さを設定
#define NANAME_R PEN_DOWN;OnRev(OUT_AB);Wait(SHORT_LINE_TIME);Off(OUT_AB);PEN_UP; //�,寮�を引くためのプログラム
#define NANAME_L PEN_DOWN;OnFwd(OUT_A);OnRev(OUT_B);Wait(SHORT_LINE_TIME);Off(OUT_AB);PEN_UP; //�△寮�を引くためのプログラム
sub MAE_START()
{
OnRev(OUT_B);
Wait(20);
Off(OUT_B); //初期位置から�,寮�の始点に移動するプログラム
NANAME_R;
OnRev(OUT_B);
Wait(10);
Off(OUT_B); //�,寮�の終点から�△寮�の始点に移動するプログラム
NANAME_L;
}
今回は「前」の一番長い横線より先に斜めの線(�´◆砲鮟颪い拭�これは、上から書くことで移動の距離を減らして正確性を向上させるためだ。しかし、�,寮�の始点はこの後の長い横線より右側にある。そこで�,寮�を書くまえにペンを右に動かすプログラムを書いた。こうすることでアームの初期位置を左側の限界にできるようにして初期位置の調整を簡略化した。また、その間は台車は動かないのでプログラム開始ボタンを押したときの本体の動きへの影響をなくした。ちなみに、「NANAME_R」と「NANAME_L」は「期」の方でも使用されている。
今回は「前」の一番長い横線より先に斜めの線(�´◆砲鮟颪い拭�これは、上から書くことで移動の距離を減らして正確性を向上させるためだ。しかし、�,寮�の始点はこの後の長い横線の左端より右側にある。そのため長い横線を書く際に途中で動作域を超えないように調整しなければならい。そこで�,寮�を書くまえにペンを右に動かすプログラムを書いた。こうすることで問題なく字を書けるようにした。また、アームの初期位置を左側の限界にできるようにして初期位置の調整を簡略化した。また、その間は台車は動かないのでプログラム開始ボタンを押したときの本体の動きへの影響をなくした。ちなみに、「NANAME_R」と「NANAME_L」は「期」の方でも使用されている。
**⑵長い横線(3画目) [#g25c03d1]
#ref(2016b/Member/ats/Mission1/finish (3).jpg,100%,)
task main()
{
OnRev(OUT_AB);
Wait(10);
Off(OUT_A);
Wait(10);
Off(OUT_B); //⑴の�△寮�から長い横線の始点に移動するプログラム
PEN_DOWN;
OnFwd(OUT_B);
Wait(70);
Off(OUT_B);
PEN_UP; //長い横線を右側から書くプログラム
}
�△寮�を書き終えたとき、ペンは右寄りにあり、長い横線のあとは月を書く。移動距離をなるべく少なくするためにも、この横線は本来とは逆の右から書くことにした。
**⑶月 [#t7be6d6d]
#ref(2016b/Member/ats/Mission1/finish (4).jpg,100%,赤線は書くところ、青線は書かずに移動するところ)
#define FORWARD(FWD_TIME) OnFwd(OUT_A);Wait(FWD_TIME);Off(OUT_A); //前に移動するプログラム
#define BACK(back_time) OnRev(OUT_A);Wait(back_time);Off(OUT_A); //後ろに移動するプログラム
void TSUKI (int t)
{
PEN_DOWN;
BACK(3*t);
PEN_UP; //月の1画目を書くプログラム
OnRev(OUT_B);
Wait(t);
Off(OUT_B); //月の1画目の終点から2画目の始点に移動
PEN_DOWN;
FORWARD(3*t);
PEN_UP; //2画目を書くプログラム(下から上)
repeat(3) //月の3本の横線を書くプログラム
{
PEN_DOWN;
OnFwd(OUT_B);
Wait(t+3);Off(OUT_B);
PEN_UP; //横線を引くプログラム
OnRev(OUT_AB);
Wait(t);
Off(OUT_A);
Wait(3);
Off(OUT_B); //次の横線の始点に移動するプログラム
}
}
task main()
{
OnRev(OUT_AB);
Wait(10);
Off(OUT_A);
Wait(5);
Off(OUT_B); //長い横線の終点から月の部分の始点に移動するプログラム
TSUKI(10);
}
月の部分は上の写真のようにスタート(S)からゴール(G)まで書く。中央部の3本の横線は同じ長さで、かつ等間隔なため「repeat」を使用した。ただし、本体の構造があまり安定していなかったため誤差が生じることが確認された。そのため横移動を0.03秒増やすことでその誤差を解消した。月のプログラムはvoidを使用することによって、t値による大きさの調整ができるようにした。これは「期」にも同じ部分が存在するためだ。
月の部分は上の写真のようにスタート(S)からゴール(G)まで書く。中央部の3本の横線は同じ長さで、かつ等間隔なため「repeat」を使用した。ただし、本体の構造があまり安定していなかったため誤差が生じることが確認された。そのため横移動を0.03秒増やすことでその誤差を解消した。月のプログラムはvoidを使用することによって、t値による大きさの調整ができるようにした。これは「期」にも同じ部分が存在するため、「期」のプログラムにも使用できるようにするためだ。
**⑷リ [#p58b4037]
#ref(2016b/Member/ats/Mission1/finish (5).jpg,100%,赤線は書くところ、青線は書かずに移動するところ)
#define MIGIUE_GO(migiue_time) OnRev(OUT_B);OnFwd(OUT_A);Wait(migiue_time);Off(OUT_AB);
#define BACK(back_time) OnRev(OUT_A);Wait(back_time);Off(OUT_A);
task main()
{
OnRev(OUT_B);
OnFwd(OUT_A);
Wait(15);
Off(OUT_B);
Wait(10);
Off(OUT_A); //月の部分の終点からリの部分の始点に移動するプログラム
PEN_DOWN;
BACK(10);
PEN_UP; //最初の短い線を書くプログラム
MIGIUE_GO(10); //短い線の終点から長い線の始点に移動するプログラム
PEN_DOWN;
BACK(30);
PEN_UP; //最後の長い線を書くプログラム
}
リの部分は、長さが違う2本の線で構成されるので上の写真のように書き順通りに書いた。ちなみに「MIGIUE_GO」は「期」の最初の部分でも使用されている。
*4、まとめ、感想 [#tfa7449a]
今回は、慣れないロボットの組み立てやプログラミングをしたのでうまくできるか不安だったが、これだけの字が書けたので良かったと思う。プログラムに関しては改善の余地があると感じる。また本体に関してはもっと安定した方が良いと感じた。今回の反省を次回以降の課題に活かしていきたいと思う。