Arduino RGB 矩阵音频频谱可视化器 – 从零构建完整教程
组件与物料
| Arduino UNO | ×1 |
| Adafruit NeoPixel Shield for Arduino (40 RGB LED, 8×5) | ×1 |
| SparkFun Spectrum Shield (双 MSGEQ7, 7 频段×2 声道) | ×1 |
| ProtoStax Arduino 亚克力外壳(可堆叠模块化) | ×1 |
| SPST 按钮开关 | ×1 |
| 3.5mm 立体声音频插座(面板安装) | ×2 |
| 90° 3.5mm AUX 音频线 | ×2 |
| 3.5mm 公对公音频线 (6 英尺) | ×1 |
所需工具
- 无绳电钻/驱动器
项目概述
本项目结合 SparkFun Spectrum Shield 进行音频频谱分析,与 Adafruit NeoPixel Shield 显示 RGB 频谱瀑布,最终装入 ProtoStax 模块化亚克力外壳,打造一个可桌面摆放的成品级音频可视化器。
核心原理
- 频谱分析:Spectrum Shield 使用两颗 MSGEQ7 芯片,将立体声音频分为 7 个频段(63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz, 16kHz),通过 Arduino ADC 读取各频段幅度 (0-1023)。
- RGB 矩阵显示:NeoPixel Shield 含 40 颗 WS2812B LED,排列为 8×5 矩阵。利用 Adafruit_NeoMatrix 库将 7 个频段映射到 7 行,幅度映射到 5 列亮度/颜色。
- 外壳设计:ProtoStax 采用可堆叠模块化设计,便于分阶段组装、调试与扩展。
步骤 1:将 Arduino 固定在底板
按图序安装支柱、螺丝、脚垫,形成“平台配置”,便于后续堆叠扩展板。
步骤 2:准备 Spectrum Shield
Spectrum Shield 原板无排针,利用 NeoPixel Shield 附带的排母焊接。因 USB/电源接口干涉,需剪去 Shield 端部多余 PCB 并修剪排针腿长,使其贴合 Arduino。
步骤 3:堆叠 NeoPixel Shield
将 NeoPixel Shield 焊接直插排针并插在 Spectrum Shield 之上。NeoPixel 数据线默认接 D6,可由 Arduino 直接供电(全亮电流约 2.4A,建议外接 5V 电源)。
步骤 4:核心代码逻辑
GitHub 完整代码:ProtoStax_Audio_Visualizer_Demo
频谱读取
#define STROBE 4
#define RESET 5
#define DC_One A0
#define DC_Two A1
int Frequencies_One[7];
int Frequencies_Two[7];
void Read_Frequencies() {
digitalWrite(STROBE, LOW); delay(1);
digitalWrite(RESET, HIGH); delay(1);
digitalWrite(STROBE, HIGH); delay(1);
digitalWrite(STROBE, LOW); delay(1);
digitalWrite(RESET, LOW);
for (int band = 0; band < 7; band++) {
Frequencies_One[band] = (analogRead(DC_One) + analogRead(DC_One)) >> 1;
Frequencies_Two[band] = (analogRead(DC_Two) + analogRead(DC_Two)) >> 1;
digitalWrite(STROBE, HIGH);
digitalWrite(STROBE, LOW);
}
}
频段分组
- BASS (低音):63Hz, 160Hz (band 0-1)
- MID_RANGE (中音):400Hz, 1kHz, 2.5kHz (band 2-4)
- TREBLE (高音):6.25kHz, 16kHz (band 5-6)
NeoMatrix 初始化与坐标系
#define NEO_MATRIX_WIDTH 5
#define NEO_MATRIX_HEIGHT 8
#define NEOPIXEL_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();
}
坐标系原点 (0,0) 固定在左上角。本项目采用 TOP-RIGHT, COLUMNS PROGRESSIVE 方向,使频段从左下向右上排列,符合频谱瀑布直觉。
频谱绘制与配色
void Graph_Frequencies(int range, int scheme) {
// 根据 range 确定行范围 from/to
for (int row = from; row < to; row++) {
int freq = max(Frequencies_One[row], Frequencies_Two[row]); // 取双声道最大值
int numCol = freq / 204; // 1023/204≈5 列
if (numCol > 5) numCol = 5;
for (int col = 0; col < numCol; col++) {
uint32_t rgbcolor;
// 三种配色方案:MAGNITUDE_HUE, MAGNITUDE_HUE_2, HSV_COLOR_WHEEL
// 使用 HSV 色环实现平滑过渡
static uint16_t hue = 0;
hue += 200;
rgbcolor = matrix.ColorHSV(hue);
matrix.setPassThruColor(rgbcolor);
matrix.drawPixel(col, row, 0); // 颜色由 PassThruColor 决定
matrix.setPassThruColor();
}
matrix.show();
}
}
步骤 5:测试与调试
上传代码,播放音乐,观察频谱响应。通过串口发送数字 0/1/2 切换配色方案。
步骤 6:封装外壳
安装侧壁、顶板、加强筋、音频面板插座,最终形成成品外观。可选:在侧壁开孔安装面板音频插座、按钮开关;顶板轻微打磨作漫射板,光效更柔和。
进阶扩展想法
- 面板安装音频插座,内部走线更整洁
- 增加更多配色/动画模式
- 添加按钮切换频段范围 (BASS/MID/TREBLE/ALL)
- 第二个按钮切换配色方案
- 使用阶梯钻在亚克力上开孔安装开关/插座
- 顶板打磨做漫射面
制造工艺
- K30 CO₂ 传感器:室内空气质量实时监测
- 基于 1Sheeld 与 Arduino 的盲聋人士沟通辅助系统
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- 用 Arduino Nano 与 MAX7219 制作 24×16 LED Pong 游戏机
- Arduino 音频频率检测:基于 FFT 测量最响亮声音峰值
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- Arduino UNO 与 DFPlayer Mini 播放音频完整指南
- 让大嘴鲈鱼玩具随音频起舞:分步制作指南
- Arduino RGB LED调色器:三电位器混色入门项目
- Arduino Uno驱动MAX7219级联8×8 LED矩阵:从入门到动画显示
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)