キーボード界隈には派手なLED装飾を好む光の国の人たちが生息しているため、1つの信号線で様々な色を楽しめるシリアルLED(RGB)が定番となっています。
歴史的にシリアルLEDは5V電源ですので、ATMEGA32u4などのちょい古なMCUとの相性は比較的よろしかったのですが、いまどきはやりのMCUはたいてい3.3V系GPIOとなりますので、従来のように直結していいものかどうか悩むことになります。
ここでは最近メジャーになってきたラズパイPico(RP2040)を前提にシリアルLED接続のハード面について考えてみたいと思います。結論から書いておきますね。
結論
WS2812B V5は3.3V信号入力に対応しているので直結!
SK6812mini、SK6812mini-eは3.3V信号には未対応。対応策は下記の3つ
- 電源電圧を下げる
- レベルシフトする
- 祈りながら直結する
WS2812Bはもう最新のV5を使うので一択です。それしか使わない方はもうこれ以上読む必要ありません。
問題はSK6812miniおよび-eですね。データシートを見ると、VIHの最低電圧は0.7*VDDとあります。電源電圧が5Vの時は3.5Vとなりますので、3.3VのGPIOではほんの少し不足してしまいます。
ほんの0.2Vですが、データシートでは完全にNGです。個人的なプロジェクトならばわたしは直結して様子見しちゃいます。その個体が動けばそれでOKですし、たとえ動作不良になっても自分が困るだけなので。一方、頒布するようなものになると心配になりそうではあります。
対策としては大まかに2つあります。
電源電圧を下げる
最低電圧が電源電圧の7掛けなのであれば、電源自体を下げてしまえばいいんじゃない?というものです。簡易的に(低コスト、低実装密度)電圧を下げるにはダイオードのVf分の降下を利用します。
たとえば0.5VのVfなら4.5Vになりますので、4.5×0.7=3.15Vとなり、3.3Vの信号で問題なく動作することになります。
これが一番簡単でお安い方式ではないかと思います。せきごんさんのPICO Microはこの方式だと思います。余談ですがPICO Microはいいですよ。
レベルシフトする
正攻法はレベル変換です。3.3V→5Vのレベル変換はメジャーなのでいろいろ方法がありますが、ここで考慮すべきはシリアルLEDの要求信号はそれなりに高速なことです。約800kbpsで、Hi信号の最小時間は220nsしかありません。
まっとうな設計をするならば、74HCTのようなTTL入力のロジックICを使ったり(CMOS用のHCを使うとVIHはたいていVCCx0.7なので、それならSK6812miniと同じ条件となるのでわざわざかませる意味がない)、レベルシフト専用のICを使う方が良いです。ただし前者はたいていマルチビットなのでフットプリントが大きく、後者なら1ビットから高速通信対応のものがあるのですが半導体不足で軒並み品切れです(そしてちょっとお高い)。
フットプリントが小さめで手に入りやすいところで考えると、PCA9306があります(秋月で買える)。もっとも、PCA9306はI2C用なのでシリアルLEDの信号だと規格外になり、矩形波が崩れてくるようです。下記サイトにPCA9306を含むいくつかのモジュールを使用した結果と波形が掲載されています。
http://happyinmotion.com/?p=1247
波形が鈍っても動くようなので問題ないと言えば問題ないかもしれません。だったらもっとお安い方法はない?と考えて誰もが思いつくのがMOSFETです。電子工作の世界でよく使われる安価なレベル変換にBSS138を使ったものがあります。
https://akizukidenshi.com/catalog/g/gK-13837/
モジュールだと大きすぎるのでチップ単体を使いましょう。
https://akizukidenshi.com/catalog/g/gI-11627/
回路図は以下の通りです。RGBOUTとあるのがラズパイPicoのGPIOからの出力に、LEDとあるのがSK6812mini-eにそれぞれ繋がっています。下方のジャンパーはないものとして考えてください。R1とR2は共に10kΩとしています。
この回路は上の秋月のモジュールを含めてよくある実装例通りなのですが、このまま作るとまったく動作しません。つまりシリアルLEDは正常に光りません。ちょっと波形を見てみましょう。
まずラズパイPicoから出ている3.3Vの信号です。
当たり前ですがとてもきれいですね。
これにBSS138のレベルシフトを通すと以下のようになりました。
不要なチャンネルが入ってますが無視してください。矩形波が右上がりになって電圧が上がっていっているのが分かりますが、最も高い部分でも4V程度しかありません。信号が速過ぎて電圧が上がりきっていないのです。
この問題は、プルアップ抵抗が高すぎることに起因しています。次に1kΩにした場合の波形です。
まだ鈍っていますが、かなりそれらしくなってきました。この定数ではSK6812mini-eは正常に光ります。もう少しマシにしたいなあとR2を560Ωまで下げてみます。
さらによくなりましたね。波形を拡大してみます。
SK6812mini-eのデータシートと見ると、大きい山(T1H)は580~1000ns、小さい山(T0H)は200~400nsとなっています。上の波形からは小さい山については5Vに達している期間こそ175ns程度に見えますが、実際には3.5V以上をHiレベルとして認識しますので、220ns程度は確保できそうで、つまりは仕様範囲内に収まっていることになります(あくまでSK6812mini-eに関しての話で、MOSFETのアナログ的動作については保証されません)。
最後に
もうひとつ解決法があります。しかも面倒なパーツは一切要らない方法です。
それは、WS2812B V5とSK6812mini(-e)を併用するというものです。WS2812Bは3.3VのDINを受けてもDOUTは5Vレベルですので、先にWS2812Bをアンダーグロウとして使い、そのあとにSK6812mini-eをバックライトとして使えば仕様上は動作すると思います。あるいはWS2812Bをレベル変換のために1個だけ載せるという手もあるかもしれませんね。どちらも試したことはないので動かなかったらごめんなさい。
というわけで実験報告お待ちしています。