×

BeagleBone LED音频光谱仪

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-20

陈利妮

分享资料个

描述

我们的项目涉及连接六个 LED 矩阵和音频输入。目标是获取音频输入,执行频域分析,然后将频谱显示在作为光谱仪的 LED 矩阵上。

我们设法获得音频输入并在主机上进行频域分析。然后主机将像素数据发送到使用猎鹰播放器控制 LED 矩阵并创建音频频谱仪的袖珍比格犬。

在以下位置查看正在运行的项目:

 

另请查看我们的维基百科项目页面:https ://elinux.org/ECE434_Project_-_LED_Matrix

第一步:硬件设置

我们很幸运在收到 LED 面板时收到了已经放在一起的 LED 面板。要连接 LED 面板,请对齐面板背面的箭头,使它们都朝向相同的方向,然后将每个面板水平连接到与其相邻的面板。最后两个面板将连接到 PocketBealge 的 PocketScroller Cape。PocketBeagle 直接连接到 PocketScroller Cape。

第二步:安装

转到https://github.com/grinstba/LEDMatrix并将存储库克隆到您的计算机

转到https://falcon-player.gitbooks.io/falcon-player-manual/content/chapter_three_installation/downloading_the_falcon_player.html并按照说明下载最新的 falcon 播放器映像,然后将其闪存到您的一张 SD 卡中。确保下载 Beagle Bone 映像而不是 Raspberry Pi 映像。此外,我们没有在 eMMC 上运行猎鹰播放器。

安装 falcon 播放器后,启动您的 Beagle Bone 并使用以下凭据 ssh 进入它:

  • 用户名:fpp
  • 密码:猎鹰

默认情况下,我们正在运行的图像不允许 root 登录。您将需要根登录才能在 Beagle Bone 上访问互联网。为了设置互联网访问,首先使用上面列出的默认用户名和密码 ssh 进入 Beagle Bone。下面的root访问说明修改自https://elinux.org/EBC_Exercise_02_Out-of-the-Box, _Bone

然后在 Beagle Bone 上运行以下命令

bone$ sudo bash
root@bone# nano /etc/ssh/sshd_config

搜索行

#PermitRootLogin prohibit-password

并将其更改为

PermitRootLogin yes

保存文件并退出编辑器。重新启动 ssh 以便它重新读取文件。

root@bone# systemctl restart sshd

并为 root 分配密码。

root@bone# passwd

现在在主机上打开另一个窗口并输入:

host$ ssh-copy-id root@bone

并输入根密码。测试它:

host$ ssh root@bone

您应该无需密码即可连接。现在回到 Bone 并关闭 root 密码访问。

root@bone# nano /etc/ssh/sshd_config

恢复线路:

#PermitRootLogin prohibit-password

并重新启动 sshd。

root@bone# systemctl restart sshd
root@bone# exit
bone$ exit

现在,在您的主机上运行以下命令来获取网络信息:

host# ip -a

对于我们来说,在 WiFi 网络上以下列方式运行ipMaskquerade.sh脚本:并重新启动 sshd。

host# ./ipMaskquerade.sh ens33

然后运行firstssh.sh脚本

host# ./firstssh.sh

连接到互联网后,继续将我们的 GitHub 项目从https://github.com/grinstba/LEDMatrix克隆到 pocket beagle 上

克隆项目后,运行install.sh脚本以安装项目运行所需的包。

第二步:用户说明

以下许多图片和说明来自 Mark A. Yoder 的文档,可在此处找到

为了点亮整个 32x64 LED 面板白色(红色、绿色和蓝色全部亮起),您至少需要一个 5V 4A 电源。每个面板都有一个电源连接和一个数据输入和数据输出连接。数据输入连接控制面板的操作方式,数据输出连接允许您将面板菊花链在一起以创建大型显示。下图显示了连接。

poYBAGOSoIaAS_w1AAFRxzFlp_s912.jpg
 

https://markayoder.github.io/PRUCookbook/01case/case.html#case_rgb_matrix

一旦 falcon 播放器映像已闪存到 SD 卡,将 SD 卡插入 Beagle Bone 并通过 USB 电缆将其连接到主机。浏览器访问https://192.168.7.2 ,您将看到如下所示的 falcon 播放器控制面板。

pYYBAGOSoIiAItQBAADTiwmuD2w265.png
 

https://markayoder.github.io/PRUCookbook/01case/case.html#case_rgb_matrix

您可以使用控制面板中的设置来设置 LED 矩阵的方向。首先将状态页面上的FPPD模式切换为桥接,如下图所示。

https://github.com/grinstba/LEDMatrix /blob/master/Setup/StatusPageBridgeSetup.PNG

然后,导航到“输入/输出设置”选项卡并单击“通道输入”。将 96 个输入通道配置为具有 384 的宇宙大小,如下图所示。

pYYBAGOSoIyAO-m7AADGlSUHnlk991.png
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/UniverseSetupInputChannels.PNG

在同一个输入/输出设置选项卡中,单击“通道输出”。将 96 个输出通道配置为具有 384 的宇宙大小,如下图所示。

poYBAGOSoI-AOhbsAADF53q6N4Q552.png
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/UniverseSetupOutputChannels.PNG

接下来,在“输入/输出设置”选项卡下,导航到“LED 面板”。您可以在此处设置输出宇宙在物理 LED 面板上的表示方式。将面板布局设置为 2X3,将单个面板大小设置为 64X32 1/16 扫描,将面板伽玛设置为 2.2。您可以选择您想要的亮度。颜色深度是 8 位,连接是 Hat/Cap/Cape。LED 面板的颜色布局为 RGB,这意味着面板上的每个小方块灯都有 3 个通道;红色通道、绿色通道和蓝色通道。这意味着每个面板总共有 64X32X3 = 6144 个通道。因为我们有 6 个面板,所以我们总共有 6144X6 = 36864 个通道。将接线引出线设置为 PocketScroller。查看 LED 面板布局部分,留下“从前面查看配置?” 检查。由于面板布局为 2X3,每个物理输出有两个物理输出编号和 3 个面板编号。“前视图”的左列应设置为每一行的 O-1,随着从上到下,P 从 1-3 增加。“前视图”的左栏应设置为 O-2,从上到下,P 从 1-3 增加。每行的箭头应从右列指向左列。所有这些设置如下图所示。输入所有这些设置后,单击保存,然后单击屏幕顶部红色框中的“重新启动 FPPD”。查看物理 LED 矩阵背面显示的箭头,以确定放置它的方式,使其配置与您刚刚在 Falcon Player 上设置的方向相匹配。为了匹配这个设置,

poYBAGOSoJKAdxGvAACRd8OpDQk072.png
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/LEDPanelSetup.PNG

以这种方式设置 LED 矩阵后,底部带状电缆将连接到 J1,顶部带状电缆将连接到 PocketScroller 上的 J2。启动 LED 矩阵。此时,在 Falcon Player 中,您可以导航到 Status/Control 并单击“Display Testing”选项卡。将结束通道设置为 36864,然后选中“启用测试模式”复选框,如下所示。

pYYBAGOSoJSAE4gvAABu5aSHQUs381.png
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/DisplayTesting.PNG

此时,如果一切配置正确,LED 矩阵应点亮,如下所示。如果您选择打开矩阵上每个通道的测试模式,电源可能无法跟上负载,矩阵可能会关闭。

poYBAGOSoJqALzEWAACuSs9SWwA573.jpg
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/DisplayTestingPhysicalMatrix.jpg

单击“启用测试模式”复选框以停止测试显示。您现在可以运行频谱图程序了。导航到 LEDMatrix git 存储库在本地驱动器上的克隆位置。然后运行 ​​Spectrogram.py。

第三步:操作理论

下图显示了我们的项目如何工作的总体概述。扬声器输出的声音由我们笔记本电脑的麦克风接收。然后处理该音频信号以获得其振幅与频率的关系。然后,我们使用此信息来决定我们的 LED 灯条的高度,这些灯条会从主机传送到 PocketBeagle。

pYYBAGOSoJ6AB6yTAAAtCLxhn58791.jpg
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/Operation%20Overview.jpg

仔细观察我们的软件,下图分解了逻辑流程。首先,我们必须建立与运行在 PocketBeagle 上的 Falcon Player 的连接。然后我们为 LEDMatrix 设置音频处理参数和宇宙大小。一旦这些设置完成,程序就会不断地监听音频输入,对音频执行快速傅立叶变换,为我们提供振幅与频率信息,将这些值划分到我们指定的范围内,将这些振幅值转换为 LED 通道信息宇宙,并将 LED 信息发送到 PocketBeagle。

poYBAGOSoKCASQtlAABIcvrf1jk900.jpg
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/Software%20Operation.jpg

为了更好地理解我们如何利用宇宙来控制矩阵,我们创建了下图。我们选择了 universe 大小,以便每个 universe 都是两个完整的垂直 LED 列。这意味着从左到右总共有 96 个宇宙。我们的软件从左侧的宇宙 1 开始,在右侧以宇宙 96 结束。我们将频谱图中的每个条指定为 3 个宇宙宽,或 6 列 LED 宽。因此,我们有可能在矩阵上有 26 个柱。为了使条形之间的分隔看起来更好更容易,我们只使用 21 个条形,并在每个条形之间留出一个空间,我们不向其写入数据。由于宇宙从上到下环绕,每次计算振幅时,

pYYBAGOSoKOAHcORAABM4X7qYFg520.jpg
 

https://github.com/grinstba/LEDMatrix /blob/master/Setup/Panel%20Theory.jpg

结论:

最后,这个项目是一个有趣的挑战,让我们有机会测试我们的信号处理技能,并了解如何配置、控制和可靠地更新 LED 矩阵。一些有趣的潜在添加可能包括使用音频信号检测歌曲的 BPM(每分钟节拍数),并将条形颜色或其他模式更新为音乐的确切 BPM,而不是仅更新频率范围的振幅。


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

评论(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:'BeagleBone LED音频光谱仪',//标题 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);