アドレサブルRGB LEDを光らせる

アドレサブルRGBプログラミングの基礎知識として、色データを送信する仕組みと、実際に光らせるスケッチについて解説しています。本記事の内容は、より複雑な模様やアニメーションをプログラミングするための土台となります。

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

更新日 : 2020年5月19日

色の指定方法

実際にプログラムを書く前に、アドレサブルRGB LEDの仕組みと、どのようにして色データを送るか説明しましょう。

アドレサブルRGB LEDはその名の通り、Red(赤)Green(緑)Blue(青)のデータを使って様々な色を表現します。それぞれ0から255の範囲で指定します。例えば赤色にするにはR=255、G=0、B=0、紫にするにはR=255、G=0、B=255などです。実際には1つのデバイスにたくさんのLEDがあり、それぞれ別の色を設定できます。つまり、RGBの色データの組をLEDの個数分送信することになります。これが「アドレサブル」と呼ばれる所以で、従来の単色のデバイスと異なり、虹色なども表現できるのです。

Embed from Getty Images

色データを送るには

アドレサブルRGBデバイスとコントローラーは3つの端子で接続されています。このうち、5VとGND端子は電気を供給するために使われ、データの通信には関係ありません。つまり、残るD端子1本だけで色データを送っています。実際には以下のようにLEDがいくつも直列に繋がっています。

ここでは、LED#1を緑、LED#2を赤、LED#3を紫にしたいとしましょう。この場合、コントローラーからは以下の順番に連続してデータを送信します。RGBと呼ばれていますが、送信はGRBの順番になっている点に注意して下さい。

  1. LED#1 G(緑)の値
  2. LED#1 R(赤)の値
  3. LED#1 B(青)の値
  4. LED#2 G(緑)の値
  5. LED#2 R(赤)の値
  6. LED#2 B(青)の値
  7. LED#3 G(緑)の値
  8. LED#3 R(赤)の値
  9. LED#3 B(青)の値

3つ分のLEDの色データは、まずLED#1に渡されます。

LED#1は受け取った最初のGRBの色データを自分のものと認識して、LEDの色を変更します。一方、残りの色データをLED#2に送信します。

LED#2も同様に、受け取った最初のGRBの色に変更し、残りの色データをLED#3送信します。

最後にLED#3が色データを受け取り、色が変更されます。なお、この一連の流れは非常に短い時間で行われるので、人間の目には全てのLEDの色が一瞬で変わったように見えます。

アドレサブルRGBデバイスを光らせるスケッチ「Shine」

では、いよいよ実際にアドレサブルRGBデバイスを光らせてみます。上で説明した例と同じく、3つのLEDを緑、赤、紫に光らせるArduino IDE用スケッチ(プログラム)を用意しました。内容の説明は後回しにして、まずは実際に動かしてみましょう。

以下からスケッチをダウンロードして下さい。

ダウンロードしたらzipファイルを解凍し、Arduino IDEで開きます。inoファイルをダブルクリックで開くか、Arduino IDEの「ファイル->開く」からShine.inoファイルを開いて下さい。

「ツール->ボード」で「Arduino UNO」が選択されていることを確認します。また、「ツール->ポート」でCG-CustomARGB基板が接続されているUSBポートを選択します。選択肢が複数ある場合は1つずつ試すと良いです。選択できるものが無い場合は、基板を認識していない可能性があります。製品ページの「セットアップ」を確認して下さい。

「マイコンボードに書き込む」ボタンを押して書き込みます。

下の情報画面に「ボードへの書き込みが完了しました」と表示されれば書き込み成功です。

お使いのアドレサブルRGBデバイスの一部が緑、赤、紫に発光していれば成功です。なお、CH1-CH5のいずれの端子に繋いでも構いません。

スケッチ解説

ここからはスケッチの内容を解説していきます。

1行目
uint8_t sendBuf[150];  // LEDに送信するデータを格納しておくバッファー

上で説明したとおり、LED3つに対してG, R, Bの色データを送るので、合計9バイトのデータを連続して送信する必要があります。というのも、D端子1本でデータを送る都合上、パルスの幅の違いによって0/1のデータを区別しており、時間に対してシビアな通信となっています。例えば、LED#1のGデータを送った後に時間が空いてしまうと正常に残りのデータを送れなくなってしまいます。

そこで、バッファーと呼ばれる変数(データの入れ物)にあらかじめ送る全ての色データを入れておくようにします。準備万端にしてから実際に送信することで、時間的な遅れ無くデータを送ることができます。

ここでは「sendBuf」という名前でバッファーを用意しています。uint8_tは1バイトの符号なし整数のことで0-255の範囲が指定できます。アドレサブルRGB LEDの色の指定範囲と同じですね。150バイト分の大きさを確保しているので、最大LED50個分のデータを送ることができますが、ここでは3個分の9バイトだけ使います。

4-11行目
// 起動(リセット)後に以下のsetup関数が1回実行される
void setup() {
  // 下準備 使うピンを出力に設定
  pinMode(14, OUTPUT);  // チャネル1 Pin14, PC0
  pinMode(15, OUTPUT);  // チャネル2 Pin15, PC1
  pinMode(16, OUTPUT);  // チャネル3 Pin16, PC2
  pinMode(17, OUTPUT);  // チャネル4 Pin17, PC3
  pinMode(18, OUTPUT);  // チャネル5 Pin18, PC4
  pinMode(8, OUTPUT);   // LED

スケッチ(プログラム)が開始すると、まずsetup関数が実行されます。ここではデータを出力する端子(CH1-5と基板上の緑LED)の下準備を行っています。基本的にどんなスケッチでもこの下準備がいると思って下さい。

13-26行目
  // 1つめLEDの値をバッファーにセット
  sendBuf[0] = 255;  // 緑の値
  sendBuf[1] = 0;    // 赤の値
  sendBuf[2] = 0;    // 青の値

  // 2つめLEDの値をバッファーにセット
  sendBuf[3] = 0;    // 緑の値
  sendBuf[4] = 255;  // 赤の値
  sendBuf[5] = 0;    // 青の値

  // 3つめLEDの値をバッファーにセット
  sendBuf[6] = 0;    // 緑の値
  sendBuf[7] = 255;  // 赤の値
  sendBuf[8] = 255;  // 青の値

ここではバッファーに実際に送る色データを準備しています。この時点ではまだデータは送信されていないことに注意して下さい。ここの値を変えると色も変わります。また、4つめ以降のLEDに色を設定することもできますので、ぜひ試してみて下さい

28行目
  sendLedData();  // バッファーのデータをアドレサブルRGBデバイスに送信

ここでバッファーのデータをアドレサブルRGBデバイスに送信しており、LEDの色が変化します。なお、sendLedDataの内容は37-95行目にあり、sendBufの色データにもとづいて各チャネルのD端子からアドレサブルRGB LED用の波形を作るようになっています。少々複雑なので解説は省略しますが、内容を変更する必要はありません。

まとめ

アドレサブルRGBに色データを送信する仕組みと、実際に光らせるスケッチ(プログラム)について解説しました。本記事の内容は、より複雑な模様やアニメーションをプログラミングするための土台となります。

それぞれのLEDにRGBで色データを送信することで、好きな模様にできることが分かったと思います。一方で、実際にプログラムを作成する場合、RGB方式だと都合が悪い点もあります。次回は、RGBの代わりにHSV方式で色を指定する方法について解説します。

HSV(HSB)モデルでアドレサブルRGB LEDの色を指定する

本記事ではRGBとHSVモデルの違い、HSVの利点、実際にHSVモデルを使ってアドレサブルRGBデバイスを光らせるスケッチについて解説しています。RGBの代わりにHSVモデルを使って色を表現することで、色を変化させて虹色の模様を描いたり、明るさを変化させて点滅させたりといったプログラミングが簡単にできます。