×

发光的乐器在黑暗中会是什么样子

消耗积分:0 | 格式:zip | 大小:0.43 MB | 2022-11-14

李刚

分享资料个

描述

描述

我想知道一个发光的乐器在黑暗中会是什么样子。

为了考虑到照明模式和乐器声音的某种依赖性,音频频谱分析似乎是一种合理的方法。

作为乐器,我选择了尤克里里,因为有价格合理的 DIY(自己动手)建筑套件,而且我对如何安装 LED 有一个粗略的想法。

在这里快速浏览一下结果:带有 3 个光学元件的音乐会尤克里里琴(指板上的 2 个 LED 灯条,音孔周围的 1 个 LED 环)。

更新 1:同时我构建了第二个(更大的)LED Ukulele 并添加了一些燃烧的火焰效果,见下文。

未来的想法:

  • 使用 LED 可以根据来自无线耦合的移动设备的输入显示和弦甚至简单的独奏线的握持模式。

硬件

尤克里里

这一切都始于购买合适的DIY ukulele 构建套件以下方面对我来说似乎最重要:

  • 指板的“尺寸”。由于 LED PCB 和电线需要一定的安装空间,所以我选择了音乐会尤克里里(又名“23 英寸”。长度约为 38 厘米。最常见的尤克里里,女高音尤克里里,对于这个来说肯定太小了一种使用下面描述的电子硬件的项目。)。根据我的“理论研究”,我认为指板的宽度在最小范围内约为 4 厘米,前 10-12 个品格之间的距离(我想用来显示音频频谱分析的结果)也应该对于最近的品格(即 10、11、12 品格),应为 ~>1 cm。但是,如果我要重复这个项目,我可能会选择下一个更大的 Ukulele,即 ,因为事实证明 - 可能是由于制造公差和我有限的工具集和工匠技能 - 我无法遵循我最初的计划。我需要更多的建筑空间来安装所有 LED PCB 或更小的 LED PCB。(我使用的 LED PCB 的直径约为 9-10 毫米,高度约为 3 毫米)。
  • 更新 1:同时我找到了一个合适的“更大”(即 23" aka 中音 ukelele DIY 套件。但事实证明,指板上端的宽度仍然太窄,无法将 4 个 LED 排成一行。不过它是可以在每个品格 1 到 11 上安装 4 个 LED。
  • 确保您购买了带有分离的琴颈和指板的 DIY ukulele 构造套件(因为您必须在中间放置 LED PCB)。相对于指板,请确保其厚度(通常为 4 毫米)与您选择的 LED PCB 相匹配(在我的情况下,LED PCB 高度约为 3 毫米),以便提供足够的安装空间。也许获得 6 毫米厚的指板也是减轻一些制造挑战的好主意。
  • 大多数 DIY 构造套件都带有相当差的调音钉。那些通常很容易失谐,因此您最终可能会得到一个很好的照明但听起来很糟糕的尤克里里琴。因此,将合适的调音钉与您的 DIY ukulele 构建套件一起购买可能是个好主意。我说的合适是什么意思?尤克里里琴头架上的调音钉基本上是直的,而其他的则旋转 90°(使用蜗轮和小齿轮)。我更喜欢后者。两种类型都显示在下面的一张图片中。注意:根据我的经验,用于调整主轴箱中的销钉的孔的直径没有标准。所以确保你得到匹配的。我很幸运,因为我家里有一些旧的调音钉,它们很合身。
  • 最后但并非最不重要的一点是,您可能还想获得合适的琴弦,因为某些构造套件附带的琴弦相当便宜,导致 - 再次 - 频繁失谐和/或声音不佳。

电子产品

由于可用空间有限(它是四弦琴,而不是吉他),我选择了Arduino Nano 它的内存和速度应该足以进行音频频谱分析,并且它与用于控制我连接到 WS2812B 类型条带的 LED PCB 的 FastLED 库一起工作。

为了让 Arduino Nano 发出四弦琴的声音,我决定使用 Adafruit 的制动板(Adafruit MAX4466 驻极体麦克风),它使用宽带驻极体麦克风记录声音并允许调整增益。因此,可以调整 Arduino 的输入声级(因为我不知道 ukulele 身体的声音分布如何)。此外,包装足够小,可以满足使用 ukulele 的有限建筑空间的要求。Aruino Nano 的 3.3 V 和 GND 之间的 470µF 电容器用于降低 3.3 V 电源线中的噪声(否则会导致指板中每个 LED 灯条中的第一个两个 LED 闪烁。只需在面包板测试设置中将其移除即可明白我在说什么。)。

我还添加了一个电位器,可以调节 LED 的亮度这可能会派上用场,以将 LED 亮度调整到周围的光线水平。在相当黑暗的房间里,太亮的 LED 可能会令人不安。此外,如果您的电源耗尽或所有 LED 都以最大亮度点亮,电压可能会下降到导致 Arduino 运行不稳定的水平。

添加了一个简单的按钮,以方便选择不同的闪电模式/操作模式这可以通过软件简单地改变(例如,添加或删除新的组合)。如果在执行代码的设置部分期间按下按钮(实际上只是在为电子设备供电之前按下它)所有 LED 将打开和关闭一次,以提供一种快速检查 LED 功能/连接到发光二极管。

典型的可用 LED 串(RGB,可单独寻址)具有等间距的 LED。由于音柱之间的距离不断变化,这对我的项目来说不是一个有用的方法。我偶然发现了 WS2812b 类型的单个 LED (即 RGB LED,带板载 WS2811 IC,见下图),可以像典型的 WS2812B LED 灯串一样使用 FastLED 库轻松控制。确保这些 LED PCB 的高度适合您的指板厚度。不幸的是,我无法向卖家提供链接,因为他不再提供此类 LED。:-(

 
 
 
pYYBAGNxJJuAVJpsAAfPqQzUsuk770.jpg
 
1 / 2使用 WS2812B LED PCB(前视图,在分离成单个 LED PCB 之前)
 

剩下的就是电线、焊料和耐心……(为什么要有耐心?30 个 LED PCB,带 6 个紧密间隔的焊料连接,每个都结合了有限的工具集和工匠技能……你会自己发现的…… )

制造1 部分:为尤克里里添加 LED

对我来说最关键和不确定的部分是我是否可以制造包含 LED PCB 的指板,所以...

...我首先在指板背面标记 LED PCB 的位置。之后,我在标记位置的中心钻了一些凹坑,并且足够深,以便它们可以容纳来自/进入指板后侧的 LED PCB (在我的情况下约为 3 毫米)。这里更厚的(如上所述的 6 毫米指板)可以让我选择为焊料和电线提供一些安装空间,但是,我只有 4 毫米厚的指板可用。

这时我也不得不意识到,特别是在指板的上部狭窄部分(品格 1 到 5),我无法达到必要的精度来将 4 个 LED PCB 彼此相邻放置(只有一个品格)。这就是为什么我最终在品格 1 到 5 中只有 2 个 LED PCB,在品位 6 到 10 中只有 4 个 LED PCB(总共 10 + 20 = 30 个 LED PCB)。

 
 
 
 
 
1 / 5指板,后侧,带标记位置的 LED 和 4 个很好和 2 个严重钻孔的凹坑。
 

接下来,我使用普通的手工艺品胶水将 LED PCB 粘贴到凹坑中。由于 LED PCB 有 6 个焊盘(2x GND、2x VCC、1x Din、1x Dout),我决定了下图所示的方向。注意数据流向!由于每个 LED PCB 分别有 2 个互连的 GND 和 VCC 焊盘,因此只有 1 个 DataIn 和 1 个 DataOut 焊盘,因此此处 LED PCB 的连接顺序/方向/方向很重要。选择的方向和对齐允许直接连接每个 LED PCB 的 GND 和 VCC。

此外(由于上面提到的事实,我没有成功在所有音品中安装 4 个 LED)我将 LED 分成 2 个单独的光学元件/串。为了节省宝贵的安装空间,第 2 串 LED 的 GND 和 VCC 直接连接到第 1 串 LED 的适当位置(从而为第 2 串节省了单独的 VCC 和 GND 线)。

现在必须将带有 LED PCB 的指板安装到琴颈上如果能够以完美的直线将 LED 与电线连接起来,则可以考虑将电缆铣入颈部的通道。我也尝试过使用铜带,但由于拓扑结构的原因,我无法获得足够的电接触。

但是,如下图所示,在我的情况下,电线连接远不是直线排列的。此外,虽然凹坑可以很好地容纳 LED PCB,但焊料却伸出了这些凹坑。因此我决定使用一些大约 2 毫米厚的泡沫橡胶(“Moosgummi”)。我使用多用途胶水/手工艺品胶水将泡沫橡胶粘在指板和琴颈之间. 这是最精细的制造步骤之一,因为它是不可逆的。就像如果您只是使用 DIY 构造套件制造四弦琴(不带任何 LED),您必须以适当的压力压缩这个三重堆栈(琴颈、泡沫、指板)一段时间。数字?不知道。倾听你内心的工匠。如果您需要有关如何将各个部分组合在一起以最终制作出尤克里里琴的信息,还可以查看视频教程。

我很高兴看到在这个具有挑战性的制造步骤之后我仍然可以控制所有的 LED。关于胶水:我建议在进行上述不可逆制造步骤之前进行一些测试。在我的情况下,木胶没有起到作用。它没有粘在橡胶泡沫上。我试过的另一种“办公桌”胶水没有粘在脖子上。最后我的妻子想出了合适的胶水。谢谢!还要确保您的胶水既不导电(这可能会使 LED PCB 或电缆的某些部分短路),也没有可能损坏 LED PCB 的腐蚀性溶剂。起初我担心泡沫橡胶可能会过多地抑制/抑制尤克里里琴弦的振动,从而导致尤克里里发出无声的声音。这不是真的,至少在我的印象中不是这样(尽管我没有将它与基于相同的 DIY 构造套件制造的第二个尤克里里琴进行比较,没有光学元件和/或泡沫橡胶)。

 
 
 
poYBAGNxJKGAUojnAADKN0EjH5k887.jpg
 
1 / 2小型尤克里里的有线指板(后视图)
 

完成此操作后,四弦琴其余部分的组装非常简单。教程、视频等可以在 www. 这是我购买 DIY 工具包的地方,它们还链接到教程视频:( https://www.kirstein.de/Konzert-Ukulelen/Classic-Cantabile-UC-240-DIY-Ukulele-Bausatz-Konzert.html?userInput =ukuele&ignoreForCache[]=userInput&queryFromSuggest=true&ignoreForCache[]=queryFromSuggest )。

我还添加了第三个光学元件:环绕四弦琴音孔的 LED 环。这个 LED 环具有相似的 LED 类型(可能还有 WS2812B,但不再 100% 确定了),因此可以通过与指板上的两个 LED 条相同的软件例程进行控制。详情见下文软件说明。我的印象是这个 LED 环确实对尤克里里的声音有影响。这是有道理的,因为弦乐器的声音——至少在我的理解中——很大程度上受到身体上下部分振动的影响。目前我用双面胶带将 LED 环粘在机身上。如果只用例如 4 个螺钉而不是胶带连接它,也许会改善这种情况。

制造第 2 部分:为尤克里里添加电子和威廉希尔官方网站

我选择的安装位置如下图所示。我的边界条件是:

  • 修复/错误修复硬件的可能性:因此所有组件都由螺钉固定(没有胶合或夹紧等),以允许拆卸/拆卸。此外,每条电缆仅焊接了一端。另一端使用母跳线连接器连接到 Arduino Nano。
  • Arduino 的 USB 连接器应该可以方便地访问以用于未来的软件更新。
  • “大面积组件”,例如麦克风分线器和 Arduino Nano,应安装并固定在尤克里里琴体上,不得倾斜(-> 要求使用曲率尽可能小的尤克里里琴体表面。)
  • 在弹奏尤克里里时,灯光模式选择按钮应易于操作。
  • 在使用过程中,电线(例如,到 LED 元件或整个系统的电源的电源和数据)不应位于“移动部件”(即弹奏或拨弦手或将尤克里里琴弦推到指板上的手)所在的位置。
 
 
 
poYBAGNxJKqAdGZ2AAZiceC4aWk085.jpg
 
1 / 3各种元件的安装位置。
 

虽然对于某些元件,安装孔可以简单地通过钻孔来建立,但对于其他部件,必须使用钻孔和锯切的组合。

 
 
 
poYBAGNxJLKAAR6rAAdXfY8S2wA724.jpg
 
1 / 2有线 Arduino Nano 正在安装到位...
 

最后说说电源通常,WS2812B LED 已经在 3.5 和 5 V 之间的相当低的电压下运行。虽然 3.5 V 对 Arduino 来说太低而无法可靠运行,但超过5.some V 会损坏 LED。由于我想使用可充电电池,我决定使用 4 节 AA 尺寸的可充电镍氢蓄电池。注意:如果有人放入不可充电电池(通常每个电池提供 1.5 V),电源可能会杀死您的 LED。(我个人非常不喜欢这种情况,因为大部分工作都涉及将 LED 放入指板。对于简单的保护威廉希尔官方网站 有什么想法吗?)

关于电流消耗:假设所有 3 个 LED 元件以中等(~0.5)亮度和“半白”(即各种颜色的混合)完全点亮,单个全白点亮 WS2812B LED 消耗 60 mA,电流约为(10 + 20 个 LED) * ( 0.5 x 60 mA) * 0.5 ~ 450 mA 是必需的,可由所选电池供电。提高亮度(使用电位计)会导致功耗显着增加,有时(我假设)Arduino Nano 运行不稳定(由于电压降)和“奇怪”或“卡住”的照明模式。

电源将通过一些钩环紧固件(“Klettverschluss”)连接到尤克里里琴体的背面,以实现真正的移动应用。

这就是硬件。其他任何东西都是软件。

软件

在尝试重现 Antoine Rochebois 项目时,我学到了很多关于 FFT 和 WS2812B LED 控制的知识(https://create.arduino.cc/projecthub/AntoineKia/interactive-led-table-for-50-650b83?ref=platform&ref_id=424_trending___&offset= 84 ) 使用 Arduino Uno。

所以我基本上是把东西插在一起,修改了一些部分,添加了几行代码。下面代码中的注释应该包含所有必要的解释。

一般的

对于每个 LED 灯条/环,使用一个单独的阵列(以便于访问和编程)。

每个 LED 灯条/环的控制(色调、饱和度和值)由单独的子程序完成 - 这些子程序仅在相关变量的名称(阵列名称、阵列中的 LED 数量等)上有所不同。这可以通过仅使用 1 个子程序/函数来改进,该子程序/函数被称为 w/适当的参数集。但是,我在编程方面经验不足,尤其是在将数组移交给函数时。幸运的是,由于 LED 的数量有限,这不是必需的。

设置

在设置例程中,每个 LED 都会点亮一次,以检查它们是否仍在工作。

主要的

在主要部分,首先收集音频数据,然后是 FFT。

之后,通过评估电位器设置来确定 LED 亮度。这以及音频数据收集是在 Arduino 中所谓的 ADC自由运行模式下通过直接访问微处理器的寄存器来完成的。

接下来,根据按下按钮的次数确定闪电模式。(如果没有按下按钮,则所有光学元件都关闭!)

最后将相应的值写入 LED 阵列,并通过调用 FastLED.show() 显示所有内容。

最后的一些评论

虽然我仍然喜欢四弦琴在演奏时不断变化的照明,但我的印象是这种模式并不是 FFT 的结果。然而,这可能是将音频频谱从 20 Hz - 20 kHz 分别映射到仅 2 个(品格 1 到 5)或 4 个(品格 6 到 10)LED 箱的结果。此外,每个 LED 箱的高度非常有限,只有 5 个 LED。另一方面,尤克里里产生的声音(尤其是在项目特定修改之后)可能是真的,与正弦波相差甚远,导致宽带 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:'发光的乐器在黑暗中会是什么样子',//标题 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);