1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

IchigoJamの新しいWS.LEDとCOPYでピカピカ

IchigoJam BASIC 1.4で実装されたばかりのWS.LED命令。開発者の福野さんお手製の10連フルカラーLEDを頂いたので、ピカピカ光らせてみました。楽しい!
IMG_7788.jpg
WS.LED命令は、赤緑青それぞれの輝度を数値0〜255で配列[0][1][2]にセットして、WS.LED1とすれば一番手前のLEDを光らせることができるというもの。(数値を大きくすると不安定になる。50くらいが無難?)
同じように赤緑青を[3][4][5]にもセットしてWS.LED2とすれば手前から2個分の色を指定できるし、[29]まで全部セットしてWS.LED10とすれば10個全部を色々な色で光らせることができる。

WS.LED命令のクックブック的なの→福野さんのブログ記事

じゃあ手前から先へと色を順送りに動かしてみようと、配列を後ろへ後ろへとコピー。
最初のLEDのRの輝度が[0]に、2番目のLEDのRの輝度が[3]に保存されているので3つ先の配列要素にコピーしていけば色が順繰りに送られていくはず。

FOR I=29 TO 3 STEP -1
[I]=[I-3]
NEXT

みたいにFORを使っても良いけど、COPY命令を使った方が一行で書けて実行速度も速そう。

[0]のアドレスは#800。配列の1要素は2バイトなので[3]は#806。この2つのアドレスをコピー元とコピー先の先頭として指定、コピーする長さは最初の1個を除いたLED9個分x3(RGB)x2バイトで54バイト。

10 CLV
20 COPY #806,#800,54
30 A=INKEY()
40 [0]=A&1*40
50 [1]=A&2*20
60 [2]=A&3*10
70 WS.LED10
80 WAIT5:GOTO20

0〜7キーで色を指定して、手前のLEDから奥へと順に染まっていくプログラムを書いたつもり。しかし実行すると2つめ以降のLEDがすべて同じ色になってしまう…。なぜかというと、COPY命令は先頭から順にコピーするので

FOR I=3 TO 29
[I]=[I-3]
NEXT

と同じこと。[3]=[0]してから[6]=[3]して、[9]=[6]して…結局全部同じになってしまう。

そこで、こうするとうまく行った。

20 COPY #800+58,#800+52,-54

第三引数をマイナスにすることで、メモリアドレスを逆走しながらコピーしてくれる。そうだったらいいなーと思ってやってみたら出来た。ただしその分、アドレス指定は先頭でなく末尾を指定しないとなので計算を間違いやすい。変なとこコピーしないように気をつけよう。例えばLED5個バージョンならこう。

20 COPY #800+28,#800+22,-24

完成したプログラム。

10 CLV
20 COPY #800+58,#800+52,-54
30 A=INKEY()
40 [0]=A&1*40
50 [1]=A&2*20
60 [2]=A&3*10
70 WS.LED10
80 WAIT5:GOTO20

で、満足げにピカピカを眺めていて気づいたのだけれど、手前からじゃなく奥からにすれば簡単なのだった。

10 CLV
20 COPY #800,#806,54
30 A=INKEY()
40 [27]=A&1*40
50 [28]=A&2*20
60 [29]=A&3*10
70 WS.LED10
80 WAIT5:GOTO20

まー手前から奥に行く方が気持ちいいけどね。

自分でも作ってみた。ここでも参考にした福野さんのブログ記事
配線に向きがあるので気をつけよう。10連フルカラーLED楽しくてオススメです。メリークリスマス!
IMG_7786.jpg

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?