3D 打造紧凑型 MIDI 架子鼓套件
元器件与物料清单
| 元器件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Adafruit 标准 LCD - 16x2 白字蓝底 | 1 |
| SparkFun 压电陶瓷片 | 1 |
| Adafruit 力敏电阻 (FSR) | 1 |
| 电阻 10kΩ | 1 |
| 电阻 1MΩ | 1 |
| SparkFun 稳压二极管 - 5.1V 1W | 1 |
| SparkFun 轻触开关 12mm | 1 |
| 滑动开关 | 1 |
| TRS 插座 (立体声耳机座) | 1 |
| USB-A 转 B 型数据线 | 1 |
| Apple Lightning 转 USB 相机转接器 | 1 |
所需工具与设备
- 3D 打印机 (通用)
- 激光切割机 (可选)
- 电烙铁 (通用)
- 圆孔切割器
- 内六角扳手
- 美工刀
- 管材切割器
- 电钻及 9mm/10mm 钻头
应用与在线服务
- Arduino IDE
项目简介
这是一个基于 Arduino UNO 的极简架子鼓套件。项目灵感来源于 Arduino 官方博客的 3D 打印电子鼓垫教程。我被压电陶瓷的简单原理和 MIDI 协议的巧妙深深吸引,不仅满足于制作鼓垫,更想打造完整套件。
整个鼓套件分为两大部分:
- 3D 打印鼓垫 + 厚纸鼓壳
- Arduino UNO 触发转 MIDI 转换器
鼓垫信号经 Arduino 处理转为 MIDI 信号,通过 USB 传输至 iPhone、电脑等设备发声。无需额外供电,手机/电脑即可供电。
所需材料清单
工具
- 3D 打印机、激光切割机(可选)、内六角扳手、美工刀、圆孔切割器、电烙铁、管材切割器、电钻及 9mm/10mm 钻头
材料
- 1mm 厚纸、PLA 耗材、5mm/10mm 海绵泡沫板、MDF 板 2.5mm/5.5mm(可选)
- M6-70mm/50mm 螺栓螺母、M3-10mm/15mm/25mm 螺栓螺母、M2 螺丝
- 13mm 直径不锈钢管
鼓硬件
- 10寸/8寸 网面鼓皮、军鼓架(如 YAMAHA SS662)、踩镲架(如 YAMAHA HS650A)、踏板(如 YAMAHA FP7210A)、鼓棒
步骤 1:3D 打印
所有模型文件在 Thingiverse 和 GitHub。边框请使用 Ver.2 版本。打印参数:填充率 20%,层高 0.3mm。鼓垫也可用激光切割制作,矢量文件见 GitHub vector 目录。
步骤 2:组装鼓垫框架
用 M3-10mm 螺栓连接各部件,中心柱用 M3-15mm 或 M3-25mm 螺栓固定底部。
步骤 3:制作鼓壳
鼓壳高度 55mm。制作三条宽 55mm 的纸条,长度略长于鼓垫周长。将纸条插入底部缝隙,裁剪成完美圆周长,重复三次叠加粘合。干燥后固定网面鼓皮,钻 9mm 孔安装插座。可使用蝴蝶螺母或自制调音键。网面固定用 M6-70mm 螺栓。钻孔后取下网面安装压电陶瓷。
步骤 4:安装压电陶瓷
压电陶瓷脆弱,操作勿弯折损伤!
军鼓 (双压电陶瓷)
- 红线分别接 Tip 和 Ring,黑线共接 Sleeve
- 焊接时务必将线材穿过传感器板的穿线孔
- 鼓面压电陶瓷(接 Tip)需夹在 10mm 海绵中:下1层、上3层,上层做成锥形
- 放置在传感器板上
踩鼓 (单压电陶瓷)
- 仅用 Tip 信号,无需传感器板
- 压电陶瓷下垫 2 层海绵
- 传感器偏心安装,避免锤头直接击中传感器导致 Arduino 无法判断击打力度
踩镲 (单压电陶瓷)
- 电路同踩鼓
- 压电陶瓷下垫 10mm 海绵
步骤 5:10 寸军鼓垫组装
先安装边沿传感器,牢固固定传感器板,锥形海绵侧视露出 2-3mm。8 寸垫作军鼓同理。
步骤 6:8 寸踩鼓垫组装
切割 13mm 不锈钢管:两根 200mm、两根 365mm (长度可微调)。按图组装,M3 螺母嵌入零件内固定管材,用 M3-15mm 螺栓锁紧。
步骤 7:12 寸踩镲制作
用厚纸制作镲片:剪 300mm 直径圆纸 3 张。从中心切口,再平行偏移 10mm 切第二刀,得到三个"小嘴吃豆人"形状。小心合拢切口用胶带固定成浅碗状。涂胶水叠加压实,压重干燥。消音用 5mm 海绵钻孔(孔位可隐藏)。双面胶粘贴传感器座和线槽(热熔胶更易操作)。
步骤 8:踩镲控制器
控制器将踩镲开合状态传给 Arduino。电路简单,三部分组合:底部粘贴 FSR 并固定插座(FSR 可开孔)、FSR 上贴 10mm 海绵、M3-10mm 螺栓固定盖子。
虽仅输出 HIGH/LOW,但用 FSR 是为兼容 Roland、Yamaha 音源模块,且 EZ DRUMMER 2 等专业鼓音源支持多级开合度。FSR 理论上只需改代码即可支持多级,但未实测。
步骤 9:USB-MIDI 固件刷写
仅用 USB 线即可让 Arduino 发送 MIDI 信号,被 iPhone 等识别为 MIDI 设备,无需额外硬件。
普通 Arduino UNO 直连 iPhone 会报"不兼容",需重刷 USB 芯片 (ATmega16U2) 固件。参考 官方 DFU 教程,将 Arduino-usbserial-uno.hex 替换为 dualMoco.hex:
sudo dfu-programmer atmega16u2 flash dualMoco.hex
刷写后 Arduino 被识别为 MIDI 设备。短接图示引脚可恢复为普通 Arduino 模式(烧录代码时需短接),不短接则为 MIDI 模式。
步骤 10:触发转 MIDI 转换器电路
盒内含 Arduino UNO 和扩展板。电路参考 Fritzing 图。二极管为保护用,Arduino UNO 自带保护电路可能不需要,待验证。建议先打印外壳模型再按尺寸制作扩展板。外壳盖子也有 3D 模型,我用激光切割制作,二选一。
步骤 11:GarageBand 试奏
打开 GarageBand 连接即可,无需复杂设置。PC 端可用 Hydrogen(免费可扩展音色)等 DAW。
步骤 12:参数调节系统
为避免频繁改代码,设计了板载调节系统:INC/DEC 选择乐器,NEXT/BACK 选择参数,EDIT 进入修改模式再用 INC/DEC 调值,再按 EDIT 确认。视频后半段演示操作。
关键参数说明:
- THRESHOLD:触发最小阈值
- SENSITIVITY:灵敏度,值越小轻击也能得高力度
- NOTE:MIDI 音符号,改变可切换音色
- FLAG:击打结束判定阈值,建议 1-10,过大单击双响,过小连击丢音
- SCAN TIME:峰值搜索窗口(ms),一般无需改
- HEAD/RIM:边沿触发难度,增大难触发,过小易串音
- PEDAL VELO:踩镲/踩鼓固定力度,初值 100
- MASK TIME:与 FLAG 相关,一般无需改,过大连击丢音
步骤 13:Fusion 360 源文件
部分零件需改尺寸,STL 难修改,提供 Fusion 360 源文件。因试错修改较多,历史时间线参考价值有限。
额外资源
- Instructables 完整教程:Arduino Minimal Drum Kit
- 博客详细制作记录
欢迎提问交流,玩得开心!
代码
Hello Drum v2 (George Brotherston 修改版 2019/12/05)
/* Drum MIDI Controller
Created: 28/06/2017 by Ryo Kosaka as "HELLO DRUM" Ver.1.0
Modified: 05/12/2019 by George Brotherston */
#include
#include
// 变量声明
boolean bSnareFlag = false, bHihatFlag = false, bKickFlag = false, bPedalFlag = false;
boolean bButtonState = true, bButtonState_set = true;
int iUPDOWN = 0, iNEXTBACK = 0;
// 乐器参数数组: {threshold, sensitivity, note, flag, velocity, iPeakValue}
int aSNARE[6] = {150, 950, 38, 3, 0, 0};
int aSNARE_RIM[6] = {5, 500, 37, 3, 0, 0};
int aHIHAT[6] = {100, 800, 46, 1, 0, 0};
int aHIHAT_CLOSE[6] = {100, 800, 42, 1, 0, 0};
int aKICK[6] = {200, 700, 36, 1, 0, 0};
// 踩镲踏板: {scantime, snare/rim, pedalVelocity, masktime}
int aHIHAT_PEDAL[4] = {600, 0, 44, 0};
// 设置步进值
int aSETTING[4] = {4, 500, 100, 1};
// LCD 引脚
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
MIDI_CREATE_DEFAULT_INSTANCE();
void setup() {
MIDI.begin(10);
lcd.begin(16, 2);
lcd.print("INITIALIZING...");
lcd.setCursor(0, 1);
lcd.print("DRUM MIDI CONTROLLER");
pinMode(6, INPUT_PULLUP); // Set
pinMode(7, INPUT_PULLUP); // Up
pinMode(8, INPUT_PULLUP); // Down
pinMode(9, INPUT_PULLUP); // Next
pinMode(10, INPUT_PULLUP); // Back
}
void loop() {
// 读取按键
int iButton_set = digitalRead(6);
int iButton_up = digitalRead(7);
int iButton_down = digitalRead(8);
int iButton_next = digitalRead(9);
int iButton_back = digitalRead(10);
// 读取压电陶瓷
int iPiezoValue_A0 = analogRead(A0); // 军鼓面
int iPiezoValue_A1 = analogRead(A1); // 军鼓边
int iPiezoValue_A2 = analogRead(A2); // 踩镲
int iPiezoValue_A3 = analogRead(A3); // 踩鼓
int iFSRValue_A4 = analogRead(A4); // 踩镲踏板
// 编辑模式逻辑... (完整代码见原文)
// 乐器触发检测逻辑
// 军鼓面/边沿判别
if (iPiezoValue_A0 > aSNARE[0] && !bSnareFlag) {
// 峰值检测与力度计算
// ...
}
// 踩镲开/合判别 (依据踏板 FSR 状态)
if (iPiezoValue_A2 > aHIHAT[0] && !bHihatFlag) {
// ...
}
// 踩镲踏板
if (iPiezoValue_A0 > aHIHAT_PEDAL[0] && !bPedalFlag) {
// ...
}
// 踩鼓
if (iPiezoValue_A3 > aKICK[0] && !bKickFlag) {
// ...
}
// 状态复位逻辑 (FLAG 判定)
// ...
}
完整代码含详细注释,请下载源文件查看。
原理图
Fritzing 源文件: circuit_nZotR7rJMM.fzz
制造工艺
- 鼓:历史、构造与工艺全解析
- 互动陀螺仪 LED 显示:NeoPixel Ring + Arduino Pro Mini
- DIY 云朵发光服装 — LED 灯带 + Arduino Nano + SparkFun 元件
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- 在 Arduino Due 上实现语音识别与语音合成 - BitVoicer Server 方案
- Icom 对讲机外置 S 表:基于 CI-V 协议与 Arduino 实现
- RDA5807M 迷你立体声 FM 收音机:Arduino Nano + Nokia 5110 + PAM8403 功放
- 上海外科医生为癌症患者3D打印定制钛合金骨植入体
- 连接GrabCAD Print与Stratasys 3D打印机——分步指南
- 超越原型:3D 打印的现实创新应用
- MAXREFDES220#:基于光学传感器的无袖带血压监测参考设计