OptoSupply製マイコン内蔵RGBW LED OST45050C1A-W について。 合わせて OSTW3535C1A についても。

OST45050C1A-W

仕様に関して

OST45050C1A-W

データシート(PDF)に記載されている限りでは、OST45050C1A-Wの内蔵マイコンがSK6812と同等なのかどうかは明記されていないものの、データ転送の仕様はSK6812と同じとなっている。

OST45050C1A-W SK6812
LED Color RGBW(32bit) RGB(24bit)
RGBW(32bit)
The dynamic parameters
The speed of data transmission 800kHz
The data transmission time
T0H: 0 code, high level time 0.3μs±0.15μs
T0L: 0 code, low level time 0.9μs±0.15μs
T1H: 1 code, high level time 0.6μs±0.15μs
T1L: 1 code, low level time 0.6μs±0.15μs
Trst: Reset code, low level time 80μs
OST45050C1A-W SK6812

一方、OST45050C1A-Wのデータ形式と転送順はRGBWの順にMSB firstと記載されているが、実際に動作させて確認したところGRBWの順となっている模様。 なお、SK6812はGRB/GRBWの順となっている。

The data structure
OST45050C1A-W (32bit RGBW) G7, ..., G0, R7, ..., R0, B7, ..., B0, W7, ..., W0
SK6812 24bit RGB G7, ..., G0, R7, ..., R0, B7, ..., B0
32bit RGBW G7, ..., G0, R7, ..., R0, B7, ..., B0, W7, ..., W0

OSTW3535C1A

データシート(PDF)にて、WS2812向けのコードで動作させる例が記載されている。 実際、データ転送の仕様を確認すると、WS2812Sと概ね同等となっている。

OSTW3535C1A WS2812S
LED Color RGB(24bit)
The dynamic parameters
The speed of data transmission 800Kbps
Data transfer time
T0H: 0 code, high voltage time 200ns~380ns
T0L: 0 code, low voltage time 580ns~1.6μs 580ns~1μs
T1H: 1 code, high voltage time 580ns~1.6μs 580ns~1μs
T1L: 1 code, low voltage time 200ns~420ns
RES: low voltage time > 280μs
OSTW3535C1A WS2812S

また、OSTW3535C1Aのデータ形式と転送順も、WS2812Sと同様にGRBの順にMSB firstとなっている。

NeoPixelBusで制御する場合

ライブラリNeoPixelBusでOST45050C1A-W/OSTW3535C1Aを制御する場合について。

OST45050C1A-W

NeoPixelBusクラスを構築する際、データ転送の仕様はSK6812と同じなのでテンプレート引数T_METHODにはNeoSk6812Methodをそのまま指定することができる。 データ転送順はGRBWの順なのでT_COLOR_FEATUREにはNeoGrbwFeatureを指定する。

コードとしては次のようになる。

OST45050C1A-Wを制御するNeoPixelBusを構築する
#include <Arduino.h>
#include <NeoPixelBus.h>

const uint16_t PixelCount = 4; // make sure to set this to the number of pixels in your strip
const uint8_t PixelPin = 2; // make sure to set this to the correct pin

NeoPixelBus<NeoGrbwFeature, NeoSk6812Method> strip(PixelCount, PixelPin);
  :
  :

SetPixelColorなど、色を指定するメソッドではRgbColorの代わりにRgbwColorを渡す。

NeoPixelBusでOST45050C1A-Wの点灯色を指定する
NeoPixelBus<NeoGrbwFeature, NeoSk6812Method> strip(PixelCount, PixelPin);

void setup()
{
  strip.Begin();
}

void loop()
{
  // RgbColorの代わりにRgbwColorを用いる
  strip.SetPixelColor(0, RgbwColor(0xff, 0x00, 0x00, 0x00)); // Rのみ100%で点灯
  strip.SetPixelColor(1, RgbwColor(0x00, 0xff, 0x00, 0x00)); // Gのみ100%で点灯
  strip.SetPixelColor(2, RgbwColor(0x00, 0x00, 0xff, 0x00)); // Bのみ100%で点灯
  strip.SetPixelColor(3, RgbwColor(0x00, 0x00, 0x00, 0xff)); // Wのみ100%で点灯

  strip.Show();

  delay(1000);

   // RgbColorを用いると、Wは暗黙的に0%になる
  strip.SetPixelColor(0, RgbColor(0xff, 0x00, 0x00)); // Rのみ100%で点灯 (Wは点灯しない)
  strip.SetPixelColor(1, RgbColor(0x00, 0xff, 0x00)); // Gのみ100%で点灯 (Wは点灯しない)
  strip.SetPixelColor(2, RgbColor(0x00, 0x00, 0xff)); // Bのみ100%で点灯 (Wは点灯しない)

  strip.Show();
    :
    :
}

上記の例にあるように、RgbColorを渡すと、W=0%を指定した場合と同等に扱われる。


HslColor/HsbColor/HtmlColorの各クラスはWチャンネルをサポートしていない。 そのため、これらのクラスを使いつつtWチャンネルも使用したい場合は、まずHslColor/HsbColor/HtmlColorを構築し、次にそれをRgbwColorコンストラクタに渡してRgbwColorに変換したあと、Wチャンネルを別途設定するなどする必要がある。

HslColor/HsbColorからRgbwColorに変換し、Wチャンネルを設定する
// HslColor→RgbwColorの例
auto hsl = HslColor(0.0f, 1.0f, 0.5f); // HslColorクラスで色を作成する
auto rgbwFromHsl = RgbwColor(hsl); // RgbwColorクラスに変換する (Wチャンネルは0に初期化される)

rgbwFromHsl.W = 0x40; // Wチャンネルの値を設定する

strip.SetPixelColor(0, rgbwFromHsl);

// HsbColor→RgbwColorの例
auto hsb = HsbColor(0.0f, 1.0f, 1.0f); // HsbColorクラスで色を作成する
auto rgbwFromHsb = RgbwColor(hsb); // RgbwColorクラスに変換する (Wチャンネルは0に初期化される)

rgbwFromHsl.W = 0x40; // Wチャンネルの値を設定する

strip.SetPixelColor(1, rgbwFromHsb);

NeoPixelBus以外のライブラリの場合も、SK6812および32bit RGBWカラーをサポートするライブラリであれば同様に動作すると思われる。 (2020-07時点では、FastLEDはSK6812をサポートしているものの、32bit RGBWカラーが未サポートとなっている)

OSTW3535C1A

OST45050C1A-Wと同様に、OSTW3535C1Aのデータ転送の仕様はWS2812Sと同等なのでテンプレート引数T_METHODにはNeoWs2812xMethodを指定する。 データ転送順はGRBの順なのでT_COLOR_FEATUREにはNeoGrbFeatureを指定する。

OSTW3535C1Aを制御するNeoPixelBusを構築する
#include <Arduino.h>
#include <NeoPixelBus.h>

const uint16_t PixelCount = 4; // make sure to set this to the number of pixels in your strip
const uint8_t PixelPin = 2; // make sure to set this to the correct pin

NeoPixelBus<NeoGrbFeature, NeoWs2812xMethod> strip(PixelCount, PixelPin);

void setup() {
  strip.Begin();

  strip.SetPixelColor(0, RgbColor(0xff, 0x00, 0x00));
  strip.SetPixelColor(1, RgbColor(0x00, 0xff, 0x00));
  strip.SetPixelColor(2, RgbColor(0x00, 0x00, 0xff));
  strip.SetPixelColor(3, RgbColor(0xff, 0xff, 0xff));

  strip.Show();
}

void loop() {
  :
  :
}

ライブラリAdafruit_NeoPixelで動作させる場合の例はデータシート(PDF)に掲載されている。

動作例・発光色の色合い (OST45050C1A-W)

RGBとWを別々の周期で明暗させた例
RGBWそれぞれを0%→100%→0%に変化させたもの

WはRGBに比べて輝度が高いため、W=50%〜100%あたりではRGBの値が変わっても色合いはほとんど変わらないように見える。

Wを固定値(0%/25%/50%/75%/100%)、RGBそれぞれを0%→100%→0%に変化させたもの(一番右はRGB=0%でWのみ出力)
⚠👁⚡映像の明るさが急激に変わる場面があります
RGBを固定値(0%/25%/50%/75%/100%)、Wを0%→100%→0%に変化させたもの(一番右はRGB=0%でWのみ出力)
⚠👁⚡映像の明るさが急激に変わる場面があります

RGB=100%で合成される白色は、W=100%の白色と比べると若干青に寄った昼光色に見える。

RGBでの白色とWの合成: RGBを0%→100%→0%、追ってRGB100%の状態からWを0%→100%→0%に変化させたもの