驴友花雕 发表于 2025-5-22 20:11:11

【Arduino 动手做】桌面版 MIDI 架子鼓

本帖最后由 驴友花雕 于 2025-6-5 06:04 编辑








驴友花雕 发表于 2025-5-22 20:21:39

【Arduino 动手做】桌面版 MIDI 架子鼓

我一直梦想着在家里有一套架子鼓,但空间、噪音和成本一直是挑战。所以,我决定制作自己的紧凑型桌面 MIDI 鼓组,它由 USB 供电,并且对每一次敲击都有响应!

我将带您了解我创建这些 DIY MIDI 鼓的整个过程 - 从使用压电传感器到使用 3D 打印设计布局,再到使用 Arduino Leonardo 进行编码。

此设置可与 GarageBand、Ableton 等程序无缝协作。和我一起探索如何也能拥有一套适合你办公桌的架子鼓!





驴友花雕 发表于 2025-5-22 20:24:54

【Arduino 动手做】桌面版 MIDI 架子鼓

用品与材料

1、电子学
Arduino Leonardo(或其他带有 ATmega32U4 芯片的 Arduino 型号)
7 个压电传感器(直径 35 毫米,信号捕获更强)
3D 打印板和鼓槌(包括 STL 文件)
7 个 1MOhm 电阻器
KW12-3 微型滚轮杠杆臂开关
原型焊锡板


2、机械零件
2 x 桌垫 (400x900x3mm),一个用于放置,一个用于吸收冲击。材料顶部是织物,底部是橡胶。
Multicolor 带状电缆
14 x 螺丝 (2.3 × 9.5 mm)
砂纸(用于 Bass 踏板手柄)


3、工具
3D 打印机
美工刀
用于精确测量的尺子和笔
Universal Glue (柔性,用于连接组件)
用于将电缆和板连接到垫子上的热胶


4、软件
MIDI 软件(Apple 的 GarageBand、Ableton、Logic Pro 等)
USB 转 MIDI 桥接器(可选)如果使用具有非 ATmega32U4 芯片的 Arduino 型号,则无毛
用于上传代码的 Arduino IDE


驴友花雕 发表于 2025-5-22 20:27:52

【Arduino 动手做】桌面版 MIDI 架子鼓

本帖最后由 驴友花雕 于 2025-5-22 20:30 编辑

第 1 步:打印 3D 模型

没有特殊要求。我对所有部件都使用了标准的 15% 填充物。

附件
下载 {{ file.name }}Stick.stl下载以 3D 形式查看
下载 {{ file.name }}smallDrum.stl 文件下载以 3D 形式查看
下载 {{ file.name }}middleDrum.stl 文件下载以 3D 形式查看
下载 {{ file.name }}bigDrum.stl 文件下载以 3D 形式查看
下载 {{ file.name }}DrumPatternSmall.stl下载以 3D 形式查看
下载 {{ file.name }}DrumPatternMiddle.stl下载以 3D 形式查看
下载 {{ file.name }}DrumPatternBig.stl下载以 3D 形式查看
下载 {{ file.name }}PiezoPlate.stl下载以 3D 形式查看
下载 {{ file.name }}脚踏板.stl下载以 3D 形式查看
下载 {{ file.name }}Cap.stl下载以 3D 形式查看
下载 {{ file.name }}BoxTop.stl下载以 3D 形式查看
下载 {{ file.name }}BoxBottom.stl下载以 3D 形式查看





驴友花雕 发表于 2025-5-22 20:30:01

【Arduino 动手做】桌面版 MIDI 架子鼓

第 2 步:切割和塑造主垫

标记垫子:使用尺子和钢笔勾勒出您需要切割的区域。每个 Pattern 都应与三个 pattern(DrumPatternBig.stl、DrumPatternMiddle.stl、DrumPatternSmall.stl)之一的直径匹配。您可以使用图片上显示的布局或自行安排。
切块: 用美工刀或剪刀沿着标记小心地剪开。确保边缘光滑以完美贴合。









驴友花雕 发表于 2025-5-22 20:31:22

【Arduino 动手做】桌面版 MIDI 架子鼓

第 3 步:从第二个垫子上切下底面

标记垫子:使用尺子和钢笔勾勒出需要剪切的区域。每块应与其中一个板的直径相匹配。
切块: 再次,使用美工刀或剪刀沿着标记小心地剪开。






驴友花雕 发表于 2025-5-22 20:32:58

【Arduino 动手做】桌面版 MIDI 架子鼓

第 4 步:构建 Drum pad

将切口块粘在顶部:使用通用胶将第一个垫子上的切口件连接到鼓垫上。选择具有一定开放时间的胶水,以便正确定位垫子。例如,速溶胶就不合适。在我的视频中,我按照说明在通用胶水部分干燥后将两侧压在一起,但过程并不顺利。如果我要再做一次,我会在涂胶后立即放置切口块。
将压电传感器连接到板上:使用热胶将每个压电传感器直接连接到板下方的插槽中。
连接 “Pressure-making” 部分: 使用热胶将 “压力制造” 件固定到压电扬声器上。
将切口块粘在底部: 使用热胶将第二个垫子上的切口块连接到板的底部。















驴友花雕 发表于 2025-5-22 20:35:17

【Arduino 动手做】桌面版 MIDI 架子鼓

第 5 步:放置鼓垫

放置 Drum Pad:将鼓垫放在切口部分内。
固定垫子:使用热胶将垫子牢固地固定在插槽中。








驴友花雕 发表于 2025-5-22 20:36:29

【Arduino 动手做】桌面版 MIDI 架子鼓







驴友花雕 发表于 2025-5-22 20:37:53

【Arduino 动手做】桌面版 MIDI 架子鼓

第 7 步:制作 Arduino 扩展板

创建 Arduino Shield: 按照原理图在原型板上创建 Arduino 扩展板。
放置 Arduino:将带有扩展板的 Arduino 插入外壳。
保护 Arduino: 在将扩展板的引脚插入 Arduino 之前,请使用螺钉固定 Arduino 板。
将扩展板连接到焊盘:将扩展板的输出电缆焊接到焊盘的电缆上。



















驴友花雕 发表于 2025-5-22 20:40:16

【Arduino 动手做】桌面版 MIDI 架子鼓

第 8 步:组装和焊接 Bass Drum 踏板

准备电缆:剪断一根足够长的两线电缆,以便从鼓踏板到桌面高度。
焊接开关:将开关焊接到电缆的末端。
保护交换机:用螺丝将开关连接到踏板上。
添加砂纸进行抓地力:将砂纸剪成适合踏板两侧的槽,并将其粘合到位,以便在使用踏板时获得更好的稳定性。
连接踏板:将电缆的另一端焊接到 Arduino 扩展板。














驴友花雕 发表于 2025-5-22 20:41:30

【Arduino 动手做】桌面版 MIDI 架子鼓

第 9 步:将 Arduino 外壳固定到垫子上

保护 Arduino:使用四颗螺丝将 Arduino 连接到垫子上,使其与顶部对齐,如图所示。






驴友花雕 发表于 2025-5-22 20:43:16

【Arduino 动手做】桌面版 MIDI 架子鼓

第 10 步:安装 Arduino 代码

上传代码:将代码从 GitHub 存储库上传到 Arduino。


#include "MIDIUSB.h"

#define PIEZO_THRESHOLD 10      // Minimum piezo value to trigger a note
#define PIEZO_SPIKE_DETECT 300    // Value to detect a sharp spike
#define NUM_OF_DRUMS 7            // Number of drums

const byte MIDI_CH = 0;         // MIDI channel
bool noteOnFlag = {false};// To track if each piezo note is already on
unsigned long lastTriggerTime = {0};// Last time each piezo note was triggered

byte piezoPin = {A0, A1, A2, A3, A4, A5, A6};// Pins for each piezo sensor
byte piezoNotes = {51, 47, 48, 38, 49, 42, 41};// MIDI notes for each drum

const byte pedalPin = 2;
const byte bassDrumNote = 36;    // MIDI note for bass drum
bool pedalPressed = false;       // To track pedal state

void setup() {
Serial.begin(9600);

// Speed up the analogRead process
ADCSRA = (ADCSRA & 0b11111000) | 0x04;// Set prescaler to 16MHz/32 = 500kHz

// Setup piezo pins
for (int i = 0; i < NUM_OF_DRUMS; i++) {
    pinMode(piezoPin, INPUT);
}

// Setup pedal pin
pinMode(pedalPin, INPUT_PULLUP);// Use internal pull-up resistor
}

void loop() {
for (int i = 0; i < NUM_OF_DRUMS; i++) {
    handlePiezo(i);    // Check piezo sensor state for each drum
}
handlePedals();       // Check pedal state for the bass drum
}

// Handle the piezo sensor readings and send MIDI signals for each drum
void handlePiezo(int drumIndex) {
int piezoReading = analogRead(piezoPin);

if (piezoReading > 50) {
    Serial.print("Drum index: ");
    Serial.print(drumIndex);
    Serial.print(" note: ");
    Serial.println(piezoNotes);
}

// Check for a sharp spike to detect a tap (instant response)
if (piezoReading > PIEZO_SPIKE_DETECT && !noteOnFlag) {
    byte velocity = map(piezoReading, PIEZO_THRESHOLD, 1023, 1, 127);// Map piezo value to MIDI velocity
    noteOn(MIDI_CH, piezoNotes, velocity);// Send Note On message for each drum
    Serial.print("Drum ");
    Serial.print(drumIndex);
    Serial.print(" Note On - Velocity: ");
    Serial.println(velocity);
    noteOnFlag = true;// Mark that the note is currently on
    lastTriggerTime = millis();// Store the time of the tap
}

// If piezo has been triggered, send Note Off after a short delay
if (noteOnFlag && millis() - lastTriggerTime > 90) {// Send Note Off after 90 ms
    noteOff(MIDI_CH, piezoNotes, 0);// Send Note Off message
    Serial.print("Drum ");
    Serial.print(drumIndex);
    Serial.println(" Note Off");
    noteOnFlag = false;// Reset the flag
}
}

// Handle the pedal input and send MIDI signal for bass drum
void handlePedals() {
bool currentPedalState = digitalRead(pedalPin) == LOW;// Check if pedal is pressed

if (currentPedalState && !pedalPressed) {// If pedal is pressed and wasn't previously
    noteOn(MIDI_CH, bassDrumNote, 127);// Send Note On for bass drum with max velocity
    Serial.println("Bass Drum Note On - Pedal Pressed");
    pedalPressed = true;// Set pedal state to pressed
} else if (!currentPedalState && pedalPressed) {// If pedal is released
    noteOff(MIDI_CH, bassDrumNote, 0);// Send Note Off for bass drum
    Serial.println("Bass Drum Note Off - Pedal Released");
    pedalPressed = false;// Reset pedal state
}
}

// Send MIDI Note On message
void noteOn(byte channel, byte pitch, byte velocity) {
midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
MidiUSB.sendMIDI(noteOn);
MidiUSB.flush();// Ensure the message is sent
}

// Send MIDI Note Off message
void noteOff(byte channel, byte pitch, byte velocity) {
midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
MidiUSB.sendMIDI(noteOff);
MidiUSB.flush();
}

驴友花雕 发表于 2025-5-22 20:49:45

【Arduino 动手做】桌面版 MIDI 架子鼓

本帖最后由 驴友花雕 于 2025-6-5 19:02 编辑

附录

项目链接:https://www.instructables.com/Desk-Mat-to-MIDI-Drums/
项目作者:保加利亚 Cybercraftics
视频教程(11分钟):https://www.youtube.com/watch?v=3wSPyhD2FfM&t=2s
3D打印文件:下载附件
项目开源代码:https://github.com/cybercraftics ... /main/main/main.ino





驴友花雕 发表于 前天 06:06

【Arduino 动手做】桌面版 MIDI 架子鼓






页: [1]
查看完整版本: 【Arduino 动手做】桌面版 MIDI 架子鼓