我对可寻址的“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 库的形式提供了救援。
电路原理图
在此图中,标记为 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 文件可在下面的原理图部分下载。
面包板组装
我为那些想像我一样探索和修改电路的人提供了这张图。面包板也是测试代码和所有组件的最不令人沮丧的方式。Fritzing 文件可在下面的原理图部分下载。
同样,看起来像稳压器的设备实际上是一个 5V 降压转换器。表示为 Arduino Nano(Rev3.0)的控制器实际上是 Arduino Nano Every。所有红线承载 5V,橙色线承载 9V,黑线接地。
原型板和盒子组装
该图可在下面的“原理图”部分下载。图示的板比我使用的板大,但它让我能够更清楚地说明布局。
通过竖起电阻器并将穿孔中的一些连接加倍,我能够将组件挤压到 7cm x 3cm 板上。它非常适合我选择的外壳,有足够的空间可供使用。
Nano 的位置使其 USB 连接器略微悬垂在电路板边缘。我在外壳上切了一个检修孔,我可以通过它连接 USB 电缆。这让我可以在不移除 Nano 的情况下重新编程。
我最初使用橡胶粘合剂将 Nano 直接放置在板上,直到焊点将其固定到位。
我决定在电路板和面板安装组件之间安装 JST 连接器。对于原型而言,这似乎过于热心,但有时间,我只是想熟悉这些连接器。我也怀疑我最终会想要重新安排一些事情。
我在“定制零件和外壳”部分包含了我的施工图。这些可以节省您测量、定位和安装组件的时间。您还可以使用它们打印控件的符号。
这张照片显示了 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条评论
快来发表一下你的评论吧 !