Arduinoで作るRGBマトリックス・オーディオビジュアライザー:ステップバイステップガイド
必要な部品と材料
| Arduino UNO | ×1 |
| Adafruit NeoPixel Shield for Arduino(40個のRGB NeoPixel搭載) | ×1 |
| SparkFun Spectrum Shield(MSGEQ7×2搭載、ステレオ7バンドスペクトルアナライザー) | ×1 |
| ProtoStax Enclosure for Arduino(スタッカブル・モジュラー型エンクロージャー) | ×1 |
| SPST OFF-(ON) 青色プッシュボタンスイッチ | ×1 |
| 3.5mm アイソレート型ステレオジャック パネルマウント | ×2 |
| 90° アングル 3.5mm オーディオケーブル | ×2 |
| 3.5mm ステレオ オス-オス パッチコード 6フィート | ×1 |
必要な工具と機械
- コードレス ドリル/ドライバー
プロジェクト概要

この記事では、Arduino、RGB LEDマトリックスシールド、オーディオスペクトラムアナライザーシールドを使ってRGB LEDマトリックス・オーディオビジュアライザーを構築し、エンクロージャーに収めて完成品としてオーディオシステムの横に飾れるようにする手順を解説します。
オーディオスペクトラム解析
SparkFun Spectrum Shieldを使用。2つのMSGEQ7グラフィックイコライザーフィルターでステレオ音声入力を7バンド(チャンネルごと)に分割し、ArduinoのADCで各バンドの振幅を読み取ります。Arduinoサンプルスケッチが付属しています。
RGB LEDマトリックス
Adafruit NeoPixel Shield for Arduinoを使用。40個のRGB NeoPixel(WS2812)が搭載され、赤・緑・青のLEDとドライバーチップが一体化した表面実装パッケージで、単一ワイヤーで制御可能。シールド上ではチェーン接続されており、Adafruit_NeoMatrixライブラリで簡単に制御できます。
エンクロージャー
筆者が開発したスタッカブル・モジュラー型エンクロージャーシステム「ProtoStax」を使用。プロトタイピングの各段階に対応し、最初はオープンアクセスで保護し、後から側壁と天板を追加可能。横方向にも縦方向にもスタックでき、プロトタイピングの拡張に合わせて拡張できます。ここではArduino Uno/LeonardoおよびMega/Dueフットプリント対応のクリアアクリル製ProtoStaxを使用。2つのシールドを収納可能(若干の加工必要)。クリアで頑丈、ゴム足付きでテーブルを保護し、オーディオシステムの横に飾って光のショーを楽しめます。
ステップ1:Arduinoをエンクロージャーベースプレートに取り付け
Arduino(Uno)をベースプレートに固定。これにより保護されつつフルオープンアクセスが可能。準備ができたら側壁と天板をネジで固定して密閉できます。以下のスライドショーで手順を確認(各画像のキャプションに番号と説明)。

全手順をアニメーションGIFで確認:

ステップ2:SparkFun Spectrum ShieldをArduino用に準備
Spectrum Shieldにはヘッダーが付属していませんが、NeoPixel Shieldにはスタッキングヘッダーとプレーンヘッダーの両方が付属。NeoPixel Shieldを最上段に配置したいのでプレーンヘッダーを使用し、スタッキングヘッダーをSpectrum Shield用に流用します。
しかしスタッキングヘッダー装着時、Arduino UnoのUSBと電源ポートが干渉してカチッとハマりません。
以下の2つの修正で解決:
- Spectrum ShieldのUSB/電源ポート上部(プロトタイピングエリアで未使用)をカット。1列分の穴だけ犠牲になります。
- スタッキングヘッダーの脚が長すぎる場合は少しカットして高さ調整。
これでしっかり装着できます。

ステップ3:Adafruit NeoPixel ShieldをSpectrum Shieldのスタッキングヘッダーに装着
NeoPixel ShieldをSpectrum Shieldの上に重ねます。付属のプレーンヘッダーをはんだ付けし、端子コネクタもはんだ付け(今回はArduinoから給電するため未使用。全LEDが同時に点灯しないためArduinoの供給電力で賄える)。

ステップ4:デモコードの解説
デモコードは大きく2部構成:
- スペクトラム解析と結果保存
- 8×5 NeoPixelマトリックスへの表示/配色変換
デモコード全文:GitHub
スペクトラム解析
Spectrum Shield Hookup Guideも参照。STROBEピンとRESETピンにデジタルシーケンスを書き込んでMSGEQ7チップを初期化。その後、7つの周波数バンドそれぞれの振幅を読み取ります。各バンド読み取り後にSTROBEピンをパルス駆動して次のバンドへ。値はFrequencies_One[7]とFrequencies_Two[7]に格納(ステレオ2ch分)。Arduinoの10bit ADCで読み取るため0-1023の値になり、各周波数帯の振幅を表します。
//Declare Spectrum Shield pin connections #define STROBE 4 #define RESET 5 #define DC_One A0 #define DC_Two A1 //Define spectrum variables int freq_amp; int Frequencies_One[7]; int Frequencies_Two[7]; int i; void setup() { ... //Initialize Spectrum Analyzers digitalWrite(STROBE, LOW); delay(1); digitalWrite(RESET, HIGH); delay(1); digitalWrite(STROBE, HIGH); delay(1); digitalWrite(STROBE, LOW); delay(1); digitalWrite(RESET, LOW); ... } void loop() { ... Read_Frequencies(); ... } /*******************Pull frquencies from Spectrum Shield********************/ void Read_Frequencies(){ ... //Read frequencies for each band for (freq_amp = 0; freq_amp<7; freq_amp++) { Frequencies_One[freq_amp] = (analogRead(DC_One) + analogRead(DC_One) ) >> 1 ; Frequencies_Two[freq_amp] = (analogRead(DC_Two) + analogRead(DC_Two) ) >> 1; ... digitalWrite(STROBE, HIGH); digitalWrite(STROBE, LOW); } }
7つの周波数バンド:
- 63Hz
- 160Hz
- 400Hz
- 1kHz
- 2.5kHz
- 6.25kHz
- 16kHz
これらを3レンジに分類:
- BASS(低音域):60-250Hz → 最初の2バンド
- MID_RANGE(中音域):500Hz-2kHz → 次の3バンド
- TREBLE(高音域):残り2バンド
※各バンドの最大値も別変数に記録。入力信号が弱い場合に自動スケーリングしてマトリックス表示を最適化するのに利用可能。
RGBマトリックス
Adafruit NeoPixel Überguideも参照。ここではNeoPixel Shieldの向きと座標系の番号付けを明確化します。
- 座標系では[0,0]は常に左上を指す(向きによらない)
- 幅(WIDTH)と高さ(HEIGHT)の順で指定(5×8 vs 8×5)
- 物理LED #0の位置(Adafruitロゴの位置)と、物理LEDの進行方向を確認。当ボードはPROGRESSIVE配列(行末の次のLEDが次の行の先頭へ)。幅が広い向きでは行方向、幅が狭い向きでは列方向に進行。
スライドショーの4枚の図で各向きの設定を解説。
今回は7バンドの周波数を8の次元(1つ余る)に割り当て、振幅を5の次元で表現。原点を左下(最低周波数の最小振幅)に置き、上方向に伸ばしたい。しかし座標系の[0,0]は左上固定なので、頭を左に傾けて見たイメージで初期化パラメータを決定(WIDTH=5, HEIGHT=8, TOP-RIGHT, COLUMNS PROGRESSIVE)。

NeoMatrix初期化とグラフ描画のコード抜粋:
#define NEO_MATRIX_WIDTH 5 #define NEO_MATRIX_HEIGHT 8 #define NEOPIXEL_PIN 6 // Shield maps it to pin 6 Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(NEO_MATRIX_WIDTH, NEO_MATRIX_HEIGHT, NEOPIXEL_PIN, NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, NEO_GRB + NEO_KHZ800); .... void setup() { ... matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.fillScreen(0); matrix.show(); ... } void loop() { static int scheme = 0; while (Serial.available() > 0) { scheme = Serial.parseInt(); } ... Graph_Frequencies(ALL, scheme); ... delay(50); } void Graph_Frequencies(CHANNEL c, SCHEME s){ ... for( row= from; row<to; row++) { int freq = (Frequencies_Two[row] > Frequencies_One[row])?Frequencies_Two[row]:Frequencies_One[row]; int numCol = (freq/FREQ_DIV_FACTOR); if (numCol > 5) numCol = 5; for (int col = 0 ; col < numCol ; col++) { ... // pick color scheme to display matrix.setPassThruColor(rgbcolor); matrix.drawPixel(col, row, (uint16_t)0); // color does not matter here matrix.setPassThruColor(); //matrix.show(); } matrix.show(); } }
HSVカラーホイールを使用して滑らかな色遷移を実現。matrix.ColorHSV()は32bitカラーを返すがdrawPixel()は16bitカラーを期待するため、matrix.setPassThruColor()で32bitカラーを設定してからdrawPixel()を呼び、その後リセットするワークアラウンドを使用。
配色スキーム選択
3種類の配色スキームを用意:
- 緑→赤/ピンク系(振幅小→大)
- ピンク/ブルーシフト系
- 全ピクセル同色でカラーホイールをサイクル
周波数レンジごと(BASS/MID/TREBLE)に色相を変える設計も盛り込み済み。シリアル入力でスキーム切替可能。
ステップ5:動作テスト
動作テスト動画はこちら(元記事参照)。
ステップ6:エンクロージャーを閉じる
トップブレース、側壁、オーディオケーブル、天板を取り付け。スライドショーで手順確認(キャプションに番号と説明)。

全手順アニメーションGIF:

ステップ7:作品を飾って、美しい音楽をさらに美しく!
自作オーディオビジュアライザーをオーディオシステムの横に置いて、クールな手作りライトショーで音楽を彩りましょう。
ステップ8:さらに発展させるアイデア
- パネルマウントステレオジャックを側壁に追加し、配線を内部に収めて外部からはジャックのみ露出させる
- さらに多彩なライトスキーム・パターンを追加
- シリアル入力で周波数レンジ(BASS/MID/TREBLE/ALL)の表示ON/OFFを切替可能にする
- モーメンタリープッシュボタンスイッチを側壁に追加して配色スキーム切替
- 第2のスイッチで表示周波数レンジ切替
- アクリル天板を軽くサンディングして拡散板化し、より柔らかな光効果を得る
- ステレオジャック・スイッチ・拡散板天板を追加したアップデート版の要望があれば対応予定(コメントやメッセージでリクエストを)
他にもアイデアがあればコメントで共有を!Happy making!
コード
ProtoStax Audio Visualizer Demo
このプロジェクトで使用したコードのGitHubリポジトリ:https://github.com/protostax/ProtoStax_Audio_Visualizer_Demo
製造プロセス
- K30 CO2センサで室内空気質をリアルタイム監視する
- 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino NanoとMAX7219で作る24×16 LEDポングゲーム機
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino UNOとDFPlayer Miniで音声を再生する方法 - ステップバイステップガイド
- ビリーバスフィッシュを任意の音源で動かす:ステップバイステップガイド
- Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト
- Arduino Unoで8×8 LEDマトリックスを制御:ステップバイステップガイド