모든 데이터는 Thingiverse 및 GitHub에 있습니다. 림은 Ver.2 사용. 인필 20%, 레이어 두께 0.3mm로 출력. 패드 제작에 레이저 커터 활용 가능. 벡터 파일 참조.
2단계: 조립
M3-10mm 볼트/너트로 부품 연결. 중앙 부품은 M3-15mm 또는 M3-25mm로 하단 고정.
3단계: 쉘 제작
쉘 높이 55mm. 55mm 폭 밴드 3개 제작. 길이는 패드 감쌀 길이보다 약간 길게. 하단 틈에 밴드 하나 넣어 원둘레 맞춰 자르기. 3번 반복 후 접착제로 겹쳐 붙이기. 마르면 메쉬 헤드 고정한 상태에서 9mm 소켓 구멍 뚫기. 버터플라이 너트 또는 직접 만든 튜닝 키 사용. 메쉬 헤드 고정엔 M6-70mm 볼트. 구멍 뚫은 후 메쉬 헤드 다시 분리해 피에조 장착.
4단계: 피에조 부착
스네어: 피에조 2개 사용. 빨간 선을 각각 팁과 링에, 검은 선은 둘 다 슬리브에 연결. 납땜 시 센서 플레이트 구멍으로 케이블 통과 필수. 헤드용 피에조(팁 연결)는 10mm 스펀지 폼으로 샌드위치: 아래 1개, 위 3개(원뿔 모양). 센서 플레이트 위에 올리기.
킥: 피에조 1개만 사용 → 팁만 활용. 센서 플레이트 불필요. 피에조 아래 스펀지 폼 2개. 센서를 중앙에서 벗어난 곳에 배치 (비터가 센서 직접 타격 시 아두이노가 강도 판단 불가).
하이햇: 킥과 동일 회로. 피에조 아래 10mm 스펀지 폼 1개.
주의: 피에조는 민감하므로 구부리거나 손상되지 않게 조심.
5단계: 10인치 스네어 패드 완성
림 센서 먼저 부착. 센서 플레이트 단단히 고정. 측면에서 원뿔 끝이 2-3mm 보이게. 8인치 패드를 스네어로 쓸 때도 동일 절차.
6단계: 8인치 킥 패드
13mm 스테인리스 파이프 절단: 200mm 2개, 365mm 2개. 길이 오차 허용. 사진 참고해 조립. 파이프 고정을 위해 M3 너트가 부품 내부에 들어가도록 설계. M3-15mm 볼트/너트로 단단히 고정.
7단계: 12인치 하이햇
두꺼운 종이로 쉘 제작 후 심벌 제작 아이디어. 300mm 직경 원 3개 자르기. 중심에서 노치 하나, 10mm 떨어진 평행 위치에 두 번째 노치 → 작은 입 벌린 팩맨 3개. 입 부분을 테이프로 조심히 닫아 심벌 모양 만들기. 접착제로 얇고 고르게 발라 겹쳐 붙이고 손으로 누른 뒤 무게 올려 건조. 소음 방지용 5mm 스펀지 넣고 구멍 뚫기 (구멍 지저분해도 숨겨짐). 센서 마운트와 케이블 가이드 양면테이프로 부착 (글루건 사용 권장).
8단계: 하이햇 컨트롤러
하이햇 열림/닫힘을 아두이노로 전송. 회로 단순. 3개 파츠 조합. 하단 파츠에 FSR 부착하고 소켓 고정. FSR은 구멍 뚫려도 작동. FSR 위에 10mm 스펀지 부착. 커버를 M3-10mm 볼트로 고정.
단순 HIGH/LOW만 필요한데 FSR 쓴 이유: 롤랜드/야마하 음원 모듈 대응, EZ DRUMMER 2 등 드럼 전용 음원에서 하이햇 열림 정도가 여러 단계로 나뉘는데 FSR이면 코드 수정으로 대응 가능 (미시도).
9단계: USB-MIDI 변환
USB 케이블만으로 아두이노에서 MIDI 신호 전송 → 추가 하드웨어 없이 아이폰 등이 아두이노를 MIDI 기기로 인식. 이 페이지와 GitHub 참조.
일반 아두이노 우노를 아이폰에 직결하면 "호환 안 됨" 오류. 아두이노 우노의 USB 칩(ATmega16U2) 펌웨어를 다시 써야 함. DFU 프로그래밍 가이드 따라 Arduino-usbserial-uno.hex 대신 dualMoco.hex 플래시:
sudo dfu-programmer atmega16u2 flash dualMoco.hex
재작성 후 아두이노가 MIDI 기기로 인식. 사진처럼 핀 쇼트 시 일반 아두이노로, 쇼트 안 하면 MIDI 기기로 인식. 아두이노 IDE로 코드 쓸 땐 핀 쇼트 필요.
10단계: 트리거-MIDI 컨버터 (실드 제작)
아두이노 우노와 실드가 박스 안에. 프리칭 회로도 참조. 다이오드는 보호용이나 아두이노에 보호 회로 있어 생략 가능할 수도. 케이스/커버 3D 모델 출력 후 실드 제작. 커버도 3D 모델 있으나 레이저 커터로 제작함. 취향껏 선택.
11단계: GarageBand로 연주
GarageBand 실행하고 연결만 하면 됨. 어려운 설정 없음. PC용 DAW도 다수 사용 가능. 그중 Hydrogen은 무료에 사운드 추가 가능.
12단계: 설정 조정
코드 수정 대신 아두이노만으로 값 변경 가능하게 구현. 디버깅용이라 불필요한 항목도 있으나, 피에조/패드 크기/스펀지 경도에 따라 설정 필요.
INC/DEC 버튼으로 악기 선택, NEXT/BACK으로 설정 항목 선택, EDIT 눌러 값 변경 후 다시 EDIT로 확정. 영상 후반부 참조.
THRESHOLD: 소리 나오는 최소값
SENSITIVITY: 센서 감도. 낮추면 약하게 쳐도 높은 벨로시티
NOTE: 노트 번호. 변경으로 악기 변경. 이미지 참조
FLAG: 타격 종료 판단값. 1~10 권장. 너무 높으면 한 번 치는데 두 번 소리, 너무 낮으면 연타 시 소리 누락
SCAN TIME: 임계값 초과 후 몇 ms 동안 피크 탐색. 변경 불필요
HEAD/RIM: 림 감도. 올리면 림 소리 내기 어려움. 너무 낮으면 헤드 칠 때 림 소리 남. 헤드/림 판별 로직 개선 필요할 수 있음
PEDAL VELO: 페달 벨로시티 고정. 초기값 100. 취향껏 변경
MASK TIME: FLAG 관련. 변경 불필요. 올리면 연타 시 소리 안 날 수 있음
13단계: Fusion 360 데이터
치수 변경 필요 시 STL 수정 어려우니 Fusion 360 원본 데이터 활용. 시행착오 중 편집돼 히스토리 기능 의존 비추천.
추가 자료
추가 단계는 인스트럭터블에. 상세 제작 과정은 블로그에 공개. 궁금한 점 자유롭게 질문 주세요. 즐거운 제작 되세요!
코드
Hello Drum v2 (수정: 2019/12/05, George Brotherston)
/* Drum MIDI Controller
Created: 28/06/2017 by Ryo Kosaka as "HELLO DRUM" Ver.1.0
Modified: 05/12/2019 by George Brotherston */
#include
#include
// 변수 선언
boolean bSnareFlag = false, bHihatFlag = false, bKickFlag = false, bPedalFlag = false;
boolean bButtonState = true, bButtonState_set = true;
int iUPDOWN = 0, iNEXTBACK = 0;
// 악기별 설정 배열: {threshold, sensitivity, note, flag, velocity, iPeakValue}
int aSNARE[6] = {150, 950, 38, 3, 0, 0};
int aSNARE_RIM[6] = {5, 500, 37, 3, 0, 0};
int aHIHAT[6] = {100, 800, 46, 1, 0, 0};
int aHIHAT_CLOSE[6] = {100, 800, 42, 1, 0, 0};
int aKICK[6] = {200, 700, 36, 1, 0, 0};
int aHIHAT_PEDAL[4] = {600, 0, 44, 0}; // {scantime, snare/rim, pedalVelocity, masktime}
int aSETTING[4] = {4, 500, 100, 1};
// LCD 핀: rs=12, en=11, d4=5, d5=4, d6=3, d7=2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
MIDI_CREATE_DEFAULT_INSTANCE();
void setup() {
MIDI.begin(10);
lcd.begin(16, 2);
lcd.print("INITIALIZING...");
lcd.setCursor(0, 1);
lcd.print("DRUM MIDI CONTROLLER");
pinMode(6, INPUT_PULLUP); // Set
pinMode(7, INPUT_PULLUP); // Up
pinMode(8, INPUT_PULLUP); // Down
pinMode(9, INPUT_PULLUP); // Next
pinMode(10, INPUT_PULLUP); // Back
}
void loop() {
// 버튼 읽기
int iButton_set = digitalRead(6);
int iButton_up = digitalRead(7);
int iButton_down = digitalRead(8);
int iButton_next = digitalRead(9);
int iButton_back = digitalRead(10);
// 피에조/FSR 읽기
int iPiezoValue_A0 = analogRead(A0); // 스네어 헤드
int iPiezoValue_A1 = analogRead(A1); // 스네어 림
int iPiezoValue_A2 = analogRead(A2); // 하이햇
int iPiezoValue_A3 = analogRead(A3); // 킥
int iFSRValue_A4 = analogRead(A4); // 하이햇 페달
// ... (편집 모드 및 센서 처리 로직 생략 - 원본 코드 참조) ...
// 전체 코드는 GitHub 또는 첨부 파일에서 다운로드 가능
}