|
现在大多数音乐会都伴随着一些花哨的灯光秀。几乎所有的音乐会、节日和夜总会都有与之相匹配的视觉表演或效果。那么,为什么不制作自己的音乐频谱可视化器,实现让音乐“动”起来呢?这是一个简单而有效的项目,可使用Arduino Nano开发板、32x8点阵显示模块和音频传感器制作自己的音乐频谱可视化器。 32x8点阵显示器上的LED将根据Arduino通过连接到其模拟引脚的麦克风接收到的信号做出反应。 Arduino内置了ADC,将从麦克风接收到的输入音频信号转换成数字采样。
所需的组件 ● Arduino Nano开发板 ● MAX7219 32x8点阵显示模块 ● 麦克风/麦克风模块 ● 跳线 ● 3-D 打印机(可选)
什么是MAX7219 32x8点阵显示模块? MAX7219四合一显示点阵模块是一款集成串行输入/输出共阴极显示模块,设计用于安装在水平或在垂直平面上扩展以构建多功能显示面板。该显示模块使用方便的3线串行接口连接到所有常见的控制器板,如Arduino或Raspberry。
该显示模块包含四个8 × 8点阵显示屏和四个MAX7219显示驱动器,每个显示屏一个。一个8x8的LED矩阵模块包含64个LED,以矩阵的形式排列。如果要以电路图的形式绘制模块,我们将得到如下图所示的图片:
如上图所示,8×8点阵显示屏有16个引脚,每行8个,每列8个。在这里,所有行和列都连接在一起以减少所需的引脚数量。这种用较少引脚控制大量LED的技术称为多路复用。 MAX7219 LED显示驱动IC用于控制显示模块。该IC可以精确控制和生成您想要的图案或文字。除此之外,使用此IC的另一个优点是所有64个LED都可以由3个引脚控制。
音乐频谱可视化器电路图 下图显示了32x8点阵显示模块和麦克风与Arduino Nano连接的完整示意图。
点阵显示模块和麦克风均由Arduino Nano的5V和GND引脚供电。但是,如果您打算使用具有最大亮度的点阵,那么最好使用外部5V电源,因为当设置为最大亮度时,显示屏会消耗大量电流。麦克风的数据引脚连接到Arduino Nano的A7引脚。现在,我们只剩下显示屏的SPI引脚了。这些引脚连接到Arduino Nano的硬件SPI引脚,因为硬件SPI引脚比微控制器的软件SPI引脚快得多。
在万能板上搭建电路 本文的想法是将这个电路安装在一个3D打印的外壳内,这样它就可以安装在墙上或放置在音乐系统旁边。为此,我将这个完整的电路焊接在一个万能板上。焊接所有组件后的效果如下所示:
编程Arduino Nano音乐频谱可视化器 在本节中在这里,我们将解释代码的一些重要函数。代码使用了arduinoFFT.h和MD_MAX72xx.h库。这两个库都可以从Arduino IDE库管理器安装。为此,打开Arduino IDE,然后转到 Sketch <Include Library <Manage Libraries。现在,搜索arduinoFFT并安装Enrique Condes提供的arduinoFFT库。
同样,安装由MajicDesigns提供的MD_MAX72xx.h库。
安装所有必需的库后,在代码中首先包含这些库。 ArduinoFFT库用于将输入模拟信号转换为频谱。 MD_MAX72xx库用于控制显示屏并在显示屏上绘制音频频谱。而SPI库用于在Arduino和点阵显示模块之间建立SPI通信。 - #include <arduinoFFT.h>
- #include <MD_MAX72xx.h>
- #include <SPI.h>
复制代码接下来,使用函数MD_MAX72XX()为MD_MAX72XX创建一个实例。此函数需要三个参数,第一个是硬件类型,第二个是CS引脚,第三个是连接设备的最大数量。此外,使用函数 arduinoFFT()为arduinoFFT创建一个实例。 - MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 4);
- arduinoFFT FFT = arduinoFFT();
复制代码然后在接下来的代码中,定义两个新数组来存储频谱实部和虚部的64位频谱分量。 - double realComponent[64];
- double imagComponent[64];
复制代码
现在,在setup()函数中,以9600的波特率初始化串口监视器以进行调试。另外,使用disp.begin()函数初始化点阵显示模块。 - void setup()
- {
- disp.begin();
- Serial.begin(9600);
- }
复制代码
现在,在loop函数中,我们将使用for循环通过Arduino nano的A7引脚获取64个麦克风读数样本,并将其存储到之前定义的realComponent数组中。 - for (int i=0; i<64; i++)
- {
- realComponent[i] = analogRead(A7)/sensitivity;
- imagComponent[i] = 0;
- }
复制代码
从麦克风得到64个频谱值后,我们将它们通过FFT算法计算实部和虚部信号的64个频谱分量。然后在接下来的代码中,我们通过这些读取FFT.ComplexToMagnitude()函数来计算 64 个频谱分量的幅度。 - FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
- FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD);
- FFT.ComplexToMagnitude(realComponent, imagComponent, 64);
复制代码现在,在接下来的几行中,我们使用 for 循环来控制LED矩阵的所有32列。在这个for循环中,我们首先将这些读数转换为已知范围,然后使用map函数将这些读数映射到0到8的范围内。零意味着该特定列的所有LED都将变低,反之亦然。 - for(int i=0; i<32; i++)
- {
- realComponent[i] = constrain(realComponent[i],0,80);
- realComponent[i] = map(realComponent[i],0,80,0,8);
- index = realComponent[i];
- value = spectralHeight[index];
- c = 31 - i;
- disp.setColumn(c, value);
- }
复制代码
3D 打印音乐频谱可视化器的外壳 在万能板上焊接所有组件并对Arduino Nano进行编程后,现在可以为该电路打印一个外壳。为此,使用游标测量装置的尺寸以设计外壳。我的设计完成后看起来像下面这样。 STL 文件也可从Thingivers下载,您可以使用它打印您的外壳。
测试音乐频谱可视化器 硬件和代码准备就绪后,我们将电路安装在3S打印外壳内,如下所示。
我们使用 5V 适配器为设备供电。最初,不会有任何显示,但是当我们在麦克风前播放音乐或讲话时,点阵显示器的LED会根据信号强度发生变化。
以上这就是如何使用点阵显示模块和Arduino来构建音乐频谱可视化器。本文使用麦克风进行声音输入,但如果需要,您也可以使用手机/音乐系统外的耳机。如果您对此项目有任何疑问,请随时在本帖下进行回复。
|