4. LED に動きを付けてみよう


回る光

以下のように LED の光り方を変えて回っているようにしたいと思います。

各パターンの色を指定して人の目に映るよう少し止まればいいので、 おそらくこんな感じのプログラムになるかと思います。

START:
  leda 7 0 0
  ledb 0 7 0
  ledc 0 0 7
  ledd 0 0 0
  wait 25
  leda 0 7 0
  ledb 0 0 7
  ledc 0 0 0
  ledd 7 0 0
  wait 25
  leda 0 0 7
  ledb 0 0 0
  ledc 7 0 0
  ledd 0 7 0
  wait 25
  leda 0 0 0
  ledb 7 0 0
  ledc 0 7 0
  ledd 0 0 7
  wait 25
  jmp START

とはいえ、これは少し書くのが面倒臭いですね。 もっとシンプルに書きたいものです。そんな時便利なのが ledchg という命令です。 ledchg は四つの引数を持ちます。各引数は a,b,c,d という文字で指定でき

という意味を持ちます。なので

が実現できます。

ledchg を使うと先ほどと同じ動きをするプログラムは以下のように短く簡単に書くことができます。

  leda 7 0 0
  ledb 0 7 0
  ledc 0 0 7
  ledd 0 0 0
MAIN:
  wait 25
  ledchg b c d a
  jmp MAIN

逆転する光

上のプログラムの動きを追いかけると

  1. leda 7 0 0

    左上の LED を赤くする

  2. ledb 0 7 0

    左下の LED を緑にする

  3. ledc 0 0 7

    右下の LED を青くする

  4. ledd 0 0 0

    右上の LED を黒くする

  5. MAIN:

    この位置を 'MAIN' という名前にする

  6. wait 25

    0.02 x 25 = 0.5 秒停止する

  7. ledchg b c d a

    光を時計回りに入れ替える

  8. jmp MAIN

    'MAIN' と名付けた行、すなわち 6 行目に飛ぶ

となっていました。すなわち 6〜8 行目を延々と繰り返すことで光が回転していました。

さてここで、例えば 5 回時計周りに回転したら、今度は逆に 5 回回転するといったことをさせようとしたらどうでしょうか。 6〜8 行の中には「今何回回っている」という情報が無いので実現が難しそうです。

そういう時に役立つのが loop という命令です。loop という命令は引数で指定された回数だけ lend までの間をぐるぐる繰り返します。 光が 1 回転するのに ledchg は 4 回必要ですから、5 回転なら 20 回の ledchg が必要です。そこで

  leda 7 0 0
  ledb 0 7 0
  ledc 0 0 7
  ledd 0 0 0
MAIN:
  loop 20
    wait 25
    ledchg b c d a
  lend
  loop 20
    wait 25
    ledchg d a b c
  lend
  jmp MAIN

と書くと 5 回転ずつ時計回りと半時計周りを繰り返すようになります。

変化する色

ledinc や leddec を使うと、特定の LED の特定の色の輝度を一段階上げたり下げたりすることができます。LED の指定は a (左上)、b (左下)、c (右下)、d (右上)、 色の指定は r (赤)、g (緑)、b (青)、a (全色) です。 早速サンプルを見てみましょう。

  leda 7 0 0
  ledb 0 7 0
  ledc 0 0 7
  ledd 0 0 0
MAIN:
  loop 7
    wait 5
    ledinc a g
    ledinc b b
    ledinc c r
    ledinc d a
  lend
  loop 7
    wait 5
    leddec a r
    leddec b g
    leddec c b
    leddec d a
  lend
  ledchg c a b d
  jmp MAIN

左上の LED (A) は最初 7 0 0 と赤ですが最初のループで 7 1 0, 7 2 0 と緑成分が増えていき最終的に 7 7 0 という黄色になります。 そして二つ目のループで 6 7 0, 5 7 0 と赤成分が減っていき最終的には 0 7 0 と緑になります。同様に左下の LED (B) は緑からはじまって水色になり青に、 右下の LED (B) は青からはじまって紫になって赤へと色が変化します。 最後の ledchg で色を元に戻しています。

ledinc や leddec は輝度を今のものから一段階上げたり下げたりするものでしたが、 ledset を使うと今の状態に関わらず任意の値にすることができます。 ledset を使ったサンプルを以下に示します。 言葉での説明の代わりに C 言語的に書いた等価コードを併記しますので解読の参考にしてください。

  ledz 0 0 0
MAIN:
  loop 8
    loop 8
      loop 8
        wait 10
        ledchg a a b c
        ledinc a r
      lend
      ledset a r 0
      ledinc a g
    lend
    ledset a g 0
    ledinc a b
  lend
  ledset a b 0
  jmp MAIN
A.r=A.g=A.b=B.r=B.g=B.b=C.r=C.g=C.b=D.r=D.g=D.b=0;
for(;;){
  for (i=0;i<=8;i++){
    for (j=0;j<=8;j++){
      for (k=0;k<=8;k++){
        Sleep(10);
        D=C; C=B; B=A;
        A.r++;
      }
      A.r=0;
      A.g++;
    }
    A.g=0;
    A.b++;
  }
  A.b=0
}


[戻る]