×

RGB 32波段音频频谱展示台

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

479461

分享资料个

描述

该项目

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

激发此灵感的原始项目

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

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

WS2812B RGB LED 矩阵

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

出于这个原因,我在 +5V 上串联了一个二极管,以便能够在独立模式下为 Arduino 供电,当 USB 电缆未连接时,并避免 Arduino 成为 RGB 矩阵的电源,所以你避免用它无法提供的电流使威廉希尔官方网站 板的内部威廉希尔官方网站 过载。

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

硬件组装

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

编码

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

我添加了两个功能:

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

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

音频均衡

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

LED亮度

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

我还在努力...

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

未来的乌达

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

敬请关注。:)

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


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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'RGB 32波段音频频谱展示台',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);