West Gate Laboratory

人生を少しでも,面白く便利にするモノづくり

ピアノ演奏可視化装置”Bright Note”のNeoPixel制御について

概要

無事Maker Faire Tokyo 2020に出展が決まったピアノ演奏可視化装置”Bright Note”。前回の記事ではそのMIDI信号入力について述べた。

westgate-lab.hatenablog.com

今回は、演奏の表示部分であるLEDディスプレイ部分におけるNeoPixelの使い方について解説する。
使っているマイコンはESP32、LEDはNeoPixelだ。

Youtubeチャンネル作りました

このBright Noteを使った演奏の様子を記録に残すためにYoutubeチャンネルを作った。
動画を投稿し始めたので、興味ある人は見てみてほしい。
初投稿はショパンエチュード、「別れの曲」だ。

www.youtube.com

今後、趣味のクラシックピアノの練習の記録も兼ねてちょこちょこアップロードしていこうと思う。

NeoPixel

NeoPixelはICが内蔵されたフルカラーLEDで、数珠つなぎにして所定の信号を流すことでひとつひとつ任意の色・明るさで光らせることができるLEDだ。しかも、信号線は1本。電源±と合わせてたったの3本で接続は完了する。

www.adafruit.com

NeoPixelはAmazonなどで購入可能だ。LED間隔や長さなど色々な種類がある。
Bright Noteで使ったのは以下の種類のもの。

ICが内蔵されているのが肝で、通常なら複数のLEDをマイコンから独立に制御しようと思ったら、普通IOをそれぞれにつないだりダイナミック制御をしなければいけなかったりするところを、ICがよしなにLEDを制御してくれる。
以下は、私が使っているWB2812Bを前提に述べる。が、NeoPixelならだいたい同じだろう。

NeoPixelに対し信号を送るときは、以下のように各LEDの色情報をシリアルで流す。信号を受け取ったNeoPixel内のICは信号の先頭の色情報だけを読み取り、自身のLEDを制御する。そして、後続のNeoPixelへは受け取った先頭の色情報を除いたデータ列を流す。これを順々に繰り返す。こうすることで全てのLEDを独立して制御できる。なお、WB2812Bでは色情報はGRBの順だ。

f:id:kaname_m:20200726224619p:plain
NeoPixel制御信号(LED0到達前)

f:id:kaname_m:20200726224659p:plain
NeoPixel制御信号(LED1到達前)

f:id:kaname_m:20200726224735p:plain
NeoPixel制御信号(LED2到達前)

なので、原理的には無数のNeoPixelをつないでも1マイコン・3線で制御できるということだ。(もちろん電源や処理時間の問題はあるが)

信号を更に詳しく見ていくと、NeoPixel上では0、1が以下のようにパルスのデューティで表され、GRBはそれぞれ8bit、全部で24bitで表現される。

f:id:kaname_m:20200726224827p:plain
WB2812Bのbit表現(データシートより)

1bitは1.25usのため、1LED=24bitで30usとなる。
上述のようにシリアルに信号を流すため、LEDの数が増えれば増えるほど制御周期は遅くなる。
30fpsで動かそうと思ったら、単純に計算すると(1/30[s])/30[us/LED] ≒ 1111[LED]となる。1信号線で1000個以上のLEDを30fpsで制御できるってすごいね。

Bright Noteでは、88鍵全てに対しそれぞれ15個のLEDを割り当てている。つまり合計1320個だ。上の計算をすると、約25fpsで制御できる。
テレビアニメが24fpsということなので、それに匹敵する周期で制御していることになる。

以下がBright Noteの内部の図だ。15×88個のLEDを、数珠つなぎで接続している。
信号線をできるだけ短くするため、信号方向は隣同士で上下入れ替えている。
また、NeoPixelのストリングの裏には両面テープが付いているため、ベースに使っているアクリル板に簡単に貼り付けることが可能だ。(鍵盤の寸法にピタリ合わせて貼り付けるのがめっちゃ大変だった)

f:id:kaname_m:20200726230041p:plain
内部のNeoPixelの接続。互い違いに信号線を接続していく

Adafruit NeoPixel vs FastLED

Bright NoteではESP32を使っているため、Arduino環境を使うことができる。
Arduino環境におけるNeoPixelのライブラリには主にAdafruit NeoPixelFastLEDの2種類がある。

少ないNeoPixelであればどちらでも構わないが、今回のように大量のNeoPixelをつないで使う場合は、FastLEDをオススメする。
Adafruit NeoPixelは、大量のLEDを使うとところどころ意図しない点灯をする。一方FastLEDは1320個をつないでも正しく点灯する。恐らくFastLEDは制御信号のタイミングをハードウェアを使って正しく生成しているのだろう。

FastLEDの使い方については、同GitHubのWikiが詳しい。

まずNeoPixelを光らせて見るなら、FastLEDをインストールしたら入ってくるExampleの”FirstLight”を試してみるといいだろう。それを見れば最低限の使い方がわかる。(LEDの数、データピンの指定、ICの指定をしたら色情報配列に任意の色情報を突っ込んでFastLED.show()するだけ。とっても簡単。)

簡易バスバーによる電圧降下対策

NeoPixelを大量に使う上で注意する必要があるのが、電源電圧降下だ。
1000個ものLEDを単純につないで点灯させると、電源から遠くなるほど電源電圧が落ち、意図した色が出ない。

NeoPixelのLEDの特性は以下の通りだが、緑・青LEDは赤LEDと比較して電圧降下が大きいため、電源電圧が落ちてくるとLEDが赤みがかってくる。

f:id:kaname_m:20200726221521p:plain
WB2812Bの特性(データシートより)

これを防ぐため、電源はストリングの途中途中から適切に供給してやる必要がある。感覚的にはざっくり100LEDごとに電源を供給すれば良さそう。

Bright Noteでは、上端と下端に銅テープでバスバーを作り、そこから各ストリングに電源を供給している。信号線を邪魔しないように、電源とGNDは互い違いにストリングに接続されている。

f:id:kaname_m:20200726225314j:plain

HSVによる色の割り当て

Bright Noteでは、動画映えするように、鍵盤の場所に応じて色相を割り当てている。
FastLEDではHSVによる色の指定が簡単にできるため、それを使っている。

具体的には、FastLEDではHSVを使う場合色相(Hue)を0-255で指定するため、鍵盤のMIDIノート番号(21-108)を0-255にマッピングして指定している。

各ストリングに色相を割り当てることで、こんなゲーミングピアノに仕立てることができる。

まとめ

長くなって息切れ間が否めないが、ピアノ演奏可視化装置”Bright Note”に使っているNeoPixelについて、使い方や注意点など述べた。

おまけ

Youtubeにアップロードした動画には、間接照明のバックライトが見えるが、それもNeoPixelを使っている。
電源はBright Noteとは全く別系統だ。

f:id:kaname_m:20200726230805p:plain
青いバックライトもNeoPixel

これはLEDコントローラとリモコンが付属していて、リモコンを使って好きな色に光らせることができる。便利。