[[2019a/Member]]
目次
#contents
*課題について [#f2d9f52e]
詳しくはリンクを参照[[2019a/Mission1]]
*ロボットについて [#p4a42e1a]
私達はプログラムのしやすさを優先して,縦横移動の組み合わせで文字を書くロボットを制作した.今回私達が決めた文字は「信州」である.
&ref(2019a/Member/Yuta/Mission1/s_IMG_3308.jpg);
↑本体を後ろから撮影した図
#ref(./s_IMG_3307.jpg)
↑本体を前から撮影した図
-縦横移動を実現させるために,ベースとなる車体で前後に動き,そのレール上を左右に動く機構を取り付け,その機構にペンを昇降させるパーツを取り付けた.
-ペンは,線がかける高さの範囲が広い筆ペンを使用した.
-下に来ているベースの車体は,材料の関係上ひとつの動力しか使えないので,片側につけたモーターの動力を左右まんべんなく伝えるための機構を施した
(後ろから撮影した図を参照)
-ペン昇降を一つのモーターでスムーズに,安定して行えるように,平行四辺形の一角をモーターで回転させることによりペンを昇降できる機構を取り入れた.
(前から撮影した図を参照)
-NXT本体が邪魔にならないようベース車体と固定,本体自体にも前後移動についていけるように車輪を取り付けた.
(後ろから撮影した図を参照)
#ref(./s_IMG_3332.jpg)
↑実際このロボットであとから記載するプログラムを使用し書いた「信州」の文字
*プログラムについて [#ve54d41c]
-プログラミングをわかりやすく行うために,#defineやvoidなどを用いたマクロを定義した.
penUP,penDWNはそれぞれ筆ペンを上下させる動き,
ue,shita,migi,hidariは字の向きに機体をそれぞれ上,下,右,左させる動き,
nanameLD,nanameRDは時の向きに機体をそれぞれ斜め左下(Left&Down),斜め右下(Right&Down)の動きに対応している.
また,機体の動きを,サブルーチンのvoidにintより大きな数を扱えるlongの関数(ここではtとしている)を用いて表し,
その関数を動作のあとのWaitに組み込むことでその関数の時間だけサブルーチンが動くようにすることで,
同じ定義で様々な長さの動きに対応でき,各段階での微調整が可能になった.
たとえば,ue(1000);とすると上方向に1秒(1/1000秒単位なので)移動する.
#define penUP OnRev(OUT_A,40);Wait(1000);
#define penDWN OnFwd(OUT_A,40);Wait(1000);
void shita(long t)
{
OnFwd(OUT_C,20);
Wait(t);
Off(OUT_C);
}
void ue(long t)
{
OnRev(OUT_C,20);
Wait(t);
Off(OUT_C);
}
void migi(long t)
{
OnRev(OUT_B,20);
Wait(t);
Off(OUT_B);
}
void hidari(long t)
{
OnFwd(OUT_B,20);
Wait(t);
Off(OUT_B);
}
void nanameLD(long t)
{
OnFwd(OUT_B,16);
OnFwd(OUT_C,20);
Wait(t);
Off(OUT_BC);
}
void nanameRD(long t)
{
OnRev(OUT_B,20);
OnFwd(OUT_C,20);
Wait(t);
Off(OUT_BC);
}
task main()
{
hidari(1379);
penDWN;
nanameLD(638);//1to2
penUP;
shita(2340);//2to3
penDWN;
shita(319);//3to4
penUP;
shita(638);//4to5
migi(310);//4to5
penDWN;
ue(1596);//5to6
penUP;
ue(638);//6to7
penDWN;
ue(1489);//7to8
penUP;
migi(310);//8to9
shita(2965);//8to9
penDWN;
shita(319);//9to10
penUP;
shita(638);//10to11
migi(310);//10to11
penDWN;
ue(1596);//11to12
penUP;
migi(510);//12to13
shita(638);//12to13
penDWN;
shita(319);//13to14
penUP;
shita(738);//14to15
migi(310);//14to15
penDWN;
ue(1596);//15to16
penUP;
ue(638);//16to17
penDWN;
ue(800);//17to18
hidari(941);//18to19
shita(800);//19to20
migi(941);//20to21
penUP;
ue(864);//21to22
penDWN;
hidari(941);//22to23
penUP;
ue(419);//23to24
penDWN;
migi(941);//24to25
penUP;
ue(419);//25to26
penDWN;
hidari(941);//26to27
penUP;
ue(419);//27to28
migi(419);//27to28
penDWN;
nanameRD(212);//28to29
penUP;
Off(OUT_ABC);
}
-よく用いるコマンドをdefineやvoidなどではじめに定義することによって,プログラミングの作業時間を大幅に節約することができた.
-プログラムを修正する際など見やすくするため,予め文字の各ポイントごとに番号を振り,それに対応する行に//で番号を記述した.
(下の画像を参照)
#ref(./program.jpg)
例えば,画像の水色の字で書かれた�,�ら�△飽榮阿垢覺屬離廛蹈哀薀爐砲蓮�
プログラムの後ろに//1to2と書かれている.
-実際に文字を書く際,スタートの位置を合わせやすいようにするため,ベース車体の上の左右に動く機構を一番右に設定して
スタートするとちょうど良い位置から書き始めるように,はじめに左移動のプログラムを入れた.
-文字の長さや間隔をvoid内のwaitで管理しているのだが,多くの場面で同じ長さ・間隔を使用することで,
wait時間の算出回数を大幅に減らした.
例えば,州の2,4,6角目の長さを揃えるなど.
(電池の残り具合やモーターの性能差から,同じ長さの文字でも必ずしも同じ時間で動くわけではないので,
微調整のためWaitの値が異なる点があるので注意)
-縦横軸を揃えることで無駄な動きを少なくした