LEDの並び順を変更する

ALEDクラスのscrメンバ変数を変更することで、アニメーションや模様を描写する際のLEDの並び順を変更する方法について解説しました。この機能を使うことで、LEDの配置を意識したイルミネーションを作成できるようになります。

本記事はArduino互換機「CG-CustomARGB」を使ったアドレサブルRGBプログラミングチュートリアルの一部です。

更新日 : 2020年5月19日

LEDの物理的な並び順

まず、LEDの物理的な並び順についてAntec製 Prizm 140 ARGBを例に説明します。以下はLED数確認用スケッチ「LedCount」の動画です。このスケッチは物理的に先頭に位置するLEDから順に点灯していくため、左下に1番目のLEDがあり、そこから半時計回りに2、3、4番目・・と並んでいることが分かります。(向きや表裏によっても変わりますが)

これまでのチュートリアル記事のイルミネーションは、LEDの物理的な並び順に沿って描写されていました。例えば、グラデーション模様を描写する場合は、1番目のLEDを起点に2、3、4番目・・の順に色が変化していきます。移動アニメーションさせる場合は1番目のLEDが点灯したあと、2、3、4番目・・の順に点灯する、といった具合です。

しかし、状況によってはこのLEDの並び順を変更したい場合があります。

LEDの並び順を変更する効果

実際に例を見たほうがわかりやすいと思いますので、LEDの並び順の変更が効果的に機能する例を見てみましょう。

並び順を変更しない場合

並び順を変更しない場合、開始位置は左下になっています。左のファンが一周した後に右のファンに移動しています。

並び順を変更した場合

並び順を変更すると、開始位置が左のファンの左のLEDになっています。そこから、2つのファン全体を時計回りになるようにアニメーションしていることが分かると思います。この例で示したように、並び順の変更は1つのデバイス内に限ったことではなく、ALEDクラスでグループ化した複数のデバイス間でも行うことができます。

LEDの物理番号と論理番号

まずLEDの物理番号と論理番号の定義を説明します。物理番号というのは、これまで説明してきた物理的な並び順に沿って0, 1, 2・・・とLEDに番号を付けたものです。一方、論理番号というのは、ALEDクラスがアニメーションや模様を描写する際の並び順に0, 1, 2・・・とLEDに番号をつけたものです。

実はALEDクラスはscrメンバ変数にLEDの論理番号と物理番号を紐付ける情報を保持しています。簡単のため、LEDが4つの場合について考えてみます。特に変更しないと、以下のように物理的な順番と同じになっています。

論理番号と物理番号の対応(デフォルト)

仮にscrメンバ変数を書き換えて以下のような対応にすることもできます。この場合、デフォルトとは逆の順番でアニメーションや模様が表示されることになります。

論理番号と物理番号の対応(逆順にした例)

LEDの並び順を変更するスケッチ「Scramble」

上記「LEDの並び順を変更する効果」で使用したスケッチは以下からダウンロードできます。ここからは、このスケッチを例として、具体的に並び順を変更するコードの記述方法を説明していきます。

ただし、LEDの配置はお使いのデバイスによって異なるので、このスケッチを実行しても必ずしも例のような動きにはならないことに注意して下さい。

Scrambleスケッチ解説

7行目
ALED aled(CH1 | CH2, 18, 18);  // チャネル1と2グループ化して1つのデバイスのように制御するaledを作成

この例では、18個のLEDを持つAntec製 Prizm 140 ARGBを2つグループ化して、計36個のLED数のALEDクラスaledを作成しています。

23-62行目
  // LEDの順番を変更
  aled.scr[0] = 16;
  aled.scr[1] = 15;
  aled.scr[2] = 14;
  aled.scr[3] = 13;
  aled.scr[4] = 12;
  aled.scr[5] = 11;
  aled.scr[6] = 10;
  aled.scr[7] = 9;
  aled.scr[8] = 8;

  aled.scr[9] = 34;
  aled.scr[10] = 33;
  aled.scr[11] = 32;
  aled.scr[12] = 31;
  aled.scr[13] = 30;
  aled.scr[14] = 29;
  aled.scr[15] = 28;
  aled.scr[16] = 27;
  aled.scr[17] = 26;

  aled.scr[18] = 25;
  aled.scr[19] = 24;
  aled.scr[20] = 23;
  aled.scr[21] = 22;
  aled.scr[22] = 21;
  aled.scr[23] = 20;
  aled.scr[24] = 19;
  aled.scr[25] = 18;
  aled.scr[26] = 35;

  aled.scr[27] = 7;
  aled.scr[28] = 6;
  aled.scr[29] = 5;
  aled.scr[30] = 4;
  aled.scr[31] = 3;
  aled.scr[32] = 2;
  aled.scr[33] = 1;
  aled.scr[34] = 0;
  aled.scr[35] = 17;

ここが、scrメンバ変数を設定してLEDの論理番号と物理番号の対応を変更している部分です。以下の形式で指定します。

aled.scr[論理番号] = 物理番号

わかりやすくするため、物理番号を赤色で示しました。LEDが発光しているのは場所をわかりやすくするためで、スケッチには関係ありません。

物理番号

次に論理番号を緑色で示します。これは好きなように決めて構いません。この例では、左のファンの左のLED(物理番号16)から、右のファンも経由しつつ時計回りに指定しました。

論理番号

例えば、論理番号(緑)が0のLEDの物理番号(赤)は16となっているので、スケッチ24行目は以下のように指定しています。

  aled.scr[0] = 16;

全てのLEDについての設定が終わったら、通常と同じ手順でイルミネーションさせることができます。なお、内部的にはALEDクラスのメンバ関数loadLedDataRgb内でscrメンバ変数の情報に応じてLED番号の変換が行われています。

まとめ

ALEDクラスのscrメンバ変数を変更することで、アニメーションや模様を描写する際のLEDの並び順を変更する方法について解説しました。この機能を使うことで、LEDの配置を意識したイルミネーションを作成できるようになります。