25浏览
查看: 25|回复: 13

[项目] 【Arduino 动手做】桌面版 MIDI 架子鼓

[复制链接]
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

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

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

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

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

【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 形式查看

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

第 2 步:切割和塑造主垫

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

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

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

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

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

第 4 步:构建 Drum pad

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

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

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

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

第 5 步:放置鼓垫

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

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

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

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

第 7 步:制作 Arduino 扩展板

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

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

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

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

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

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

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

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


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

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

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

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

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

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

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


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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

第 10 步:安装 Arduino 代码

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


  1. #include "MIDIUSB.h"
  2. #define PIEZO_THRESHOLD 10        // Minimum piezo value to trigger a note
  3. #define PIEZO_SPIKE_DETECT 300    // Value to detect a sharp spike
  4. #define NUM_OF_DRUMS 7            // Number of drums
  5. const byte MIDI_CH = 0;           // MIDI channel
  6. bool noteOnFlag[NUM_OF_DRUMS] = {false};  // To track if each piezo note is already on
  7. unsigned long lastTriggerTime[NUM_OF_DRUMS] = {0};  // Last time each piezo note was triggered
  8. byte piezoPin[NUM_OF_DRUMS] = {A0, A1, A2, A3, A4, A5, A6};  // Pins for each piezo sensor
  9. byte piezoNotes[NUM_OF_DRUMS] = {51, 47, 48, 38, 49, 42, 41};  // MIDI notes for each drum
  10. const byte pedalPin = 2;
  11. const byte bassDrumNote = 36;    // MIDI note for bass drum
  12. bool pedalPressed = false;       // To track pedal state
  13. void setup() {
  14.   Serial.begin(9600);
  15.   
  16.   // Speed up the analogRead process
  17.   ADCSRA = (ADCSRA & 0b11111000) | 0x04;  // Set prescaler to 16MHz/32 = 500kHz
  18.   
  19.   // Setup piezo pins
  20.   for (int i = 0; i < NUM_OF_DRUMS; i++) {
  21.     pinMode(piezoPin[i], INPUT);
  22.   }
  23.   
  24.   // Setup pedal pin
  25.   pinMode(pedalPin, INPUT_PULLUP);  // Use internal pull-up resistor
  26. }
  27. void loop() {
  28.   for (int i = 0; i < NUM_OF_DRUMS; i++) {
  29.     handlePiezo(i);    // Check piezo sensor state for each drum
  30.   }
  31.   handlePedals();       // Check pedal state for the bass drum
  32. }
  33. // Handle the piezo sensor readings and send MIDI signals for each drum
  34. void handlePiezo(int drumIndex) {
  35.   int piezoReading = analogRead(piezoPin[drumIndex]);
  36.   if (piezoReading > 50) {
  37.     Serial.print("Drum index: ");
  38.     Serial.print(drumIndex);
  39.     Serial.print(" note: ");
  40.     Serial.println(piezoNotes[drumIndex]);
  41.   }
  42.   // Check for a sharp spike to detect a tap (instant response)
  43.   if (piezoReading > PIEZO_SPIKE_DETECT && !noteOnFlag[drumIndex]) {
  44.     byte velocity = map(piezoReading, PIEZO_THRESHOLD, 1023, 1, 127);  // Map piezo value to MIDI velocity
  45.     noteOn(MIDI_CH, piezoNotes[drumIndex], velocity);  // Send Note On message for each drum
  46.     Serial.print("Drum ");
  47.     Serial.print(drumIndex);
  48.     Serial.print(" Note On - Velocity: ");
  49.     Serial.println(velocity);
  50.     noteOnFlag[drumIndex] = true;  // Mark that the note is currently on
  51.     lastTriggerTime[drumIndex] = millis();  // Store the time of the tap
  52.   }
  53.   // If piezo has been triggered, send Note Off after a short delay
  54.   if (noteOnFlag[drumIndex] && millis() - lastTriggerTime[drumIndex] > 90) {  // Send Note Off after 90 ms
  55.     noteOff(MIDI_CH, piezoNotes[drumIndex], 0);  // Send Note Off message
  56.     Serial.print("Drum ");
  57.     Serial.print(drumIndex);
  58.     Serial.println(" Note Off");
  59.     noteOnFlag[drumIndex] = false;  // Reset the flag
  60.   }
  61. }
  62. // Handle the pedal input and send MIDI signal for bass drum
  63. void handlePedals() {
  64.   bool currentPedalState = digitalRead(pedalPin) == LOW;  // Check if pedal is pressed
  65.   if (currentPedalState && !pedalPressed) {  // If pedal is pressed and wasn't previously
  66.     noteOn(MIDI_CH, bassDrumNote, 127);  // Send Note On for bass drum with max velocity
  67.     Serial.println("Bass Drum Note On - Pedal Pressed");
  68.     pedalPressed = true;  // Set pedal state to pressed
  69.   } else if (!currentPedalState && pedalPressed) {  // If pedal is released
  70.     noteOff(MIDI_CH, bassDrumNote, 0);  // Send Note Off for bass drum
  71.     Serial.println("Bass Drum Note Off - Pedal Released");
  72.     pedalPressed = false;  // Reset pedal state
  73.   }
  74. }
  75. // Send MIDI Note On message
  76. void noteOn(byte channel, byte pitch, byte velocity) {
  77.   midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  78.   MidiUSB.sendMIDI(noteOn);
  79.   MidiUSB.flush();  // Ensure the message is sent
  80. }
  81. // Send MIDI Note Off message
  82. void noteOff(byte channel, byte pitch, byte velocity) {
  83.   midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  84.   MidiUSB.sendMIDI(noteOff);
  85.   MidiUSB.flush();
  86. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

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

附录

项目链接: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

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



3D打印文件.zip

587.78 KB, 下载次数: 0

main.zip

1.58 KB, 下载次数: 0

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail