Arduino Micro/Leonardo USB MIDI 适配器套件 —— 完整元件清单与固件指南
硬件物料 (BOM)
| 元器件 | 规格/数量 | 关键备注 |
|---|---|---|
| Arduino Micro / Leonardo | 1 | ATmega32U4 原生 USB,必选 |
| 6N137 高速光耦 | 1 | MIDI 电流环隔离核心 |
| 1N4148 快恢复二极管 | 1 | 光耦输入保护 |
| 电容 100 nF | 1 | 电源去耦 |
| 电阻 220 Ω | 3 | 光耦输入/输出限流 |
| 电阻 10 kΩ | 1 | 光耦输出上拉 |
| 电阻 470 Ω | 1 | MIDI OUT 接地电阻 | LED + 支架 | 1 | 电源指示 |
| DIN-5 接头 (MIDI 专用) | 2 | IN/OUT 各一,含螺母固定 |
| 塑料外壳 + PCB + 尼龙支柱 | 1 套 | 成品封装 |
电路原理
标准 MIDI 电流环隔离电路:
- MIDI IN:DIN-5 引脚 4/5 接光耦 6N137 输入端 (通过 220Ω+1N4148),输出接 Arduino Rx (D0),10kΩ 上拉 5V
- MIDI OUT:Arduino Tx (D1) → 220Ω → DIN-5 引脚 4,引脚 2 接地 (屏蔽),引脚 5 悬空
- 关键点:仅 OUT 端引脚 2 接地,防止地环路;光耦实现完全电气隔离

固件方案:Control Surface 库
选用 Control Surface 库,完整实现 MIDI 协议栈,支持:
- USB MIDI 设备类 (类合规,免驱动)
- 硬件串口 MIDI (Serial1, 31250 baud)
- 管道自动转发:USB ↔ Serial1 双向透传
- 扩展性:可添加电位器/按钮/踏板映射为 MIDI CC
- 回调机制:拦截/修改/过滤特定消息
两个版本固件
版本 A:基础透传
#include <Control_Surface.h>
USBMIDI_Interface midiusb;
HardwareSerialMIDI_Interface midiser = {Serial1, MIDI_BAUD};
MIDI_PipeFactory<5> pipes;
const int ledPin = 10;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH);
midiusb >> pipes >> midiser; // USB -> Serial
midiser >> pipes >> midiusb; // Serial -> USB
Control_Surface >> pipes >> midiusb;
midiser >> pipes >> Control_Surface;
midiusb >> pipes >> Control_Surface;
Control_Surface.begin();
}
void loop() { Control_Surface.loop(); }
版本 B:过滤 "All Notes Off" (修复 Roland D50 等设备问题)
// ... 同上引脚与管道定义 ...
struct MyMIDI_Callbacks : MIDI_Callbacks {
void onChannelMessage(Parsing_MIDI_Interface& midi) override {
ChannelMessage cm = midi.getChannelMessage();
if (cm.header == 0xB0 && cm.data1 == 0x7B) return; // 丢弃 All Notes Off (CC#123)
if (cm.header == 0x90 && cm.data2 == 0x00) cm.header = 0x80; // NoteOn(v=0) → NoteOff
midiusb.send(cm);
}
void onSysExMessage(Parsing_MIDI_Interface& midi) override {
midiusb.send(midi.getSysExMessage());
}
void onRealTimeMessage(Parsing_MIDI_Interface& midi) override {
midiusb.send(midi.getRealTimeMessage());
}
} callbacks;
void setup() {
// ... 管道连接同版本 A ...
Control_Surface.begin();
midiser.setCallbacks(callbacks); // 注册回调
}
void loop() { Control_Surface.loop(); }
已知问题与修复
大 SysEx 包截断:Control Surface 1.x 限制 SysEx 缓冲 128 字节,导致 D50 编辑器通讯失败。
修改库源码两处 (需管理员权限):官方承诺 2.x 版本修复。
src/MIDI_Parsers/MIDI_MessageTypes.hpp:uint8_t length;→size_t length;src/Settings/Settings.hpp:constexpr size_t SYSEX_BUFFER_SIZE = 128;→320
USB 设备名称自定义
编辑 Arduino 安装目录 hardware/arduino/avr/boards.txt (需管理员):
leonardo.build.usb_product="Arduino Leonardo" → leonardo.build.usb_product="My MIDI Adapter"
上传后改回,避免影响其他项目。
故障排查
- 无通讯:检查 DIN-5 引脚 4/5 是否接反 (不同厂商标注视角不同)
- 光耦焊接:6N137 怕热,快速焊接、少用焊锡
- MIDI OUT 必须接 470Ω 接地 (引脚 2),否则部分设备收不到信号
- 供电:USB 供电即可,无需外部电源
扩展建议
- 添加 2-4 个电位器 (A0-A3) 映射为 Expression/Modulation/Volume/Pan CC
- 添加脚踏开关映射 Sustain (CC#64)
- 加装 OLED 显示当前通道/程序号/通讯状态
- 双 MIDI IN 合并/路由:需第二硬件串口 (软串口不可靠),建议升级 Teensy/ESP32
资源文件
- Fritzing 源文件:
usb_midi_interface_twiE32gvR3.fzz(仅原理图页) - Control Surface 库:GitHub
制造工艺
- 智能缺水报警器 – DIY植物土壤湿度监测装置
- 意大利语单词时钟:Arduino Nano + NeoPixel 144 灯珠 + LCD + RTC 打造
- 仅用 3 根模拟口驱动 4×3 矩阵键盘:电阻分压识别键值
- 3D 打造紧凑型 MIDI 架子鼓套件
- 基于Arduino MKR Fox 1200构建可靠Sigfox千瓦时电表
- 蓝牙温度监测仪:Arduino Nano + NTC 热敏电阻 + HC-06 无线传输
- DIY 自动量程电容表 (10 pF – 10 μF) – Arduino Nano 简易制作
- 非接触手势门锁:APDS-9960 + Arduino 实现安全门禁
- Arduino Nano 多功能伴侣套件 —— 电阻/电容测量、二极管测试、RTC时钟一体化
- 为Arduino构建隔离模拟输入电路
- RGB 32 频段音频频谱可视化器:Arduino Nano 驱动 WS2812B 8×32 LED 矩阵
- Arduino UNO 精准视觉反应时间测试仪