FPGAの勉強のために何かデバイスを動かしてみたいと物色していたところ、Neopixel系のフルカラーLEDが題材的にも難易度的にも程よい感じでしたので、これをFPGAで動かしてみることにしました。
FPGAの勉強がてら、Cyclone10の評価ボードを使ってNeopixel系LED(いわゆるマイコン内蔵LED)を動かしてみました。 pic.twitter.com/FbRavuA2oO
— iw回路設計 (@iwCircuitDesign) 2018年11月14日
Neopixel系LEDとは?
「Neopixel系LED」という呼称は一般的ではなく、正しい名称でも無いのですが、俗にマイコン内蔵LEDとも呼ばれているLEDです。
これを使用したAdafruitのLED製品が「Neopixel」という商品名として有名であるため、このタイプのLED自体をNeopixelと呼ばれることも多いようです。(LED単体の呼称としては正しくはないように思いますが。。)
特徴
LEDパッケージ内部に制御ICが組み込まれており、1本の制御線によって色や明るさをコントロールすることができます。また、LED自体を数珠つなぎのように連結することが可能で、1本の制御線だけで複数のLEDをコントロールできるため、通常のLEDのようにLEDごとに制御線が必要にならないこともメリットの一つです。
制御IC内蔵のLED自体は最近では各社から出ているようですが、WorldSemi社の「WS2812B」が最もよく知られていると思います。(日本国内でも入手性が良く、秋葉原の秋月電子さんなどでも扱っています)
今回動かしてみるLEDも「WS2812B」を使用します。
使用機材
- FPGAボード:Cyclone10評価ボード(インテル® Cyclone® 10 LP 評価キット)
- LED:WS2812B
- 開発環境:Quartus Prime 18.0.0 Lite Edition(Windows版)
WS2812Bの制御方法
WS2812Bの制御は1ワイヤーのシリアル通信ではあるのですが、800kHzのPWM信号を使用しており少々特殊なものとなっています。
信号のH、Lレベルではなく、PWM信号のDUTY(1周期におけるHおよびLレベルのパルス幅)によって’0’か’1’を判別するものになっています。
このため、PWM信号の1周期ごとにDUTYを変える必要があり、一般的なPWM制御よりも細かな制御が必要になります。
その上、800kHzというPWM信号としては高速な周波数であるため、Arduinoなどのマイコンで制御するにはやや荷が重い処理となります。(クロック単位でマイコンの動作をコントロールする必要がありそうです)
※Arduinoに関しては前述のAdafuruitからNeopixel制御用ライブラリが公開されているので、これを使うことで簡単に制御することはできます。
制御データについて
LED1つあたりRGB各色8ビット(0〜255の範囲で明るさを制御)で合計24ビットのデータを送る必要があります。
複数個のLEDを制御する場合は(24ビット×使用個数)のデータを送信します。
また、常にデータ送信をする必要はなく、一度データを送信するとそのデータの状態を保持するようです。(ただし電源が切れればリセットされます)
今回作成する回路の動作
今回は前述したLED1個分の制御データ(24ビット)を単純に一定周期で送信するものとします。
FPGAでは24ビットデータをPWM信号として生成し、一定周期で繰り返し出力する回路を作成します。
接続図
WS2812Bの電源(VDD端子)は5Vが必要なため、FPGAボードの5V電源出力端子に接続します。
制御線も本当は5V系の信号線の方が良いと思いますが、FPGAボードは3.3V系入出力しかないため、3.3Vの出力信号端子に接続しました。(結果としては、3.3Vの出力信号でも動きました)
次は実際に開発環境のQuartus Primeを使用して、FPGAの回路を作成していきます。
後編に続きます。
後編> 【スキルアップ】FPGAでNeopixel系フルカラーLEDを制御してみました(後編)