롤랜드 전자드럼 랙용 커스텀 DAW 컨트롤 박스
부품 및 소모품
| 부품 | 수량 |
| 아두이노 마이크로 프로 (Arduino Micro Pro) | 1 |
| 푸시 버튼 (상시 개방형) | 1 |
| 3D 프린트 클램프 및 박스 | 1 |
필요한 도구 및 기계
앱 및 온라인 서비스
프로젝트 소개
DAW(제 경우 Cubase)가 실행 중인 노트북을 드럼 녹음 중에 조작하는 게 불편했습니다. 스틱을 내려놓지 않고도 시작/정지/녹음 등 필수 명령을 실행할 수 있는 방해 없는 방법이 필요했습니다. 상용 솔루션은 너무 비싸거나 제 랙에 장착할 수 없어 실용적이지 않았습니다. 그래서 유명한 아두이노 마이크로 기반의 DIY 버튼 박스를 만들었습니다. 롤랜드 랙에서 사용하는 표준 38mm 튜브에 장착할 수 있습니다.
제작 지침
- 3D 프린팅: 랙 클램프 2개와 박스 본체를 출력하세요. PLA도 괜찮지만 더 튼튼하게 원하면 PETG 추천. M4x40 나사로 클램프 두 파트를 연결(회전 가능하게 적당히 조임). M6 윙나사와 너트로 랙에 단단히 고정. M3x4 나사 2개와 너트로 상단 클램프와 박스 결합.
- 전면 패널: 사용 버튼에 맞춰 직접 디자인하거나 제공되는 STL(3D 프린터용) 또는 SVG(CNC용) 템플릿 활용. (저는 DIY CNC로 각인된 패널을 만들었지만 3D 프린트도 충분합니다.)
- 버튼 장착 및 배선: 전면 패널 준비 후 버튼 삽입하고 올바른 아두이노 포트에 납땜(아래 핀 할당 참조). 별도 PCB 사용 시 4개 모서리 구멍으로 고정. 마지막으로 M3 나사 2개로 전면 패널 고정.
- 아두이노 프로그래밍: 반드시 아두이노 마이크로 프로여야 합니다(일반 마이크로 아님). 내장 USB로 네이티브 USB 키보드 에뮬레이션 가능해 펑션 키, 넘버패드 키 등 모든 키스트로크 트리거 가능. 디지털 핀 2-8을 내부 풀업으로 초기화하고, 버튼(상시 개방형) 누르면 핀이 GND로 풀려 감지되어 프로그래밍된 키 입력 실행.
제 DAW(Cubase)용 설정:
| 포트 | 버튼 | 키 | Cubase 기능 |
| 2 | M | c | 메트로놈 켜기/끄기 |
| 3 | L | [Num] 1 | 왼쪽 로케이터로 이동 |
| 4 | >> | [Num] + | 앞으로 이동 |
| 5 | << | [Num] - | 뒤로 이동 |
| 6 | P | SPACE | 재생/정지 |
| 7 | B | b | 시작 위치로 |
| 8 | R | [Num] * | 녹음 |
코드에서 쉽게 변경해 본인 설정에 맞출 수 있습니다. 동봉된 코드를 예제로 활용하세요.
즐거운 제작 되세요!
코드
랙 버튼 박스용 아두이노 마이크로 프로 코드 (C/C++)
아두이노 IDE에서 보드를 마이크로 프로로 설정하세요.
/* ROLAND RACK BUTTON BOX
* Note: 아두이노 프로 마이크로 전용!
* 연결된 PC의 키보드를 에뮬레이트해 DAW(여기선 Steinberg Cubase) 키 명령 전송
* 선택사항: 에뮬레이트된 UART COM 포트(USB)로 디버깅, 마이크로 보드 RX/TX LED 활용
* 키 설정(Cubase용): https://steinberg.help/cubase_elements_le_ai/v9/de/cubase_nuendo/topics/key_commands/key_commands_default_c.html
* 할당: 아두이노 마이크로 포트 → 버튼 박스 스위치 → 에뮬레이트 키 → Cubase 기능
* ------------------------------------------
* Port Switch Key Cubase Function
* 2 M c Metronome On/Off
* 3 L [Num] 1 Goto Left Locator
* 4 >> [Num] + Forward
* 5 << [Num] - Backward
* 6 P SPACE Play/Stop
* 7 B b Begin
* 8 R [Num] * Record
* mac70 13.01.2021
*/
#define DEBUG_OUTPUT 0 // 1로 설정 시 시리얼 모니터에 디버그 출력
#include <Keyboard.h>
// 넘버패드 키 코드: https://forum.arduino.cc/index.php?topic=659117.0
#define KEYPAD_1 225
#define KEYPAD_PLUS 223
#define KEYPAD_MINUS 222
#define KEYPAD_ASTERIX 221
int RXLED = 17; // RX LED 핀
void setup() {
pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(RXLED, OUTPUT);
digitalWrite(RXLED, HIGH); // RX LED 끄기
Keyboard.begin(); // 키보드 에뮬레이션 시작
Serial.begin(9600);
Serial.println("");
if (DEBUG_OUTPUT == 1) Serial.println("Button Box Serial Monitor");
}
void loop() {
Keyboard.releaseAll();
digitalWrite(RXLED, HIGH);
delay(50);
if (digitalRead(2) == 0) { // M
if (DEBUG_OUTPUT == 1) Serial.println("Button M");
digitalWrite(RXLED, LOW);
Keyboard.press('c'); delay(5); Keyboard.releaseAll();
while(digitalRead(2) == 0);
}
if (digitalRead(3) == 0) { // L
if (DEBUG_OUTPUT == 1) Serial.println("Button L");
digitalWrite(RXLED, LOW);
Keyboard.press(KEYPAD_1); delay(5); Keyboard.releaseAll();
while(digitalRead(3) == 0);
}
if (digitalRead(4) == 0) { // >>
if (DEBUG_OUTPUT == 1) Serial.println("Button >>");
digitalWrite(RXLED, LOW);
Keyboard.press(KEYPAD_PLUS);
while(digitalRead(4) == 0); // PC 반복 기능이 키 재트리거
Keyboard.releaseAll();
}
if (digitalRead(5) == 0) { // <<
if (DEBUG_OUTPUT == 1) Serial.println("Button <<");
digitalWrite(RXLED, LOW);
Keyboard.press(KEYPAD_MINUS);
while(digitalRead(5) == 0);
Keyboard.releaseAll();
}
if (digitalRead(6) == 0) { // PLAY/STOP
if (DEBUG_OUTPUT == 1) Serial.println("Button PLAY/STOP");
digitalWrite(RXLED, LOW);
Keyboard.press(' '); delay(5); Keyboard.releaseAll();
while(digitalRead(6) == 0);
}
if (digitalRead(7) == 0) { // BACK
if (DEBUG_OUTPUT == 1) Serial.println("Button BACK");
digitalWrite(RXLED, LOW);
Keyboard.press('b'); delay(5); Keyboard.releaseAll();
while(digitalRead(7) == 0);
}
if (digitalRead(8) == 0) { // REC
if (DEBUG_OUTPUT == 1) Serial.println("Button REC");
digitalWrite(RXLED, LOW);
Keyboard.press(KEYPAD_ASTERIX); delay(5); Keyboard.releaseAll();
while(digitalRead(8) == 0);
}
}
커스텀 파트 및 인클로저
Thingiverse 3D 파일 링크: thingiverse.com