Arduino MIDI 步进合成器
组件和用品
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 |
必要的工具和机器
|
关于这个项目
在这里观看它的实际操作。
当我看到一些软盘驱动器音乐时,我正在照常浏览 YouTube。知道软驱是由步进电机控制的,我决定自己制作步进电机发声器。
我之前看到有人这样做过,但每个实例要么没有共享代码,要么他们的代码存在严重缺陷和/或受限。
在学校学习 C++ 后,我决定发挥我的技能。
我真正想做的是制作一个简单且易于使用和修改的代码。这正是我所做的!
总体 过程
首先,我想出了需要做什么。用最基本的术语来说,我需要提取 MIDI 数据并将其转换为使步进电机产生相应音高的速度。
提取 MIDI 数据
这部分相当容易。通过使用 MIDI 库,我可以解释 MIDI 数据,并将其发送到另一个函数来控制速度。
控制步进器
A4988 步进电机驱动器有两个直接控制步进运动的引脚;步骤和方向。 DIR 根据状态控制电机是顺时针旋转还是逆时针旋转,STEP 每次拉高时步进器移动一步(多少取决于微步分辨率)。由于声音不受方向的影响,我只是将其设置为低(或只是将其接地)。现在我可以使用 digitalWrite 命令来步进电机。
挑战
处理这个项目的主要挑战是我想一次驱动多个步进电机,所以使用 delay() 命令是不可能的(否则电机不会同时运行)。相反,我使用 micros() 命令来计算脉冲步进器的持续时间。由于每个步进电机会有不同的速度值,我将速度变量转换为数组,它们的索引对应于电机编号和 MIDI 通道。我最初使用了millis()命令,但发现它缺乏产生不同音高的分辨率。
使用数组来控制步进电机的速度意味着我可以对所有电机使用单个变量,这使 arduino 能够控制任意数量的步进电机,只需更改阵列大小即可!
速度计算
在测试中,我向步进引脚发送了 440 Hz 方波(使用音调命令),发现步进电机产生了 A440 音高。由于发送到步进函数的速度值是以微秒为单位的周期,我只是将音符频率转换为周期。我将这些值放在另一个名为 pitchValues 的数组中,它们的索引对应于 MIDI 音符值。使用阵列还允许我控制步进器的可播放范围。我这样做是为了将速度值为零视为停止。
使用数组而不是计算意味着可以完全控制每个音符的速度,从而有效地设置乐器的范围。此外,当步进电机接近其谐振频率时,它会产生非常可怕的噪音(看起来像是停转了)。您可以识别它是什么并将音高的值更改一个八度来解决这个问题。对我来说,共振频率在 F3 左右,所以我不得不将 E3、F3 和 F#3 改变一个八度来解决这个问题。 (您可以使用“Tune Stepper.ino”代码进行检查)
创建 USB MIDI 设备
我想让这个设备被看作是一个 MIDI 设备,所以我做了一些挖掘,发现你可以改变板上 AVR 芯片的固件。固件可以是 HIDUINO 或 mocuLUFA。我决定使用 mocuLUFA,因为它具有双启动选项,因此我可以轻松地重新编程 Arduino,而无需重新刷新 AVR 芯片。我可以简单地在 ICSP 接头上连接一个跳线,以在 USB MIDI 和 USB 串行之间切换。
代码
GitHub 存储库
只需转到我的 GitHub。我有关于如何在 Arduino 上配置和安装代码的说明。https://github.com/jzkmath/Arduino-MIDI-Stepper-Motor-Instrument定制零件和外壳
将步进电机固定到位为电机添加“手指”。纯粹出于审美目的。示意图
如果您想使用此屏蔽,则跳线的位置。 如果你想把它连在面包板上,那么这里是 Fritzing 面包板接线示意图。包括面包板图中未给出的一些部件值。 如果您想使用 MIDI DIN 插孔,请使用此布局。制造工艺