2019a/Member

目次

課題について

詳しくはリンクを参照2019a/Mission1

ロボットについて

私達はプログラムのしやすさを優先して,縦横移動の組み合わせで文字を書くロボットを制作した.今回私達が決めた文字は「信州」である.

s_IMG_3308.jpg

↑本体を後ろから撮影した図

s_IMG_3307.jpg

↑本体を前から撮影した図

  • 縦横移動を実現させるために,ベースとなる車体で前後に動き,そのレール上を左右に動く機構を取り付け,その機構にペンを昇降させるパーツを取り付けた.
  • ペンは,線がかける高さの範囲が広い筆ペンを使用した.
  • 下に来ているベースの車体は,材料の関係上ひとつの動力しか使えないので,片側につけたモーターの動力を左右まんべんなく伝えるための機構を施した

(後ろから撮影した図を参照)

  • ペン昇降を一つのモーターでスムーズに,安定して行えるように,平行四辺形の一角をモーターで回転させることによりペンを昇降できる機構を取り入れた.

(前から撮影した図を参照)

  • NXT本体が邪魔にならないようベース車体と固定,本体自体にも前後移動についていけるように車輪を取り付けた.

(後ろから撮影した図を参照)

s_IMG_3332.jpg

↑実際このロボットであとから記載するプログラムを使用し書いた「信州」の文字

プログラムについて

  • プログラミングをわかりやすく行うために,#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などではじめに定義することによって,プログラミングの作業時間を大幅に節約することができた.
  • プログラムを修正する際など見やすくするため,予め文字の各ポイントごとに番号を振り,それに対応する行に//で番号を記述した.

(下の画像を参照)

program.jpg

例えば,画像の水色の字で書かれた,ら△飽榮阿垢覺屬離廛蹈哀薀爐砲蓮

プログラムの後ろに//1to2と書かれている.

  • 実際に文字を書く際,スタートの位置を合わせやすいようにするため,ベース車体の上の左右に動く機構を一番右に設定して

スタートするとちょうど良い位置から書き始めるように,はじめに左移動のプログラムを入れた.

  • 文字の長さや間隔をvoid内のwaitで管理しているのだが,多くの場面で同じ長さ・間隔を使用することで,

wait時間の算出回数を大幅に減らした.

例えば,州の2,4,6角目の長さを揃えるなど.

(電池の残り具合やモーターの性能差から,同じ長さの文字でも必ずしも同じ時間で動くわけではないので,

微調整のためWaitの値が異なる点があるので注意)

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

添付ファイル: fileprogram.jpg 11件 [詳細] files_IMG_3332.jpg 11件 [詳細] files_IMG_3308.jpg 11件 [詳細] files_IMG_3307.jpg 13件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-07 (日) 17:05:40 (43d)