




얼마 전, 저는 오픈 소스 Space Drums 프로토타입을 만들었습니다. 얇은 공기 중에서 풀 드럼 키트를 연주할 수 있게 해 주는 스마트 모션 트래킹 스틱 한 쌍입니다. 재미있었지만, 거의 모든 에어 드러머가 겪는 문제 중 하나(여러 문제 중 하나)가 있었습니다.
상용 에어 드럼의 리뷰를 살펴보면, 구매자의 대부분은 초보자입니다. 거대하고 비싼 실제 드럼 키트를 구매하지 않고도 저렴하고 조용하며 휴대하기 좋은 방식으로 드럼을 배우고 싶어 하기 때문입니다. 하지만 초보자들이 연주를 시작하면 꽤 어렵다는 것을 알게 됩니다. 제품을 홍보한 YouTuber들의 연주 방식을 따라 할 수 없어서 포기하고, 스틱은 서랍 속에서 먼지만 쌓이게 됩니다. 저는 그 문제를 해결하고 싶었습니다.
Space Drums 2.0과 Space Drums Trainer를 만나보세요!
Space Drums 2.0은 독립형 모션 트래킹, 햅틱 피드백, 무선 풋 페달을 하드웨어에 완전히 업그레이드했으며, 모두 보기 좋은 3D 프린팅 하우징에 담았습니다. 하지만 진짜 핵심은 화면에 있습니다. Beat Saber 같은 VR 인기 게임의 플레이 방식에서 영감을 받아 Python으로 완전한 아케이드 학습 엔진을 만들었습니다. 게임을 즐기면서 드럼 연주도 배울 수 있습니다!
음표는 공중에서 스틱이 휘두르는 위치에 직접 매핑된 3D 시각 고속도로를 따라 내려옵니다. 템포는 느린 42 BPM에서 시작해 연주할수록 서서히 빨라지며, 스틱은 칠 때마다 햅틱 피드백과 소리를 제공합니다. 복잡한 손과 다리의 협응을 중독성 있는(정말입니다!) 게임으로 바꿔줍니다.
전자 부품 및 하드웨어(드럼스틱 2개)
풋 페달 허브 어셈블리
3D 프린팅 부품 및 인클로저
소프트웨어 및 디지털 리소스
필요한 도구






이 Instructable은 두 부분으로 구성됩니다. 첫 번째에서는 스틱 제작을 다루고, 다음에서는 게임을 설명하겠습니다.
Space Drums Trainer는 pygame을 사용해 Python으로 만든 아케이드 스타일의 시각 게임입니다. 음표는 3D 공간에서 팔이 휘두르는 방식에 맞춰 설계된 공간형 고속도로를 따라 내려옵니다.
위 동영상에서 게임을 명확하게 설명합니다.



The 원래 Space Drums 프로토타입 에는 몇 가지 큰 결함이 있었습니다. 사용자의 자세를 추적하고 어느 가상 드럼을 가리키는지 판단하는 데 전적으로 스마트폰 카메라에 의존했습니다. 이 때문에 설치가 번거로웠고 지연 시간이 상당히 발생했으며, 드럼을 칠 때 물리적인 피드백이 전혀 없었습니다.
Space Drums 2.0은 방향 추적과 스윙 감지를 스틱 자체에 직접 탑재하여 이러한 문제를 해결합니다:


이제부터 하드웨어의 작동 원리와 제작 과정을 설명하겠습니다. 게임에 관한 자세한 내용은 Step 11
납땜 인두를 가열하기 전에 모든 부품이 어떻게 함께 작동하는지 간단히 살펴보겠습니다.
Space Drums 2.0은 세 가지 주요 부분으로 구성됩니다:
두 스틱은 ESP-NOW를 사용해 허브와 통신합니다. 그런 다음 허브는 드럼 및 페달 이벤트를 USB serial을 통해 컴퓨터로 전송하고, 오디오 애플리케이션이 해당 샘플을 재생합니다.
드럼스틱
스틱을 보정할 때는 스네어를 배치하고 싶은 위치를 향해 스틱을 가리킵니다. 스네어 가 있을 위치를 말합니다. 그 방향이 가상 드럼 키트의 기준점이 됩니다.
그 후 펌웨어가 스틱의 방향을 계속 추적합니다. 스틱을 휘두르면 스윙을 감지하고, 스틱이 가리키는 방향에 해당하는 가상 드럼을 판단합니다.
드럼 배치는 두 개의 행으로 나뉩니다.
스틱이 수평 연주 기준 35도보다 위쪽으로 기울어져 있으면 위쪽 행이 선택되고, 35도 아래쪽이면 아래쪽 행이 선택됩니다. 각 행에서는 스틱의 yaw가 가리키는 드럼 영역을 결정합니다. 정의된 각도 영역을 벗어나면 어떤 드럼도 트리거되지 않습니다.
펌웨어는 동작 데이터를 사용해 스윙과 그에 따른 감속을 감지합니다. 타격이 감지되면 드럼 ID와 velocity 값을 생성합니다. velocity는 1에서 6까지의 음량 값으로 표시됩니다.
스틱은 햅틱 액추에이터도 트리거할 수 있어 가상 타격이 발생할 때 물리적인 피드백을 제공합니다.
풋 페달은 별도의 Xiao ESP32-S3에 직접 연결되며, 이 장치가 두 스틱의 수신 허브 역할을 합니다.
왼쪽 페달은 GPIO 1에, 오른쪽 페달은 GPIO 2에 연결됩니다. 스위치는 GPIO 핀과 ground 사이에 연결되며, ESP32의 내부 pull-up으로 입력이 active-low가 됩니다.
오른쪽 페달은 항상 킥 드럼으로 작동합니다.
왼쪽 페달은 두 번째 킥 드럼 또는 하이햇 컨트롤러로 설정할 수 있습니다. 하이햇 모드에서는 페달을 누르면 하이햇이 닫히고, 발을 떼면 열립니다. 이 할당은 애플리케이션(PC/Android)에서 처리하므로 왼쪽 페달의 기능을 변경할 때 허브를 다시 플래싱할 필요가 없습니다.




어셈블리는 Fusion 360
에서 설계했습니다. 인쇄해야 할 어셈블리는 세 가지입니다. 모든 파일은 제 Github repo
드럼스틱 어셈블리 1개
풋 페달 어셈블리 2개
전자 부품 조립을 시작하기 전에 모든 부품을 출력하세요. 스틱 인클로저는 맞춤형 PCB를 기준으로 설계되었으며 USB-C 커넥터와 전원 버튼을 위한 개구부가 있습니다. 따라서 출력된 부품이 깨끗하고 관련 개구부가 막히지 않았는지 확인하세요.






PCB 장착
먼저 Space Drums PCB를 출력한 스틱 베이스 안에 배치합니다.
강력한 3M 양면테이프를 사용해 PCB를 제자리에 고정합니다. 보드가 인클로저에 올바르게 놓였고 USB-C 커넥터가 출력 하우징의 개구부와 맞는지 확인하세요.
USB-C 포트는 외부에서 접근할 수 있으므로 스틱을 열지 않고도 배터리를 충전하고 새 펌웨어를 업로드할 수 있습니다.
배터리 연결
스틱은 충전식 배터리로 작동합니다.
배터리 전선을 PCB의 BAT 패드에 납땜하되 극성이 올바른지 확인하세요.
전원 버튼 설치
그다음 순간식 스위치를 PCB의 전용 스위치 패드에 납땜합니다.
출력된 스틱 하우징에는 이 스위치를 장착할 위치가 있어 외부에서 버튼을 조작할 수 있습니다. 스위치가 제자리에 장착된 후 끼울 수 있도록 작은 3D 프린팅 커버도 설계했습니다.
두 번째 스틱에도 같은 과정을 반복합니다.
풋 페달은 Adafruit의 가이드에 따라 만들 수 있습니다: https://learn.adafruit.com/usb-foot-switch-circuit-python/overview
그런 다음 앞서 설명한 대로 스위치를 허브 ESP32에 연결할 수 있습니다.



하드웨어 조립이 끝났으므로 이제 펌웨어를 업로드하고 드럼 이벤트를 소리로 변환하는 소프트웨어를 설정할 차례입니다.
관련된 펌웨어 프로그램은 두 가지입니다:
ESP32-S3 허브부터 시작합니다.
Arduino IDE에서 허브 펌웨어를 열고 XIAO ESP32-S3에 업로드합니다. 부팅이 완료되면 500000 baud로 Serial Monitor를 엽니다.
허브는 시작할 때 MAC 주소를 출력합니다. 두 드럼스틱이 무선 데이터를 어디로 보내야 하는지 알아야 하므로 이 주소를 기록해 둡니다.
드럼스틱 구성하기
스틱 펌웨어를 열고 각 스틱에 대해 간단한 두 가지를 변경합니다.
먼저 고유 ID를 할당합니다:
그런 다음 허브에서 출력된 MAC 주소를 hubAddress[] 설정에 입력합니다.
두 스틱은 동일한 허브 주소를 사용해야 하지만, 각각 고유한 STICK_ID를 사용해야 합니다.
이제 각 스틱에 펌웨어를 플래시합니다.
스틱에 사용되는 ESP32-S3-MINI-1-N8에는 위 이미지의 설정을 사용합니다.
Space Drums의 PC 버전은 오디오 엔진과 사용자 인터페이스에 Python을 사용합니다. 내 Github의 Android 앱을 사용하는 경우 이 단계를 건너뛰세요.
먼저 필요한 Python 패키지를 설치합니다:
그런 다음 애플리케이션을 시작합니다:
실행하기 전에 audio_hub.py 상단 근처의 COM_PORT를 다음에 해당하는 시리얼 포트로 설정합니다: 허브드럼스틱 어느 쪽도 아닌 허브의 시리얼 포트여야 합니다.
오디오 애플리케이션은 드럼 샘플이 같은 폴더에 있어야 한다고 가정합니다. 기본 샘플 이름은 다음과 같습니다:
샘플이 없으면 애플리케이션은 충돌하는 대신 버즈음으로 대체합니다.
대신 Android를 사용하는 경우 제공된 SpaceDrums.apk를 PC 애플리케이션 대신 사용할 수 있습니다. 두 애플리케이션 모두 오디오 재생, 키트 UI 및 배터리 표시 기능을 수행합니다.


하드웨어와 소프트웨어가 준비되었습니다. 드럼 연주를 시작하기 전에 보정 단계 몇 가지만 완료하면 됩니다.
스틱 보정하기
먼저 전원 버튼을 길게 눌러 두 드럼스틱을 모두 켭니다.
스틱의 전원이 켜지면 스네어를 배치하려는 위치를 향하게 하고 움직이지 않도록 잡습니다. 보정 과정에서는 이 방향을 가상 드럼 키트의 영점으로 사용합니다.
스틱은 짧은 안정화 및 보정 과정을 거칩니다. 보정이 실행되는 동안 스틱을 움직이지 마세요. 이 시간 동안 움직이면 보정 시간이 다시 시작되므로, 완료될 때까지 스틱을 그대로 잡고 있으면 됩니다.
보정이 완료되면 해당 위치가 연주 기준점이 됩니다.
보정 과정에서는 자이로 바이어스를 다시 측정하고 중력을 사용해 스틱의 자세를 설정합니다. 사용자가 가리키는 방향을 기준으로 피치와 요의 영점을 설정하므로, 방 안에서 어느 방향을 향하고 있든 작동합니다.
최초 1회 자력계 보정
새 펌웨어를 설치한 후에는 스틱마다 한 번씩 별도의 자력계 보정을 수행해야 합니다.
이 과정은 배터리, 햅틱 액추에이터 및 PCB를 포함해 스틱 자체의 구성 요소로 인해 발생하는 자기 왜곡을 보정합니다.
수행 방법:
보정에 실패한 데이터는 저장되지 않으므로, 실패한 시도가 이전의 정상적인 보정 데이터를 덮어쓰지 않습니다.
연주 중 재보정하기
장시간 연주하다 보면 가상 드럼 위치가 약간 이동한 것처럼 느껴질 수 있습니다.
그런 경우 스틱을 다시 스네어 위치를 향하게 하고 전원 버튼을 짧게 누르면 됩니다.
스틱은 동일한 짧은 영점 설정 과정을 다시 실행합니다. 보정이 완료되면 눈앞의 공간이 드럼 키트가 됩니다.
이제 에어 드러밍 스틱 한 쌍이 정상적으로 작동해야 합니다. 하지만 전체 시스템이 오픈 소스이므로 여기서 멈출 필요는 없습니다. 스틱의 조작감을 조정하거나, 드럼 배치를 변경하거나, 하드웨어와 소프트웨어 간의 통신을 자세히 살펴볼 수 있습니다.
연주 환경 미세 조정
스틱의 조작감에 영향을 주는 대부분의 매개변수는 stick_firmware.ino 상단 근처에 모여 있습니다.
예를 들어 TOP_ROW_PITCH, TOP_YAW_CRASH, TOP_YAW_RIDE 및 하단 행의 요 한계와 같은 매개변수를 사용해 가상 드럼의 경계를 조정할 수 있습니다. 이를 통해 각 드럼에 도달하기 위해 스틱을 얼마나 움직여야 하는지와 각 가상 연주 영역의 크기를 변경할 수 있습니다.
타격 감지 임계값도 조정할 수 있습니다:
오작동으로 타격이 감지된다면 이러한 임계값을 높여 시스템의 민감도를 낮출 수 있습니다. 타격이 안정적으로 등록되지 않는다면 임계값을 낮춰 보세요.
방향 보정과 자이로 바이어스 학습, 페달 디바운스 및 페달 속도를 제어하는 매개변수도 있습니다.
레이턴시에 관한 참고 사항
시스템이 빠르게 반응한다고 느껴지는 이유 중 하나는 통신 경로를 가볍게 유지하기 때문입니다.
스틱은 소형 ESP-NOW 패킷을 허브로 전송합니다. 타격 패킷에는 이벤트 유형, 스틱 ID, 드럼 ID, 속도 및 배터리 정보가 포함됩니다. 그런 다음 허브는 이러한 이벤트를 오디오 애플리케이션용 간단한 시리얼 메시지로 변환합니다.
예를 들어 타격은 다음과 같이 표시됩니다:
페달 이벤트에는 P를 사용하고, 배터리 업데이트에는 B를 사용합니다.
PC 애플리케이션을 통해 연주하는 경우 일반적인 사용 중에는 CONSOLE_LOG를 비활성화해 두세요. 모든 타격을 터미널에 출력하면 Windows에서 측정 가능한 레이턴시가 추가됩니다.
스틱이 허브에 연결되지 않습니다
먼저 허브를 플래시했는지, 그리고 두 스틱의 hubAddress[]에 허브의 MAC 주소가 올바르게 입력되어 있는지 확인하세요. 또한 왼쪽 스틱과 오른쪽 스틱의 STICK_ID 값이 서로 다른지 확인하세요.
캘리브레이션이 계속 다시 시작됩니다
캘리브레이션 시간 동안 스틱을 움직이지 않은 상태로 유지해야 합니다. 움직이면 캘리브레이션 과정이 자동으로 다시 시작됩니다.
드럼 위치가 회전된 것처럼 느껴집니다
스틱을 원하는 스네어 위치를 향하도록 가리킨 다음 전원 버튼을 짧게 눌러 영점을 다시 설정하세요.
자력계 캘리브레이션에 실패합니다
스피커, 컴퓨터, 철제 가구 및 기타 자기 간섭원에서 떨어진 곳에서 일회성 magcal 절차를 수행하세요. 8자 동작 중에 스틱을 여러 방향으로 회전시키고 있는지 확인하세요.
페달이 반복적으로 작동합니다
허브는 페달 디바운스를 위해 소프트웨어 잠금 시간을 사용합니다. 기본 PEDAL_LOCKOUT_MS는 35 ms입니다. 한 번 눌렀을 때 반복 트리거가 발생하면 50 ms에 가깝게 높이되, 빠른 더블 베이스 연주를 위해 대략 75 ms 미만으로 유지하세요.

이미 긴 Instrucctable에서 코드를 모두 설명하기에는 코드가 상당히 깁니다. 제 repo를 참고하고 Readme를 읽어 보세요. 많은 내용이 설명되어 있습니다.
간단히 개요를 설명하면 다음과 같습니다:
스틱은 오디오 샘플에 대해 아무것도 알 필요가 없습니다. 단순히 이벤트를 감지하고 어느 스틱이 어느 드럼을 어떤 속도로 쳤는지 보고합니다.
허브 역시 어떤 소리를 재생할지 결정하지 않습니다. 무선 이벤트를 수신하고, 페달을 읽고, 모든 정보를 애플리케이션으로 전달합니다.
이러한 분리 덕분에 프로젝트를 수정하기가 더 쉬워집니다. 현재 프로토콜은 이미 타격, 배터리 및 페달 이벤트를 구분하며, 애플리케이션에서 이러한 이벤트를 어떻게 표시하거나 소리로 재생할지 결정할 수 있습니다.



필수 구성 요소 설치: Python 3.10 이상이 설치되어 있는지 확인하세요. 터미널 또는 명령 프롬프트를 열고 프로젝트 디렉터리로 이동한 다음 필요한 종속성을 설치합니다: pip install -r requirements.txt (또는 pygame-ce와 pyserial을 수동으로 설치하세요).
드럼 샘플 추가: 게임 디렉터리에 audio/라는 폴더를 만들고 표준 .wav 파일 9개를 넣으세요:
게임 실행: XIAO ESP32-S3 페달 허브를 USB로 연결하고 다음을 실행하세요: python -m spacedrums_trainer.



트레이너는 실제 드럼 키트의 구조를 기반으로 설계된 시각적 하이웨이를 사용합니다:

모드 1: 연주 배우기
모드 2: 리듬 배우기
모드 3: 커스텀 리듬(출시 예정)
점수 및 타이밍 보정



Space Drums 2.0을 지금의 단계까지 만드는 데 거의 1년이 걸렸습니다. 이런 것이 가능한지 조사하는 일부터 첫 버전 제작, PCB 설계 학습, 전자 장치와 펌웨어 개발, 설계 반복 작업까지 진행했습니다.
상용 제품으로 만들 생각으로 제작한 것은 아닙니다. 그저 궁금증을 해소하고 싶어서 시작한 일이었습니다.
그리고 그것이 궁극적으로 제가 이 프로젝트를 오픈 소스로 공개하는 이유입니다.
전체 프로젝트를 공개했으니 직접 버전을 만들거나, 트래킹을 수정·개선하거나, 펌웨어를 실험하거나, 자신만의 케이스를 설계하거나, 완전히 다른 무언가의 출발점으로 사용할 수 있습니다.
무언가를 만들 줄 알아야만 시도할 수 있는 것은 아닙니다.
현재 자신의 능력보다 조금 벅차 보이는 무언가를 만들 생각을 하고 있었다면, 한번 도전해 보세요.
호기심을 잃지 말고, 계속 실험하며, 만드는 과정을 즐기세요.
원문: https://www.instructables.com/Space-Drums-20-Smart-Air-Drum-Sticks-That-Gamify-Y/