電子工作の延長として自作キーボード製作も始めたのですが、前々から少し気になっていたことがあります。
SK6812やWS2812BといったRGB LED、いわゆるNeoPixelを点灯させるための回路構成についてです。
SK6812 Mini-Eの駆動電圧ってデータシート上では最小3.7V、一応以前テストして3.3Vで点灯させても問題なかったけど・・・
以前自分で設計した自作キーボードではVBUSライン(5V)で駆動させRP2040からの信号はMOS-FET使ってレベルシフトさせて点灯させたけど、実際のところどうなんだろうね? pic.twitter.com/LOWKctDRoi
— ガジェット大好き!! (@smartphone_jp1) December 26, 2024
自作キーボードで使われているマイコンボード(またはマイコンチップ)には、Pro Micro(ATmega32U4)といった5V駆動のものとRaspberry Pi Pico(RP2040)やSTM32といった3.3V駆動のものがよく使われています。
単色のLEDを点灯させるだけならマイコンの駆動電圧やロジックレベルは特に気にする必要はなく、単に電流制限抵抗を1本付けておけば簡単に点灯させることが出来ます。
しかしNeoPixel系のRGB LEDを点灯させる場合は問題が出てくることがあります。
NeoPixelはデイジーチェーンで数珠つなぎに複数のLEDを接続でき1本の信号線のみで全てのRGB LEDの点灯色や輝度などを制御することが出来るので便利なのですが、マイコンで制御するためその駆動電圧や信号線のロジックレベルが問題になることがあります!
目次
RP2040など3.3VマイコンでNeoPixel RGB LEDを点灯させるには!
NexPixelとは?
NexPixel(ネオピクセル)、いわゆるRGB LEDには様々なサイズや規格のものがあるのですが、基本的な構造は1つのLEDチップ内にR(赤)/G(緑)/B(青)の3つのLEDとそれを制御するための極小マイコン(制御チップ)が内蔵されています。
テープLEDなどで使われているのもよく見かけます。
数珠つなぎに連結し、接続する数が増えても1本の信号線のみで全てのLEDの点灯を制御することが出来るので便利です!
電子工作ではお馴染みのものなので多数手元にあるのですが、自作キーボードでよく使われているのはこのあたりでしょうか?
NeoPixelは、正式にはAdafruit社が販売しているスマートRGB LED製品のブランド名のようですね。
中身は主にWS2812BやSK6812などのIC内蔵型LEDとなり、公式には5V駆動・5Vロジックでの使用を前提としたRGB LEDとなります。
- 数珠つなぎに接続して1本の信号線のみで複数のLEDを制御出来る
- LEDごとに個別に色・明るさを設定することが出来る
5V駆動マイコンとの接続
下記表は自作キーボードでもよく使われるSK6812 MINI‐Eのデータシートから引用したものです。(参照)
駆動電圧VDD(Power supply voltage)およびロジック電圧Vin(Logic input voltage)から分かるように5V駆動を想定したデバイスとなっています。
他のRGB LEDでもほぼ同様で、NexPixel系(またはその互換)LEDの駆動電圧およびロジックレベルは基本的に5Vとなっています。
5Vで使うことを想定したRGB LEDなので、Pro MicroやATmega32U4といった5Vロジックのマイコンで使う場合は駆動電圧・ロジックレベルともに一致しているのでそのまま使える(接続できる)ことになります。
マイコンと同じ5Vレベルで駆動させ、信号線(GPIO)のロジックレベルも5Vなのでシンプルに接続できます。
このような接続ですね。
電源投入直後など大きな突入電流が流れる保護や信号の急な立ち上がりなどリンギング防止用となっています。
3.3V駆動マイコンで接続する場合の注意点
5V駆動のマイコンに接続するのはシンプルで簡単なんですが、RP2040といった3.3V駆動のマイコンで使う場合はどう接続すれば・・・。
電子工作をされている方なら、LEDを5Vで駆動させ信号線のレベルは3.3Vから5Vへのロジックレベル変換をすればいいじゃん!となると思います。
これがおそらく一番の最適解になると思います。
しかしこれまで製作してみたオープンソースで公開されているキーボードでは設計者により回路構成も様々でした。
例①としてQazikatというオンボードRP2040搭載のキーボードではRGB LED(SK6812MINI-E)の駆動電圧を3.3V、そしてロジックレベルも3.3Vという接続で設計されていました。(下記は略図)

また例②としてMonorailというキーボードでは、駆動電圧は5Vでロジックレベルは3.3Vで設計されています。(下記は略図)
上記接続は共にデータシート上動作が保証されていない接続になるかと思います。
もう一度データシートを見てみます。
SK6812やWS2812Bの駆動電圧(VDD)の範囲はデータシート上では3.7V~5.3Vとなっています。
例①ではLEDの駆動電圧はそれを満たしていないことになります。
またデータライン(DIN)のロジックHIGHのしきい値(VIH)は0.7×VDD以上とされています。
例②ではLEDの駆動電圧(VDD)が5Vなので、HIGHレベルとして認識されるVIH=0.7×5.0=3.5V以上の電圧が必要ということになりRP2040からの信号レベル(3.3V)ではこれを満たしていないことになります。
まとめると
- NexPixelを3.3Vで駆動させロジックレベル(信号ライン)も3.3Vの場合 → LEDの駆動電圧が足りない!
- NexPixelを5Vで駆動させロジックレベル(信号ライン)が3.3Vの場合 → 信号ラインの電圧レベルが足りない!
ということになり、データシートでの範囲外となり正常に動作することが保証されていない接続ということになると思います。
・・・しかしながら、両キーボード共に動作は問題なく動いてくれています。
多くの個体では実際のしきい値はデータシートより緩めに設定されている場合があるようで3.3Vでも「HIGH」と認識し、駆動電圧を若干低くても点灯させることが出来るようです。
しかしこれは接続するLEDの数が少ない場合であり数が増えてくると点灯輝度が下がったりチラつきの発生、また電圧低下により認識されないLEDが出てきて以降数珠つなぎになった下段全ての点灯が困難になる場合が以前検証した時には発生しました。
あくまで仕様外動作となるので、NexPixelを点灯させる場合はデータシートに従い5V駆動の5Vロジックで点灯させるのが基本となります。
趣味をやってると既存のものでも自分で作りたくなってくるやん!
・・・で趣味部屋にちょっと遊び心をという事でLEDライトを制御するPCBを考えてたんだけど、400円くらいで売ってるよとリンク頂いた😅うぅ~ん、自作するとその価格では作れないけど、製作過程で得られるものはお値段以上だよね🌟 pic.twitter.com/4m3NwOY2FF
— ガジェット大好き!! (@smartphone_jp1) February 9, 2024
余談ですが、電子工作を始めたばかりの頃にロジックレベルのことがあまり理解できていなくArduino(5V)やESP32(3.3V)などを混同して使ってNexPixelの動作が不安定になったことがあり少し検証したことがあるのですが・・・
全ての場合に当てはまるかは分かりませんが、数個のLEDを点灯させるだけなら問題にならない場合でも接続数が増えてくると動作が不安定になってくることが多いと思います。
動作環境 | 不具合 |
VDD=5.0V 信号レベル=3.3V | 接続数が増えてくるとチラつきの発生や途中から光らないなど不安定になる場合がある |
VDD=3.3V 信号レベル=3.3V | 接続数が増えてくると輝度が落ちたり色味が変わったりする場合がある WS2812Bでは動かないこともある |
信号レベルを3.3V→5Vにレベルシフトして5Vで駆動する
WS2812BやSK6812といったNexPixel系のRGB LEDは5Vで駆動することを前提としたものなので、5Vの電源電圧で駆動させRP2040といった3.3Vロジックのマイコンで点灯させる場合はデータラインの電圧を3.3Vから5Vにロジックレベル変換を行い点灯させるのが基本になります。
つまりRP2040のLEDを制御するGPIOピン(3.3V)をレベルシフトする回路を通し5Vロジックレベルに変換してNexPixelのデータライン(Din)に入力してあげるというものです。
I2CやSPIのデータラインの双方向ロジックレベル変換にはこのような回路をよく使います。
RP2040からの3.3V信号を[LV]に接続し、5Vロジックに変換された信号が[HV]から出力されるのでこれにLEDのデータラインに接続すれば信号レベルの問題はクリアできます。
2N7002やBSS138などのMOSFETを使えばパーツ数も少なく簡単にレベルシフト回路が作れます。
RP2040のLED制御線(GPIO)を5Vにレベル変換してNexPixelと接続する形となります。
Nch MOSFETのBSS138は秋月電子さんでもチップ単体で入手でき、また電子工作ではお馴染みのこのような双方向ロジックレベル変換ボードにも使われているのでテスト等でも使いやすいと思います。
ダイオードを入れLEDの駆動電圧を少し下げる
RP2040といった3.3VロジックのマイコンでNexPixelを点灯させる場合上記のようなレベルシフトを行い点灯させるのが一般的で最適解になるかと思いますが、ダイオードを入れRGB LEDの駆動電圧を少し下げる方法もあると思います。
一般的なダイオードの順方向電圧(Vf)は約0.6Vほどあります。
ダイオードを通すことによりVf分の電圧降下が起こり電圧が低下するというものです。
そこで電源電圧5Vにダイオードを1本挟みLEDの駆動電圧を4.4Vくらいに落とすという方法も使えそうです!
NexPixelの駆動電圧範囲となる3.7~5.3Vの範囲内でLEDを駆動でき、信号ラインのHIGHレベルのしきい値(VIH)はVDD×0.7=4.4×0.7=3.08V
となりRP2040の3.3V信号でも安定してHIGHと認識されるようになると思います。
こんな感じですね。
これならレベルシフトを行うより追加パーツの数も少なく簡単に済みそうです。
しかしこれにも少し注意点があり、LEDの接続数が増えてくるとダイオードの定格が問題になってきます。
よくキーボードのキーマトリクスで使われる小信号用ダイオード1N4148を使うことを考えると、1N4148の連続最大電流は300mA程しかないので接続するLEDの数が10や20と多くなる場合、定格電流を超えてしまうことが想定されます。
またダイオードの発熱も発生するかと思います。
接続するLEDの数にもよりますが、順方向電圧が0.6V前後で最大電流1Aくらいのダイオードを接続しておけば安心かもしれません。
1N5819やSS14といったショットキーバリアダイオードなどが使えそうです。
このLEDを入れる方法は手軽なので、このようなボードの製作を考えています。
Pro Micro互換のRP2040ボードなんですが、LEDの電圧レベルを調整しPro Microを使ったキーボードに入れ替えるだけでRP2040化出来るというコンセプトのボードとなります。

最後に!
自作キーボードのNexPixel点灯部分の回路構成でいろいろと見かけたので書いてみました。
私自身が設計して製作する自作キーボードは基本的にMCUオンボードのものを製作することから迷うことなく普段電子工作でやっているレベルシフト回路を入れてこれまで設計していたのですが、オープンソースで公開されているものも製作し他の方が設計された回路も見るようになり、そうそう、これでも点灯するんだよなぁーなんて以前検証したことを思い出したので簡単にまとめてみました。
接続するLEDの数が増えてくると、例えば再起動したら直ったといった不安定な動作が発生することが多くなると思うので、RP2040のような3.3Vで動作するマイコンでNexPixelを点灯させる場合は基本に従いレベル変換を行うのがトラブルも少なくいいのかなーなんて思います。
















コメントを残す