OptoSupply製マイコン内蔵RGBW LED 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

NeoPixelBusで制御する場合

ライブラリNeoPixelBusで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%を指定した場合と同等に扱われる。


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

動作例・発光色の色合い

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%に変化させたもの