在之前的一篇文章中,介绍了如何使用Arduino制作一个音频频谱分析仪的原型。本文将介绍在此基础上的改进版本,包括硬件设计和软件编程的详细步骤。
音频频谱分析仪的核心是傅里叶变换,它基于傅里叶定理,该定理指出任何波形都可以分解为一系列简单的正弦波。傅里叶变换的目的是找出这些正弦波的频率和振幅。在显示方法中,频率在对数基础上从0Hz到22KHz进行设定,这与耳朵的工作范围相对应。然后,振幅以条形图的形式表示。
在几乎所有的实现中,FFT(快速傅里叶变换)算法被用来进行傅里叶变换,因为它足够快。Bass.dll和Bass.WASAPI.dll库内置了FFT变换的方法。
原始硬件设计是作为原型设计的,因此它并不适合周末快速完成的项目。如果想要构建它,那么需要额外的工作,比如设计PCB。对于初学者来说,设计PCB可能会感到沮丧和困难。为了克服这个问题并使组装更容易,设计了一个PCB和电路图。
但是,这并不是唯一的改进。最初使用了一对MAX7221恒流LED驱动器,它们很好,但是要获得不错的分辨率,至少需要8个,而且布线会很麻烦。幸运的是,可以在eBay上以几块钱的价格购买基于HT1632C的LED显示屏。HT1632C也是一个恒流LED驱动器,但它是专门为LED矩阵设计的,所以一个芯片可以驱动8x32像素,这很好。此外,它使用串行、类似SPI的传输,因此8x32像素LED阵列只需要5根线。为了获得不错的垂直分辨率,使用了两个显示屏,所以最终的显示矩阵高度为16像素,宽度为32像素。
幸运的是,有一个Arduino库是为HT1632C设计的,所以不需要重新发明轮子。在软件开发过程中,发现库提供的例程在绘制频谱数据时速度较慢,所以修改了库,添加了新的方法,允许直接修改显示缓冲区。当然,修改后的库代码包含在发布中。
项目使用Arduino Nano而不是Uno。Nano与Uno使用相同的微控制器,但体积更小,并且使用迷USB连接器而不是USB-B。此外,它也可以在eBay上以几块钱的价格购买。
当完成新的硬件原型后,觉得它有点无聊,所以让它变得更有趣。一个16x32的显示屏有很多可能性,有一个热敏电阻和一个RTC(实时时钟)板,已经很久没有使用它们了,所以将它们集成到最终设计中,所以当设备通电但未使用作为音频频谱显示时,它会显示当前时间和温度。
RTC是一个MAX DS1307板,也可以在eBay上购买。热敏电阻只是一个温度依赖的电阻,它像电压分压器一样连接,所以它为不同的温度产生不同的电压。访问和使用DS1037并不困难,因为它也有非常好的Arduino库,可以在这里找到。(注意:所有必需的库都包含在代码中,不需要单独下载它们)
PCB和原理图是使用Eagle创建的。Eagle PCB是目前行业领先的PCB设计软件之一,原始的Arduino板也是使用Eagle设计的。PCB和原理图是根据Creative Commons Attribution-Share Alike 4.0 International许可条款发布的。
用外行的话来说,这意味着只要给原始设计以信用,就可以对设计做任何想做的事情。不幸的是,不是PCB设计的专家,所以朋友和同事Zsolt Molnár在设计板上提供了帮助。设计规范之一是它需要在家制作和组装。
许多开源硬件设计缺乏这个特性,因为它们使用了SMD组件。对于初学者来说,焊接SMD组件可能非常困难,并且需要特殊工具。这个板只使用通孔组件和一个单面PCB,可以在家蚀刻。关于家庭PCB蚀刻或铣削的教程可以在各种网站上找到。在“兴趣点”部分,提到了一些。但警告,这并不像听起来那么容易。掌握这项技能需要大量的练习。
或者,可以使用提供的文件从当地的PCB制造商那里订购PCB。
代码分为两部分。一个微控制器程序和一个PC软件。PC软件基于之前文章中介绍的实现,但已经重新设计。
第一个主要区别是移除了频谱条,以减少CPU需求。以前的程序使用了WPF进度条,它在单个核心上产生了100%的负载。在将来的版本中,可能会添加一个基于WritableBitmap的显示。
第二个主要区别在于通信,它是基于打包的,而不是计数接收到的字节。这是必需的,因为显示屏支持各种模式,如频谱、反相频谱、电平模式和时间配置。
每条消息是34个字节。第一个字节确定显示模式,然后是33个字节的数据和一个以十六进制值0xFF结束的字节。Arduino代码分为三个文件,目前由于全局变量,它有点混乱,但一旦有更多的时间,会清理它。
代码可以在github上找到,更具体地说,是在https://github.com/webmaster442/BassPlayer仓库。这是正在进行的音乐播放器的工作仓库。它也使用了Bass.dll组件,因此播放器和频谱分析仪共享了一部分代码库。播放器有一些不错的功能,但也存在一些问题,因为没有时间修复它们。
这是几个月前在开发原型时制作的视频演示。它展示了所有模式,除了反相频谱,因为它是上周添加的。
DS1307 RTC板 - 1件
[Ebay链接]
HT1632显示屏模块 - 2件
[Ebay链接]
ArduinoNano
[Ebay链接]
或
[Amazon链接]
10K 0.3W电阻 - 3件
10K热敏电阻 - 1件
16V, 4700µF电容器 - 1件
Wago PCB端子块类型:W237-102 - 5件
10K或100K电位器 - 1件(用于控制显示亮度)
电路技能:电路板蚀刻(Youtube)
便宜、友好、精确的PCB蚀刻(Make)
DIY PCB蚀刻(Fritzing)
Eagle教程1:原理图设计(Youtube)
Eagle教程2:印刷电路板布局(Youtube)
Bass.net网站