×

具有颜色选择的音频频谱可视化器

消耗积分:2 | 格式:zip | 大小:0.05 MB | 2022-11-04

王兰

分享资料个

描述

我对可寻址的“Neopixel”RGB LED 的可能性很感兴趣。我想学习如何控制它们并在具有挑战性的项目中使用它们。我读过一些使用 LED 阵列和矩阵来表示音频频谱的项目,就像图形均衡器上的照明显示器一样。

我想到了一些不同的东西。一个垂直的 LED 串怎么样,低频在底部,高频在顶部,每个频段的幅度会显示为每个 LED 的亮度?然后音乐将沿着这条弦“跳动”。我当然不是第一个想到或执行它的人,但我还没有看到这个特定的应用程序。

如果 LED 的亮度由音乐控制,LED 的颜色可以由设备的用户设置吗?

这个怎么运作

该设备的电路和代码以两种模式运行。这些模式是通过前面板右侧的模式开关选择的。当模式开关在左侧位置时,颜色设置模式被激活。

颜色设置模式允许用户使用 5 个电位器设置 LED 灯条的颜色范围。具体来说,从左到右,电位器调整:

1.数值——LED灯带的整体亮度

2. 饱和度 - 此设置逐渐在鲜艳的色彩和纯白色之间转换色调

3. 顶部色调 - 指定 LED 灯条顶部的色调(颜色)

4. 底部色调 - 指定 LED 灯条底部的色调(颜色)

当 LED 灯带包含多个 Hue 时,颜色顺序始终遵循色谱的顺序:红色、橙色、黄色、绿色、蓝色、紫色。

要为整个 LED 灯条选择一个色调,只需将顶部色调和底部色调电位器放在相同的位置。

5. Spread - 控制色相沿 LED 灯条的分布范围,从集中在中间到“聚集”在两端。

我使用色相、饱和度和值 (HSV) 颜色模型来控制 LED,而不是 RGB 参数,因为 HSV 直接产生我想要的效果。本文解释并比较了 HSV 和 RGB 颜色模型。幸运的是,代码中使用的 Adafruit Neopixel 库同时支持 RGB 和 HSV。

当模式开关处于右侧位置时,FFT 模式被激活。在这种模式下,电位器被禁用。

FFT(快速傅立叶变换)模式接受来自音乐播放器耳机连接的输入。使用 FFT,它计算每个频带的 HSV 设置的值(亮度)部分。然后它将这个值参数与用户选择的颜色组合起来,并将它们发送到适当的 LED。本文对傅里叶变换进行了简单易懂的解释。实际的计算超出了我的想象,但慷慨的 Arduino 社区再次以 ArduinoFFT 库的形式提供了救援。

电路

电路原理图

poYBAGNkWfqADy-ZAAFMRYhHfSY975.png
 

在此图中,标记为 Arduino Nano (Rev3.0) 的设备实际上是一个 Arduino Nano Every。

标有电压调节器 5V 的设备实际上是一个 5V 降压转换器。9VDC 墙上适配器通过其 Vin 引脚为 Nano 供电,并为降压转换器供电。降压转换器的作用是为 LED 灯条提供 5V 电源。Nano 通过引脚 D3 与 LED 灯条通信。

我使用了这个项目中详述的音频输入电路(在图的左上角):

该电路使用 Nano 的 REF 和 3.3V 引脚,并馈入 A0 模拟输入。

五个电位器用于设置 LED 灯条的颜色和颜色范围。代码部分描述了这五种设置。它们由 Nano 的模拟输入 A1 到 A5 读取。

模式开关用于选择颜色设置或 FFT 模式。开关位置在 Nano 的 D2 引脚上读取。

Fritzing 文件可在下面的原理图部分下载。

面包板组装

pYYBAGNkWf2AX8fuAAPS5IThiEo586.png
 

我为那些想像我一样探索和修改电路的人提供了这张图。面包板也是测试代码和所有组件的最不令人沮丧的方式。Fritzing 文件可在下面的原理图部分下载。

同样,看起来像稳压器的设备实际上是一个 5V 降压转换器。表示为 Arduino Nano(Rev3.0)的控制器实际上是 Arduino Nano Every。所有红线承载 5V,橙色线承载 9V,黑线接地。

原型板和盒子组装

pYYBAGNkWgCAHD4MAAINgLuYxPk646.png
 

该图可在下面的“原理图”部分下载。图示的板比我使用的板大,但它让我能够更清楚地说明布局。

poYBAGNkWgWAe5dCAAupJj4bh8Y610.jpg
 

通过竖起电阻器并将穿孔中的一些连接加倍,我能够将组件挤压到 7cm x 3cm 板上。它非常适合我选择的外壳,有足够的空间可供使用。

Nano 的位置使其 USB 连接器略微悬垂在电路板边缘。我在外壳上切了一个检修孔,我可以通过它连接 USB 电缆。这让我可以在不移除 Nano 的情况下重新编程。

我最初使用橡胶粘合剂将 Nano 直接放置在板上,直到焊点将其固定到位。

我决定在电路板和面板安装组件之间安装 JST 连接器。对于原型而言,这似乎过于热心,但有时间,我只是想熟悉这些连接器。我也怀疑我最终会想要重新安排一些事情。

pYYBAGNkWgyAK3ypAAwhiUwTF0E132.jpg
 

我在“定制零件和外壳”部分包含了我的施工图。这些可以节省您测量、定位和安装组件的时间。您还可以使用它们打印控件的符号。

poYBAGNkWhGAEzO-AAfPgEemQb8054.jpg
 

这张照片显示了 LED 柱组件的底座。该项目要求 LED 灯条包含 29 个 LED。LED灯条的背面是自粘的,所以我把它粘在一块1/2”x1/8”的铝条上。我想扩散 LED 的光,我想到了氯丁橡胶管。它通常具有半透明的白色。我发现这种内径为 12 毫米的管子非常适合灯条和 LED 灯条。光线尚未扩散到我喜欢的程度,我将尝试使用其他材料。我的大女儿,一位艺术家,建议使用聚酯薄膜。

编码

我几乎在每一行代码中都添加了注释,以便在我学到的时候向自己解释。所以在这里,我将更笼统地描述它。

与 LED 灯条通信

该代码使用 Adafruit NeoPixel 库与 LED 灯条进行通信。以下是图书馆图书馆用户指南的链接。

主循环的结构

主循环分为两个循环;颜色设置循环和 FFT 循环。模式开关的位置决定了哪个循环处于活动状态。循环由读取开关位置的“while”语句控制。

void loop() 
while (digitalRead(modeSwitchPin)==LOW){
//Colour Setting code goes here because the mode switch is in the LOW (Colour Set) position.
}
//FFT code goes here because the mode switch is in the HIGH (FFT) position, outside “while” loop.
//If the mode switch is moved to LOW (Colour Set), reset Nano to re-initialize variables and memory.
if (digitalRead(modeSwitchPin)==LOW){
resetFunc();
}
}

当模式开关处于颜色设置位置 (LOW) 时,颜色设置代码将保持循环。

只要将模式开关拨到 FFT 位置 (HIGH),“while”循环就会中断,FFT 代码就会开始循环。

当模式开关再次轻弹到颜色设置位置时,软复位功能被激活,重新初始化 Nano 并允许颜色设置代码再次开始循环。

我包含了软重置功能,因为颜色设置代码在 FFT 代码运行后拒绝运行。我不知道为什么会发生这种情况,但是软重置有效。

发送到 LED 灯条的所有指令都采用 RGB 标准的格式 strip.setPixelColor()。但是,我选择使用 HSV 参数设置颜色,然后将它们转换为 RGB。

颜色设置模式:传播调整

这个特性需要一些解释。我添加了这个调整,因为我想改变沿 LED 灯带的色调分布,从集中在中间到“聚集”在两端。我将 sigmoid 曲线(也称为 s 曲线)公式应用于色调范围。

k=analogRead(kPin); //read k pot, 0-1023

该行读取Spread 电位器的位置。

hueSig[i] = hueMax/(1+(pow(2.718,(0-(k/4000000))*(hue-(hueMax/2))))); //apply s-curve

在这条线中,Spread 电位器 (k) 的值用于调整 S 形曲线的斜率,从而改变每个 LED 的色调。然后每个 LED 的色调变为 hueSig[i]。顺便说一句,我通过实验得出了 4000000 的值。

本文解释了 sigmoid 曲线。我在文章的开头使用了基本方程。

FFT 模式

我当然没有在这里发明任何东西。感谢 Chris Parker 分享他的设计代码。我还借鉴了Arduino FFT 库文档中的示例。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !