在这个由两部分组成的系列的第二部分中,我们通过在Arduino IDE中添加必要的代码并上传音效片段,将我们的硬件组装变成一个功能齐全的音效板。
本文引用地址:
在本项目的前半部分,我们逆向工程了一个智能语音模块,并设计了一个自定义的按钮矩阵键盘。然后,我们将这些组件连接到一个ATmega328微控制器上,创建了如图1所示的音效板设备。
图1 放置在3D打印外壳中的All about Circuits硬件音效板现在,在第二部分中,我们将通过讲解Arduino代码来完成这个项目,这些代码将使音效板运行。我们还将讨论如何将音效片段上传到其内存中并正确组织它们。
注意:在继续之前,您需要按照“使用Arduino微控制器制作您自己的硬件音效板”一文中的步骤构建电路。除了组装说明外,该文章还包含了音效板项目的物料清单(BoM)、电路原理图、CAD文件和STL文件。
创建Arduino草图
要开始编写代码,我们首先需要在Arduino IDE中创建一个新的草图。我们将通过在代码头中包含两个免费可用的库来简化我们的设计:
DYPlayerArduino.h库将DY1703A的专有通信协议实现为方便易用的C++函数。这使我们无需手动向IC发送命令。Keypad.h库帮助我们读取按钮矩阵的按键。
定义对象、变量和常量
我们的下一步是创建一个播放器模块对象:
之后,我们将声明并初始化一个6行3列的字符矩阵:
该矩阵使用18个连续的字母来表示我们的18个按钮。
完成后,我们将定义每个行和列总线连接到微控制器的GPIO引脚:
最后,我们使用这些矩阵变量作为参数初始化一个键盘对象实例:
字符到索引偏移
要访问内存中的文件,我们需要使用其索引值。由于我们有18个音效片段,索引将由1到18之间的整数值表示。然而,当按下按钮时,键盘检测到的并不是文件索引。相反,按钮的值注册为我们刚刚定义为字符矩阵元素的小写字母之一。
要将该字符的ASCII编号转换为文件索引范围内的整数,我们需要创建一个偏移常量。因为字母“a”的十进制ASCII值为97,我们将使用偏移常量值96:
Setup函数
我们的草图的setup函数初始化了我们创建的播放器对象并调整其音量。在下面的代码片段中,我将音量设置为20%。
Loop函数
我们需要包含的最后一段代码是草图的loop函数。首先,我们需要声明一个变量,该变量将在按下键时保存键的字符值。为了扫描按钮矩阵并确定实际按下了哪个按钮,我们使用keypad库中的以下get函数:
customKey变量现在包含按钮按下的ASCII字符值。我们从该键值中减去ASCII偏移常量以获得我们的文件索引。然后,我们调用一个以该文件索引为参数的播放函数,并等待一定时间让其播放(我设置为1,000毫秒):
这个过程使DY1703A从其闪存中获取具有特定索引的文件,解码该文件的MP3信号,然后将其发送到LTK5128的输入端,由连接到其输出的扬声器放大并播放。
上传代码
现在我们的代码已经完成,我们可以继续上传它。如果您使用的是Arduino开发板,这个过程很简单。如果您只使用微控制器,请按照Arduino的“从Arduino到面包板上的微控制器”教程中的步骤操作,并使用USB到串行模块对其进行编程。
添加音效片段
互联网上有数百万个音效片段可供选择。只需选择您想要的音效片段,下载它们,然后使用设备的USB端口将它们放入音效板的闪存中。最好在将它们加载到W25Q32之前,将音效片段按顺序命名(00001.mp3、00002.mp3、00003.mp3,依此类推)。
轮到你了
你可以通过添加额外的音频文件和按钮来扩展这个电路及其代码,或者通过使用额外的扬声器和更高级的放大器来增加立体声支持。你甚至可以考虑添加一个电位器来调节扬声器的音量。当然,通过使用不同的库或函数,总有方法可以优化按键扫描代码。
我在这个项目中的目标是带你走完设计一个完整的嵌入式系统的过程,这个系统不仅制作起来有趣,而且玩起来也很有趣。如果你构建了这个项目,请在评论中告诉我你选择了哪些音效片段,以及你是如何扩展它的!