《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