본문 바로가기
아두이노

컴팩트 데스크탑 MIDI 드럼 만들기 - DIY 프로젝트

by 모빌리티키즈 2025. 3. 20.
728x90
반응형

컴팩트 데스크탑 MIDI 드럼 만들기 - DIY 프로젝트

항상 집에 드럼 세트를 두는 꿈을 꿔오셨나요? 공간, 소음, 비용 문제 때문에 포기하셨다면 이제 해결할 차례입니다. 이번 프로젝트에서는 USB 전원을 공급받고 모든 타격에 반응하는 컴팩트 데스크탑 MIDI 드럼을 만드는 방법을 안내해드립니다. 완성 후 GarageBand, Ableton 등 다양한 프로그램과 원활히 연동됩니다!

 

준비물

전자공학

  • Arduino Leonardo (또는 ATmega32U4 칩이 있는 기타 Arduino 모델)
  • 피에조 센서 7개 (신호 캡처가 강력한 직경 35mm)
  • 3D 프린팅 플레이트 및 드럼 스틱
  • 1MΩ 저항기 7개
  • KW12-3 마이크로 롤러 레버 암 스위치
  • 프로토타입 납땜 보드

기계 부품

  • 데스크 매트 2개 (400x900x3mm, 하나는 배치용, 다른 하나는 충격 흡수용)
  • 다색 리본 케이블
  • 나사 14개 (2.3 × 9.5mm)
  • 사포 (베이스 페달 그립용)

도구

  • 3D 프린터
  • 다용도 칼
  • 자와 펜 (정확한 측정용)
  • 유니버설 글루 (유연한 구성 요소 부착용)
  • 핫 글루 (케이블 및 플레이트 고정용)

소프트웨어

  • MIDI 소프트웨어 (GarageBand, Ableton, Logic Pro 등)
  • Arduino IDE (코드 업로드용)

공급

전자공학

  1. Arduino Leonardo(또는 ATmega32U4 칩이 있는 기타 Arduino 모델)
  2. 7 x 피에조 센서(더 강력한 신호 캡처를 위한 직경 35mm)
  3. 3D 프린팅 플레이트  드럼 스틱(STL 파일 포함)
  4. 7 x 1MOhm 저항기
  5. KW12-3 마이크로 롤러 레버 암 스위치
  6. 프로토 타입 납땜 보드

 

기계 부품

  1. 2 x 데스크 매트(400x900x3mm) 하나는 배치용이고 다른 하나는 충격 흡수용입니다. 소재는 윗면은 천으로, 밑면은 고무입니다.
  2. 다색 리본 케이블
  3. 14 x 나사(2.3 × 9.5mm)
  4. 사포(베이스 페달 그립용)

 

도구

  1. 3D 프린터
  2. 다용도 칼
  3. 정확한 측정을 위한 자와 
  4. Universal Glue(유연, 구성 요소 부착용)
  5. 케이블과 플레이트를 매트에 부착하기 위한 핫 글루

 

소프트웨어

  1. MIDI 소프트웨어(Apple의 GarageBand, Ableton, Logic Pro 등)
  2. USB-MIDI 브리지(옵션) ATmega32U4 이외의 칩이 있는 Arduino 모델로 작업하는 경우 털이 없음
  3. 코드 업로드를 위한 Arduino IDE

1단계: 3D 모델 인쇄

  1. 특별한 요구 사항은 없습니다. 나는 모든 부품에 표준 15% 충전재를 사용했습니다.

 

2단계: 메인 매트 절단 및 성형

  1. 매트 표시: 자와 펜을 사용하여 잘라야 할 영역의 윤곽을 그립니다. 각각은 세 가지 패턴(DrumPatternBig.stl, DrumPatternMiddle.stl, DrumPatternSmall.stl) 중 하나의 지름과 일치해야 합니다.사진에 표시된 레이아웃을 사용하거나 직접 정리할 수 있습니다.
  2. 조각 자르기: 다용도 칼이나 가위를 사용하여 표시를 따라 조심스럽게 자릅니다. 가장자리가 매끄럽게 매끄럽게 완벽하게 맞는지 확인하십시오.

3단계: 두 번째 매트에서 밑면 조각을 자릅니다.

  1. 매트 표시: 자와 펜을 사용하여 잘라야 할 영역의 윤곽을 그립니다. 각 조각은 플레이트 중 하나의 직경과 일치해야 합니다.
  2. 조각 자르기: 다시, 다용도 칼이나 가위를 사용하여 표시를 따라 조심스럽게 자릅니다.

4단계: 드럼 패드 만들기


  1. 잘라낸 조각을 위쪽에 붙입니다. 첫 번째 매트에서 잘라낸 조각을 범용 접착제를 사용하여 드럼 패드에 부착합니다. 매트를 적절하게 배치할 수 있도록 약간의 개방 시간이 있는 접착제를 선택하십시오. 예를 들어, 인스턴트 접착제는 적합하지 않습니다. 내 비디오에서는 지침에 따라 범용 접착제가 부분적으로 건조된 후 양면을 함께 눌렀지만 과정이 원활하지 않았습니다. 다시 한다면 접착제를 바른 직후 잘라낸 조각을 배치할 것입니다.
  2. 플레이트에 피에조 센서 부착: 핫 글루를 사용하여 슬롯의 플레이트 바로 아래에 각 피에조 센서를 부착합니다.
  3. "Pressure-making" 조각을 부착합니다. 뜨거운 접착제를 사용하여 "압력 만들기" 조각을 피에조 스피커에 고정합니다.
  4. 잘라낸 조각을 바닥에 붙입니다. 뜨거운 접착제를 사용하여 두 번째 매트에서 잘라낸 조각을 플레이트 아래쪽에 부착합니다.

5단계: 드럼 패드 배치

  1. 드럼 패드 배치: 컷아웃 섹션 내부에 드럼 패드를 배치합니다.
  2. 매트 고정: 뜨거운 접착제를 사용하여 매트를 슬롯에 단단히 고정합니다.

6단계: 드럼 패드 배선

  1. 케이블 고정: 뜨거운 접착제를 사용하여 리본 케이블을 매트에 연결합니다.
  2. 드럼 패드 납땜: 드럼 패드를 납땜하여 다중 밴드 리본 케이블에 연결합니다.

7단계: Arduino 쉴드 만들기

  1. Arduino Shield 생성: 회로도를 따라 프로토타입 보드에 Arduino 실드를 만듭니다.
  2. Arduino를 배치합니다. 실드가 있는 Arduino를 인클로저에 삽입합니다.
  3. Arduino 보안: 쉴드의 핀을 Arduino에 삽입하기 전에 나사를 사용하여 Arduino 보드를 고정하십시오.
  4. 쉴드를 패드에 연결합니다. 쉴드의 출력 케이블을 패드의 케이블에 납땜합니다.

8단계: 베이스 드럼 페달 조립 및 납땜

  1. 케이블 준비: 드럼 페달에서 책상 높이까지 닿을 수 있을 만큼 충분히 긴 2선식 케이블을 자릅니다.
  2. 스위치를 납땜합니다. 스위치를 케이블 끝에 납땜합니다.
  3. 스위치를 고정합니다. 나사로 스위치를 페달에 부착합니다.
  4. 그립용 사포 추가: 페달 양쪽에 있는 슬롯에 맞도록 사포를 자르고 페달을 사용하는 동안 더 나은 안정성을 위해 제자리에 붙입니다.
  5. 페달 연결: 케이블의 다른 쪽 끝을 Arduino 실드에 납땜합니다.

9단계: Arduino 인클로저를 매트에 고정

 

  1. Arduino 보안: 4개의 나사를 사용하여 Arduino를 매트에 부착하고 그림과 같이 상단 부분에 맞춥니다.

10단계: Arduino 코드 설치

  1. 코드 업로드:  
#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();
}

main.ino
0.00MB

 

이제 여러분의 데스크에 딱 맞는 MIDI 드럼이 탄생합니다!

멋진 사운드를 만들어낼 준비가 되셨나요? 😊

궁금한 점이 있으면 언제든 말씀해주세요!

728x90
반응형