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

在这里插入图片描述

《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述
在这里插入图片描述

用品与材料

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

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

在这里插入图片描述
在这里插入图片描述

第 2 步:切割和塑造主垫

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

第 4 步:构建 Drum pad

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第 5 步:放置鼓垫

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第 6 步:给鼓垫接线

固定电缆:使用热胶将带状电缆连接到垫子上。
焊接鼓垫:通过焊接将鼓垫连接到多频段带状电缆。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第 7 步:制作 Arduino 扩展板

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

第 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[NUM_OF_DRUMS] = {false};  // To track if each piezo note is already on
unsigned long lastTriggerTime[NUM_OF_DRUMS] = {0};  // Last time each piezo note was triggered

byte piezoPin[NUM_OF_DRUMS] = {A0, A1, A2, A3, A4, A5, A6};  // Pins for each piezo sensor
byte piezoNotes[NUM_OF_DRUMS] = {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[i], 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[drumIndex]);

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

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

  // If piezo has been triggered, send Note Off after a short delay
  if (noteOnFlag[drumIndex] && millis() - lastTriggerTime[drumIndex] > 90) {  // Send Note Off after 90 ms
    noteOff(MIDI_CH, piezoNotes[drumIndex], 0);  // Send Note Off message
    Serial.print("Drum ");
    Serial.print(drumIndex);
    Serial.println(" Note Off");
    noteOnFlag[drumIndex] = 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();
}

附录

项目链接: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/desk_drums/blob/main/main/main.ino

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值