一板网电子技术论坛

风筝
发表于: 2021-10-9 16:19:19 | 显示全部楼层

现在大多数音乐会都伴随着一些花哨的灯光秀。几乎所有的音乐会、节日和夜总会都有与之相匹配的视觉表演或效果。那么,为什么不制作自己的音乐频谱可视化器,实现让音乐“动”起来呢?这是一个简单而有效的项目,可使用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,以矩阵的形式排列。如果要以电路图的形式绘制模块,我们将得到如下图所示的图片:

Dot-Matrix-Display-Circuit.jpg


如上图所示,8×8点阵显示屏有16个引脚,每行8个,每列8个。在这里,所有行和列都连接在一起以减少所需的引脚数量。这种用较少引脚控制大量LED的技术称为多路复用。 MAX7219 LED显示驱动IC用于控制显示模块。该IC可以精确控制和生成您想要的图案或文字。除此之外,使用此IC的另一个优点是所有64个LED都可以由3个引脚控制。


音乐频谱可视化器电路图

下图显示了32x8点阵显示模块和麦克风与Arduino Nano连接的完整示意图。

Audio-Spectrum-Visualizer-Circuit-Diagram.png


点阵显示模块和麦克风均由Arduino Nano的5V和GND引脚供电。但是,如果您打算使用具有最大亮度的点阵,那么最好使用外部5V电源,因为当设置为最大亮度时,显示屏会消耗大量电流。麦克风的数据引脚连接到Arduino Nano的A7引脚。现在,我们只剩下显示屏的SPI引脚了。这些引脚连接到Arduino Nano的硬件SPI引脚,因为硬件SPI引脚比微控制器的软件SPI引脚快得多。


在万能板上搭建电路

本文的想法是将这个电路安装在一个3D打印的外壳内,这样它就可以安装在墙上或放置在音乐系统旁边。为此,我将这个完整的电路焊接在一个万能板上。焊接所有组件后的效果如下所示:

Audio-Visualizer-Board.jpg


编程Arduino Nano音乐频谱可视化器

在本节中在这里,我们将解释代码的一些重要函数。代码使用了arduinoFFT.h和MD_MAX72xx.h库。这两个库都可以从Arduino IDE库管理器安装。为此,打开Arduino IDE,然后转到 Sketch <Include Library <Manage Libraries。现在,搜索arduinoFFT并安装Enrique Condes提供的arduinoFFT库。

arduinoFFT-Library-by-Enrique-Code.jpg


同样,安装由MajicDesigns提供的MD_MAX72xx.h库。


安装所有必需的库后,在代码中首先包含这些库。 ArduinoFFT库用于将输入模拟信号转换为频谱。 MD_MAX72xx库用于控制显示屏并在显示屏上绘制音频频谱。而SPI库用于在Arduino和点阵显示模块之间建立SPI通信。

  1. #include <arduinoFFT.h>
  2. #include <MD_MAX72xx.h>
  3. #include <SPI.h>
复制代码

接下来,使用函数MD_MAX72XX()为MD_MAX72XX创建一个实例。此函数需要三个参数,第一个是硬件类型,第二个是CS引脚,第三个是连接设备的最大数量。此外,使用函数 arduinoFFT()为arduinoFFT创建一个实例。

  1. MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 4);
  2. arduinoFFT FFT = arduinoFFT();
复制代码

然后在接下来的代码中,定义两个新数组来存储频谱实部和虚部的64位频谱分量。

  1. double realComponent[64];
  2. double imagComponent[64];
复制代码

现在,在setup()函数中,以9600的波特率初始化串口监视器以进行调试。另外,使用disp.begin()函数初始化点阵显示模块。

  1. void setup()
  2. {
  3.   disp.begin();
  4.   Serial.begin(9600);
  5. }
复制代码

现在,在loop函数中,我们将使用for循环通过Arduino nano的A7引脚获取64个麦克风读数样本,并将其存储到之前定义的realComponent数组中。

  1. for (int i=0; i<64; i++)
  2.   {
  3.     realComponent[i] = analogRead(A7)/sensitivity;
  4.     imagComponent[i] = 0;
  5.   }
复制代码

从麦克风得到64个频谱值后,我们将它们通过FFT算法计算实部和虚部信号的64个频谱分量。然后在接下来的代码中,我们通过这些读取FFT.ComplexToMagnitude()函数来计算 64 个频谱分量的幅度。

  1. FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  2. FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD);
  3. FFT.ComplexToMagnitude(realComponent, imagComponent, 64);
复制代码

现在,在接下来的几行中,我们使用 for 循环来控制LED矩阵的所有32列。在这个for循环中,我们首先将这些读数转换为已知范围,然后使用map函数将这些读数映射到0到8的范围内。零意味着该特定列的所有LED都将变低,反之亦然。

  1. for(int i=0; i<32; i++)
  2.   {
  3.     realComponent[i] = constrain(realComponent[i],0,80);
  4.     realComponent[i] = map(realComponent[i],0,80,0,8);
  5.     index = realComponent[i];
  6.     value = spectralHeight[index];
  7.     c = 31 - i;
  8.     disp.setColumn(c, value);
  9.   }
复制代码

3D 打印音乐频谱可视化器的外壳

在万能板上焊接所有组件并对Arduino Nano进行编程后,现在可以为该电路打印一个外壳。为此,使用游标测量装置的尺寸以设计外壳。我的设计完成后看起来像下面这样。 STL 文件也可从Thingivers下载,您可以使用它打印您的外壳。

3-D-Printed-Casing.jpg


测试音乐频谱可视化器

硬件和代码准备就绪后,我们将电路安装在3S打印外壳内,如下所示。

Music-Visualizer.jpg


我们使用 5V 适配器为设备供电。最初,不会有任何显示,但是当我们在麦克风前播放音乐或讲话时,点阵显示器的LED会根据信号强度发生变化。


以上这就是如何使用点阵显示模块和Arduino来构建音乐频谱可视化器。本文使用麦克风进行声音输入,但如果需要,您也可以使用手机/音乐系统外的耳机。如果您对此项目有任何疑问,请随时在本帖下进行回复。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 580 | 回复: 1168



手机版|

GMT+8, 2021-10-26 10:11 , Processed in 0.027400 second(s), 6 queries , MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2021 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表