弹吉他时最重要的事情之一是确保乐器音准。即使是最好的吉他手,用一把走调的吉他也不会听起来有任何好处。使用标准调音器手动调音一直很常见,但自动调音器让事情变得更容易,更有趣!这个基于 Arduino 的项目将为您调音吉他。
概述
上图显示了自动吉他调音器的概览。
按钮用于选择要调音的琴弦
六个 LED 显示屏用于指示选择了哪个字符串
连接到电机的夹具用于转动调音栓,直到琴弦调准。
输入和输出由上述四个电路控制:按钮的数字输入电路、吉他的模拟音频输入电路、LED 显示屏的数字输出电路和调音栓的电机驱动电路抓手。这四个电路与 Arduino Due 交互,后者正在运行使用 Simulink 开发的算法。
音频输入电路
吉他通过标准吉他电缆连接到调音器。吉他电缆的末端有两个连接,称为尖端和套管。电缆的一端将连接到输入插孔,该插孔具有用于尖端和套管的引线。我将电线焊接到这些引线上,以将尖端和套管连接到音频输入电路。
我建议在这个电路中使用 TL972 运算放大器。它是一款噪声非常低的轨到轨放大器,可以在非常低的电源电压下工作。
电动调音钉夹
这个项目中没有使用任何直流电机。我需要一个低速高扭矩的减速电机。我使用的电机速度为 6 RPM,最大扭矩为 613 oz-in。它的电压范围为 3-12 V,因此我使用 9 V 电池作为电源。
在电机的轴上,我使用夹具轮毂、四个螺丝和一些胶带组装了一个简单的夹持机构。
软件
我使用Simulink 及其对 Arduino 的支持包来开发调谐器的算法。Simulink 是用于开发算法和建模动态系统的框图环境。支持包允许我使用 Simulink 模块读取和写入 Arduino 上的引脚。使用该软件的外部模式功能,我可以在 Arduino 上模拟一个算法,在模拟运行时自动生成代码并调整参数,而无需重新编译任何代码。然后我可以将算法部署到硬件以独立执行。我创建的模型如下所示:
外部模式允许使用范围模块来监控在硬件上运行的算法的某些部分。这对于监听按钮的数字输入和吉他的模拟输入特别有用。从按钮作用域我们可以看到,当按钮被按下时,输入从 0 变为 1。
我希望这个从 0 到 1 的变化触发所选字符串的变化。这被称为上升触发器。我创建了一个名为“Select String”的 Stateflow 图,它有六个状态,每个字符串一个状态,并根据这个上升的触发输入从一个状态更改为下一个状态。以下是对 Stateflow 图的更详细介绍:
进入每个状态后,相应灯串的 LED 引脚设置为高电平。在退出每个状态时,该引脚设置为低电平。我选择了六根弦中最低的低 E 弦作为我的默认值。当我第一次打开调谐器时,它将以这种默认状态启动。
Stateflow 图上有七个输出:一个用于六个灯串中的每一个的 LED,一个称为“periodRange”,我将在后面讨论。六个 LED 输出直接进入 Arduino 数字输出模块,以打开或关闭相应的 LED。
现在让我们看看模型的音频处理部分。吉他信号通过模拟输入模块进入。对于 5 kHz 的采样率,我将块的采样时间设置为 0.0002 秒。当我弹吉他并打开音频范围块时,我能够看到如下图所示的波形:
示波器块帮助我调整音频电路中的电位器以改变输入的增益。在波形峰值不达到最大值 1023 的情况下,应将增益设置得尽可能高。这将允许最精确地读取信号。
不弹吉他时,输入信号应该是 500 到 700 之间的一条直线。在我的例子中,它大约是 550。知道这个值很重要,因为调音器应该只在有音符时处理音频正在播放。我选择了一个值 575,就在这条平线上方,作为我的阈值。仅当信号高于此阈值时才会处理音频。由于 Simulink 允许我在仿真运行时调整参数,因此我可以轻松设置阈值。
当在吉他上弹奏单个音符时,生成的波形是周期性的。波形的周期对应于某个音高。调音算法通过确定波形的周期来估计弦的音高。我编写了一个执行此音高估计的 MATLAB 函数,并使用 MATLAB 功能块将其包含在我的 Simulink 模型中。为了确定字符串是否合拍,MATLAB 函数需要一个输入来指示每个字符串的音调范围。这是 Stateflow 图的输出“periodRange”。该函数根据周期范围确定琴弦的音高是过高、过低还是音准,并相应地为电机生成输出。
MATLAB 函数的输出是控制电机的三个引脚。这些输出直接进入 Arduino 数字输出模块。
一旦我确保我的算法一切正常,我就可以将它部署到硬件上,这样它就可以独立运行,而无需连接到 PC 并且独立于 Simulink。