[[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の値が異なる点があるので注意)

-縦横軸を揃えることで無駄な動きを少なくした

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS