（小ネタ）PL9823とWS2812B(旧Ver.)は同一バス上で制御できるか?

あまりやろうとする人も居ない気もしますが、シリアルRGBフルカラーLEDの [PL9823](https://akizukidenshi.com/catalog/g/gI-08411/)と、[WS2812B](https://akizukidenshi.com/catalog/g/gI-07915/)を両方使ったモノを作りたくなったので、基板データを作り始めました。    

しかし、よくよく考えてみるとこの2つのLED、互換性があるとはどこにも書いてないようです。    

### (疑問) 君たち、同じバスで...動くの？

![leds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/466ed884-d140-8c15-3d3a-79a5d6e9c170.png)

> 左が PL9823、 右が WS2812B

### 情報を漁る

WS2812Bの方はめちゃくちゃ普及してて、カラーLEDがたくさん並んだLEDテープライトとかは、だいたいこれなので、Arduinoとかでも簡単に制御できます。ライブラリとかも [これ](https://github.com/adafruit/Adafruit_NeoPixel) とかが使えます。もちろん私も使う気満々です。   

一方で、砲弾型が使いたい！という理由で追加したPL9823の方は、というと、販売元の秋月電子のサイトを見ると、少し情報がわかりにくいです。 [WS2811(内蔵しているIC) PDFデータシート](https://akizukidenshi.com/download/ds/worldsemi/WS2811.pdf) というリンクがあるので内蔵ICは WS2811互換？に見えるのですが、このデータシートを見ると電圧が 12Vとあります。  

同じページにある [PL9823-F5 PDFデータシート](https://akizukidenshi.com/download/ds/rita/pl9823.pdf) を見ると、[Power supply DC4.5-6V]とありますので、WS2811とは明らかに仕様が違いそうです。3.7-5.3VのWS2812Bとも違うみたいです。    

なんとなく、データ制御まわりは WS2811 互換? で、 電気特性は独自、ってことっぽい気がします。    

さらに [WS2812B](https://akizukidenshi.com/catalog/g/gI-07915/) の方も最近バージョンアップして仕様が変わったとの情報もあります。

- [WS2812B (新) データシート](https://akizukidenshi.com/download/ds/worldsemi/WS2812B_20200225.pdf)
- [WS2812B (旧) データシート](https://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf)

私の家にストックしてある   WS2812Bは5年以上前に買ったリール（1000個！）なので、明らかに新Ver.ではなさそうですが、秋月で買ったものではないので、秋月の旧Ver.とも違う可能性もありますが、おそらく旧Ver.だと思います（リールに詳細Ver.の情報はないので確認難しい....）   

うん。わからん！

### 実験するしかなさそうだ。    

情報だけ漁ってても、よくわかりません。    
仕方ないので、重い腰をあげて実験開始です。    

#### 実験回路

下記のような回路で実験しました。    

WS2812B 1コ、PL9823 1コ、計2個だけで実験です。    

![schematics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/48260aef-8ce8-bb19-7738-fc6456061d6a.png)

> こういう時は 5Vの Arduino UNOとか使った方が明らかに楽ですねー。    
> 面倒ですが、作ろうとしている基板のマイコンにXIAO RP2040を使いたかったので、そちらで実験してみました。    


地味に、表面実装用のWS2812BにLEDの足を移植するハンダ付けと、レベルシフター回路部分をブレッドボードに刺せるようハンダ付けするのが面倒でしたが、それらが終わればあとはブレッドボードに雑に組めました。    

![breadboard.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/86b29330-efc5-1fc0-9f70-5ba227db2773.jpeg)

> 本当に雑！

#### 実験スケッチ

Arduino で簡単なスケッチを書いて XIAO RP2040に書き込みます。    

```rgbledtest.ino / .cpp
#include <Adafruit_NeoPixel.h>

#define LED_PIN D7

Adafruit_NeoPixel pixels(2, LED_PIN);

void setup() {
}

int out = 0;

void loop() {
  out ^= 1;
  
  pixels.setPixelColor(out, pixels.Color(0, 0, 32));
  pixels.show();
  delay(1000);
  pixels.setPixelColor(out, pixels.Color(0, 32, 0));
  pixels.show();
  delay(1000);
  pixels.setPixelColor(out, pixels.Color(32, 0, 0));
  pixels.show();
  delay(1000);
  pixels.clear();
  pixels.show();
  delay(1000);
}
```

### 結果

動きました！

![video.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/9c389d68-99bf-02da-4746-513c4c5975ea.gif)

が、ここで1点気づきが！

- `pixels.Color(R, G, B)`が、PL9823では `pixels.Color(G, R, B)` になってるようです。Rを指定するとGが光り、Gを指定するとRが光ります。

ソフトウエア側でなんとかなりそうなので、問題ないということで！（雑！）

#### データシートを確認

**WS2811(PL9823)**
![2811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/ffe90595-484f-e0dc-2392-84aa91460757.png)

**WS2812B**
![2812B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/016d3ea6-24dc-4de3-a80c-de6b0caf8b2a.png)

なんでこんなところ変えたのかなー？

### まとめ

- PL9823とWS2812B(旧Ver.)はとりあえず同一バス上で動きました！
- PL9823とWS2812Bは、制御コマンドのRGB指定の並びが異なる
- 細かい互換性のチェックはできてないです。何か問題が発生するかもしれません。    

というわけで、基板データの続きやります。

### リファレンス（多謝！）

下記サイトを参考にさせていただきました。

- [秋月電子 WS2812B](https://akizukidenshi.com/catalog/g/gI-07915/)
- [秋月電子 PL9823](https://akizukidenshi.com/catalog/g/gI-08411/)
- [RP2040でNeoPixel RGB LEDを光らせる](https://zenn.dev/koron/articles/390bb5efa43ad0)