亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

RGB 32-Band Audio Spectrum Visualizer

组件和用品

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED 矩阵
× 1
电阻 4.75k ohm
× 3
电阻 100k ohm
× 2
电阻 10k ohm
× 1
通孔电阻,390 ohm
× 1
电容 100 nF
× 2
电容 1000 µF
× 1
SparkFun 按钮开关 12mm
× 1
4x6 cm 多孔原型板
× 1

必要的工具和机器

烙铁(通用)
3,5 mm 插孔分线器电缆

关于这个项目

项目

本项目用于使用 Arduino Nano 和 8x32 WS2812B RGB Led 矩阵制作 RGB 32 波段音频(音乐)频谱可视化器。

激发此灵感的原始项目

非常感谢 Shajeeb 基于 MAX72xx LED 矩阵的原始项目的作者。我只修改了 LED 矩阵的引导部分以使其适应 RGB WS2812B Led 矩阵。

原始项目链接:32-Band Audio Spectrum Visualizer Analyzer

WS2812B RGB LED 矩阵

使用基于 5050 SMD 高亮度 LED 的 RGB LED 矩阵,需要使用外部电源,因为 RGB 矩阵每个 LED 可以吸收超过 10mA 的电流,因此所有 LED 以最大亮度点亮时可以吸收超过 2.5 安培。

出于这个原因,我在 +5V 下串联了一个二极管,以便在未连接 USB 电缆时能够以独立模式为 Arduino 供电,并避免 Arduino 成为 RGB 矩阵的电源,因此您可以避免用它无法提供的电流使电路板的内部电路过载。

对于原始项目,除了输入二极管,为了保护 LED 矩阵输入免受可能的电压峰值影响,我还在 Arduino pind D6 和数据输入之间添加了一个 390 欧姆的电阻器,以及一个 1000 µF 12V 电容器以改善Arduino 电源电压稳定性。

硬件组装

如主照片所示,我使用两个 RCA 音频插座(直接焊接在电路板上)在 4x6 厘米多孔板上制作了第一个原型,也可以用 3.5 毫米母插孔代替。避免嗡嗡声的重要一点是使用屏蔽电缆在源和卡音频输入之间建立连接。另一个技巧是使 Arduino 和 LED 矩阵之间的连接尽可能短。

代码

最后,所有的软件都是基于采样程序作者通过FFT库和Shajeeb的最终实现所做的伟大工作。

我添加了两个功能:

第一个是 GetLedFromMatrix(...) 将矩阵映射到行和列,并能够通过行和列坐标对 256 个 LED 中的每一个进行寻址。

第二个是 - 我随意称为 SetColumn(...) - 根据音频数字化获得的峰值(值介于 0 和 7 ) 并基于二维数组中的预设颜色。您可以根据自己的喜好更改值并因此更改颜色。为了简化代码,我使用了一个名为 Wheel() 的 sobroutine(取自 Adafruit 的 Neopixel 库附带的演示),它从 0 到 255 之间的值开始返回一个无符号的 32 位长值,直接传递给 setPixelColor 函数。在此您可以随意玩,记住 Arduino 的内存限制,尽可能避免使用 32 位变量来存储 RGB 颜色值。

音频 均衡

此外,由于我使用来自集成在 PC 主板中的声卡的音频进行了测试,为了改善频率响应,我添加了一个 32 个值的字节数组,实际上构成了一条均衡曲线来衰减低音和增强高音。如果不需要,只需将 EQ_ON 变量设置为 false 或者通过改变 eq[32] 的 32 个值来改变衰减水平 数组,值为 100 时幅度不变,小于 100 的衰减,大于 100 的加强频段。

领导 亮度

矩阵的亮度在代码中预设为 32 (BRIGHTNESS const)。 WS2812B矩阵的最大亮度值(纸上)是255但已经大于100,不幸的是LED灯从白色变成淡黄色,可能需要通过两条中央红黑线为矩阵供电右侧连接器的。

我还在努力...

最后,如果你使用最大亮度64的话,1A的电源大概就够了,否则2A是必不可少的。

未来的乌达特

我正在开发一个使用 OpenMusicLabs FHT 的新版本 比 Arduino FFT 快很多倍的库。

敬请关注。 :)

原谅我的英语不好,我用了谷歌翻译。

代码

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.inoArduino
/* 版权所有 (c) 2019 Shajeeb TM 特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地处理本软件的许可,包括不受限制地使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向其提供软件的人这样做,但须符合以下条件: 上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。该软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或使用或其他原因引起的或与之相关的软件。 WS2812B Led Matrix vesion by Janux*/#include #include #include #define SAMPLES 64 //必须是 2 的幂#define xres 32 // 总数显示中的列,必须 <=SAMPLES/2#define yres 8 // 显示中的总行数#define ledPIN 6 // 控制 LED 矩阵的品脱#define NUM_LEDS (xres * yres)#define BRIGHTNESS 32#define buttonPin 5 // 改变 displaycolorbyte yvalue;byte displaycolumn, displayvalue;int peaks[xres];byte state =HIGH; 的按钮引脚数// 从输入 pinbyte 中读取的当前读数 previousState =LOW; // 之前从输入 pinbyte 读取 displaycolor =0;//Arrays for sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // FFT 对象unsigned long lastDebounceTime =0; // 最后一次切换输出引脚无符号长去抖动延迟 =100; // 去抖动时间;如果输出闪烁则增加// 参数 1 =矩阵中的 LED 数量// 参数 2 =引脚编号(大多数有效)// 参数 3 =像素类型标志,根据需要相加:// NEO_KHZ800 800 KHz 比特流(大多数 NeoPixel带有 WS2812 LED 的产品)// NEO_KHZ400 400 KHz(经典的“v1”(不是 v2)FLORA 像素,WS2811 驱动程序)// NEO_GRB 像素连接到 GRB 比特流(大多数 NeoPixel 产品)// NEO_RGB 像素连接到 RGB 比特流( v1 FLORA 像素,而不是 v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// EQ 滤波器来衰减低音并改善高音 // 在 PC 声卡上很有用,通常有很多低音和较差的高频bool EQ_ON =true; // 设置为 false 以禁用 eqbyte eq[32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 1,00, 100 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255 };//定义单个led的颜色,用于setColumn函数,0为自定义颜色//颜色为由轮函数计算,见下文byte colors[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, {1, 5, 10, 15, 20, 25, 90, 90} , {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 0, 0}, {170, 160, 150, 140, 130, 120, 1, 1}, {170, 160, 150, 140, 130, 120, 1, 1}};void setup() { pixel.begin (); pixel.setBrightness(BRIGHTNESS); // 开始 FFT 运算 ADCSRA =0b11100101; // 将 ADC 设置为自由运行模式并将预标量设置为 32 (0xe5) ADMUX =0b00000000; // 使用引脚 A0 和外部电压参考}void loop() { // ++ Sampling for (int i =0; i  peaks[i]) peaks[i] =yvalue; //保存峰值 if> previuos peak yvalue =peaks[i];显示列 =i;显示值 =y 值;设置列(显示列,显示值); // 绘制桶 } pixel.show(); // 显示桶 displaycolorChange(); // 检查按钮是否按下以更改颜色模式}//------------------------------------ ----------------------------// 根据y值点亮x列的ledsvoid setColumn(byte x, byte y) { byte led , 一世; for (i =0; i  i) { switch (displaycolor) { case 4://在数组值上设置零 0 以自定义峰值颜色 if (colors[displaycolor][i]> 0) { //颜色数组中定义的正常颜色 pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); } else { //峰的自定义颜色只有数组值为0 pixel.setPixelColor(led, 255, 255, 255); // LED 灯数,R、G、B 值 } break; case 5://按列改变颜色 pixel.setPixelColor(led, Wheel(x * 16));休息; case 6://按行改变颜色 pixel.setPixelColor(led, Wheel(i * 36));休息; default://显示颜色集 -> displaycolor from 0 to 3 //颜色定义在颜色数组 pixel.setPixelColor(led, Wheel(colors[displaycolor][i])); }//结束开关 } else { pixel.setPixelColor(led, 0); } }//======================================================================// 通过 x,y 坐标计算 LED 编号// 对 WS2812B 有效,蛇形布局放置在水平方向// 和右下角的零 LED(右侧的输入连接器)// 输入值:x=0-31,y=0-7,返回 0 到 255 之间的 LED 数字//========================================================================byte GetLedFromMatrix(byte x, byte y) { x =xres - x - 1; if (x &0x01) { //奇数列向后增加 return ((x + 1) * yres - y - 1); } else { //偶数列正常增加 return ((x + 1) * yres - yres + y); }}//========================================================================void displaycolorChange() { int reading =digitalRead(buttonPin); if (reading ==HIGH &&previousState ==LOW &&millis() - lastDebounceTime> debounceDelay) // 仅在按下时有效 { displaycolor++;如果 (displaycolor> 6) displaycolor =0; lastDebounceTime =毫秒(); } previousState =reading;}/* 来自 Adafruit Neopixel 演示草图的实用程序输入 0 到 255 的值以获取颜色值。颜色是过渡 R - G - B - 回到 R.*/unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85;返回 pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3);轮位置-=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}

定制零件和外壳

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

示意图


制造工艺

  1. 32(线性)/11(伪对数)频段音频频谱分析仪
  2. 干渴警报植物警报
  3. 意大利字时钟
  4. Sigfox kWh Meter
  5. 蓝牙温度监视器
  6. 手势控制锁
  7. 伴侣 IC
  8. USB MIDI 适配器
  9. Arduino 的隔离模拟输入
  10. Arduino TV 输出电缆
  11. DIY 植物水分传感器
  12. 测量你的反应时间