Arduino MIDI步进电机合成器:四轴步进电机演奏MIDI音乐
元器件清单
| 元器件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 可换用其他兼容板扩展IO |
| A4988步进驱动 | 4 | |
| Arduino CNC Shield V3 | 1 | 可选,也可手动接线A4988 |
| 12V 6A电源 | 1 | 驱动步进电机 |
| NEMA 17步进电机 | 4 | OpenBuilds或同规格 |
所需工具(可选)
- 3D打印机(打印固定支架与装饰指针)
项目背景与核心思路
灵感源于YouTube上的软驱音乐视频。步进电机在特定频率下脉冲驱动会发出对应音高的声音。作者利用C++编程经验,开发了一套简单、易修改、支持多电机同时发声的MIDI步进电机合成器。
整体流程
- 解析MIDI数据:利用MIDI库接收MIDI消息(Note On/Off、Channel)
- 频率转周期:将MIDI音符号转换为步进电机驱动所需的微秒级脉冲周期
- 多电机并发驱动:使用
micros()非阻塞定时,避免delay()阻塞,实现多通道同时发声
关键技术点
步进电机驱动原理
A4988仅需STEP(脉冲)和DIR(方向)两个信号。方向不影响音高,可固定接地。每个STEP上升沿驱动电机转动一个微步,脉冲频率决定音高。
多电机并发挑战与解决
- 初版用
millis()精度不足,改用micros()微秒级定时 - 速度数组化:
speed[motor_index]对应MIDI通道,动态扩展电机数量只需修改数组大小 - 主循环轮询各电机,到期翻转STEP引脚
音高映射表
实测440Hz方波驱动产生A4标准音高。将所有MIDI音符频率预计算为周期(微秒)存入pitchValues[note]数组,索引即MIDI音符号。优势:
- 完全可控每个音符的速度,自定义演奏音域
- 规避步进电机谐振频率(作者在F3附近遇到啸叫,将E3/F3/F#3降八度解决)
- 提供
Tune Stepper.ino校准工具
USB MIDI设备固件
为让电脑识别为MIDI设备,需刷写ATmega16U2固件:
- 推荐mocuLUFA(支持双启动:跳线切换USB MIDI/USB Serial,免去反复刷固件)
- 替代方案:HIDUINO
代码仓库
完整代码、配置教程、3D模型见GitHub:
https://github.com/jzkmath/Arduino-MIDI-Stepper-Motor-Instrument
原理图与接线




3D打印件
- 步进电机固定支架
- 装饰性“手指”指针(纯美观)
提示:项目演示视频见原文链接。若需扩展至更多电机,仅需增加驱动板、电机并修改数组大小即可。
制造工艺