

3Dconnexion SpaceMouse를 사용해 본 적이 있다면 어떤 방식인지 알 것이다. 왼손 아래에 놓인 퍽을 사용해 CAD 뷰포트를 회전하고, 이동하고, 확대·축소하는 동안 오른손은 일반 마우스 작업을 계속할 수 있다. 정말 좋은 아이디어다. 하지만 폐쇄적인 제품이다. 3Dconnexion이 제공한 버튼 배치, 3Dconnexion 드라이버에 포함된 프로필, 그리고 해당 연도의 소프트웨어가 제공하는 애플리케이션별 사용자 설정 범위만 사용할 수 있다.
나는 그 반대를 원했다. 모든 버튼, 모든 제스처, 모든 LED를 애플리케이션별로 내가 직접 정의하고, 전송되는 정확한 보조 키 조합까지 설정할 수 있는 장치 말이다. 이것이 Galileo다. STM32G431을 중심으로 제작한 맞춤형 PCB와, 내가 직접 작성한 MAKMOUSE라는 Windows용 보조 애플리케이션으로 구성되어 있다.
이 프로젝트는 한 편의 글에 담기에는 규모가 크다. 이번 1부에서는 전자 회로, 즉 회로도와 부품 선택, 그리고 그 배경의 이유와 절충안을 다룬다. 또한 현재 MAKMOUSE가 할 수 있는 기능도 살펴본다. 후속편에서는 소프트웨어 아키텍처를 더 깊이 다루고 케이스도 소개할 예정이다. 케이스는 거의 완성되었지만 아직 완전히 끝나지는 않았다.
KiCad를 열기 전에 요구 사항 목록은 대략 다음과 같았다:
SpaceMouse 클론을 만드는 명백한 ‘정석’ 방법은 6자유도 센서 위에 떠 있는 캡을 설치하는 것이다. 광학식이든 정전용량식이든 이 센서는 세 축의 힘과 토크를 동시에 읽는다. 모든 상용 SpaceMouse가 실제로 이 방식을 사용하며, 그렇기 때문에 한 번의 연속적이고 유려한 손동작으로 패닝, 궤도 회전, 확대·축소를 할 수 있다.
Galileo는 의도적으로 그렇게 하지 않는다. 대신 다음을 결합한다:
솔직한 절충안: 이는 단순한 외관상의 차이가 아니라 실제 기능상의 격차다. 진정한 6-DOF 센서가 허용하는 방식처럼 하나의 연속적인 제스처로 궤도 회전과 확대·축소를 동시에 할 수 없다. 패닝과 궤도 회전은 동일한 두 물리 축을 공유하며 버튼을 누르고 있는 동안 서로 전환되고, 확대·축소는 별도의 제어 장치에 할당된다. 대신 얻는 것은 부품 대부분이 개당 몇 센트에서 몇 달러에 불과하고, 손으로 쉽게 납땜할 수 있으며, 조달하거나 고장 날 수 있는 독점적인 블랙박스 센서가 전혀 없는 BOM이다. 일회성으로 제작하면서 수리 가능하고 구조를 완전히 이해할 수 있는 장치를 만드는 데에는, 내가 기꺼이 받아들일 만한 절충안이었다.

모든 기능은 32핀 LQFP 패키지의 STM32G431KBTx가 구동한다. 이 MCU는 설계에 다음을 제공한다:
솔직한 보충 설명: 이는 엄밀히 말해 이런 HID 주변 장치에 필요한 것보다 더 강력한 MCU라고 볼 수 있다. 더 작고 저렴한 G0 또는 F0 부품으로도 두 개의 ADC 채널, 하나의 엔코더 타이머, I2C OLED를 충분한 여유와 함께 처리할 수 있다. 프로젝트 전반에서 하나의 MCU 제품군으로 표준화하는 것(공유 펌웨어, 하나의 툴체인, 하나의 작업 방식)은 추가적인 성능 여유를 정당화하기에 충분히 합리적이며, G431은 Galileo가 향후 확장될 어떤 기능에도 충분한 여유를 남긴다. 하지만 순수한 BOM 비용만이 유일한 기준이라면, 이것은 가장 저렴하면서 올바른 선택은 아니다.

USB1은 완전한 USB-C 리셉터클이지만 USB 2.0 전용으로 연결되어 있다. D+/D−는 고속 데이터 역할 협상 없이 MCU의 네이티브 USB 핀(PA11/PA12)과 ESD 보호 회로로 곧바로 연결된다. CC1과 CC2에는 각각 5.1 kΩ 풀다운 저항이 접지로 연결되어 있으며, 이는 장치를 기본 전류 USB-C 싱크로 선언하는 데 정확히 필요한 구성이다. 따라서 PD 컨트롤러 없이도 모든 USB-C 호스트나 케이블이 장치를 인식하고 올바르게 전원을 공급할 수 있다.
짚고 넘어갈 만한 몇 가지 세부 사항:

팬/오빗 입력은 2축 아날로그 엄지 조이스틱입니다. V축과 H축에 연결된 두 개의 potentiometer가 PF0과 PF1로 바로 연결되어 MCU의 ADC에 입력됩니다. 이 라인에는 아날로그 RC 필터링 단계가 없습니다. 대신 느리게 움직이고 사람이 조작하는 아날로그 신호에는 합리적인 선택인 펌웨어 측 오버샘플링으로 노이즈를 억제하며, 그 덕분에 BOM도 부품 하나만큼 줄어듭니다.
이 설계를 기반으로 제작하려는 분들이라면 알아둘 만한 세부 사항이 하나 있습니다. 조이스틱 모듈에는 자체 통합 푸시-투-클릭 스위치(SEL+/SEL−)가 있지만, 이 설계에서는 의도적으로 연결하지 않았습니다. 향후 개정판에서 원한다면 바로 사용할 수 있는 네 번째 버튼이 공짜로 남아 있는 셈입니다.
줌은 전용 rotary encoder(ENC1)가 담당하며, G431에서 하드웨어 quadrature 디코딩을 지원하는 타이머 채널에 연결되어 있습니다. 따라서 CPU 폴링 없이 방향과 스텝 수를 타이머 주변 장치가 계산하고, 펌웨어는 카운터를 읽기만 하면 됩니다. 이것이 이 글 뒷부분의 MAKMOUSE에서 보게 될 "Sensitivity – zoom (ring)" 슬라이더를 조작하는 물리적 컨트롤입니다.

SW1, SW2, SW3은 단순한 푸시 버튼입니다. 각각 10kΩ 저항을 통해 GND로 풀다운되고, 누르면 3.3V로 구동됩니다. 디지털 입력으로는 거의 가장 단순하고 신뢰성 높은 방식이며, 디바운싱은 펌웨어에서 처리합니다. 이 버튼들은 MAKMOUSE의 Side Button 1/2/3에 직접 매핑됩니다. 아래에서 보겠지만 각 버튼은 독립적으로 3D 내비게이션 홀드 동작, 한 번만 실행되는 키보드 단축키, 또는 임의의 누른 상태 유지형 키+마우스 버튼 조합으로 설정할 수 있습니다.

작은 I2C OLED 모듈이 MCU의 I2C 주변 장치에 연결되어 있으며, 3.3V 동작에 맞게 선정된 자체 4.7kΩ 풀업 저항(R4/R5)을 사용합니다. 화면에 정확히 무엇을 표시할지(활성 프로필 이름, 연결 상태, 버튼 치트 시트 등)는 펌웨어의 영역이므로, 장치를 완전히 조립하고 처음부터 끝까지 구동한 뒤에 다루겠습니다.
단일 WS2812B addressable LED(PB0에서 구동)가 한눈에 확인할 수 있는 상태 피드백을 제공합니다. 이 LED는 3.3V 레일이 아니라 VBUS(5V)에서 전원을 공급받습니다. MCU의 GPIO는 데이터 라인을 3.3V로만 구동하므로 5V에서 동작하는 WS2812B의 공칭 logic-high 임계값보다 기술적으로 낮다는 점은 솔직히 짚고 넘어갈 필요가 있습니다. 실제로 단일 픽셀까지 짧은 배선으로 연결하는 경우에는 매우 흔한 간편화 방식이며 대부분의 경우 매우 안정적으로 작동합니다. 교과서적으로 올바른 답은 적절한 level shifter를 사용하는 것이고, 상태 픽셀 하나가 아니라 더 긴 스트립을 구동하는 설계였다면 바로 이런 부분을 다시 검토했을 것입니다.
MAKMOUSE의 live preview는 실제로 이 LED를 그대로 반영합니다. 화면 속 3D 모델 주위의 색상 링(아래 스크린샷에서는 한 프로필이 파란색, 다른 프로필이 녹색)이 물리 LED에 표시되는 색상을 따라가므로, 화면을 보지 않고도 어떤 프로필이 활성화되어 있는지 알 수 있습니다.
MCU 섹션에는 버튼 두 개가 더 있습니다. BTN1은 NRST에, BTN2는 BOOT0에 연결되어 있으며 각각 1µF 커패시터로 디바운싱됩니다. BOOT0을 버튼으로 빼내 두면(핀셋이 필요한 점퍼가 아니라) 펌웨어 업데이트를 위해 시스템 부트로더로 진입하는 일이 분해 작업이 아니라 두 버튼을 함께 누르는 조작으로 끝납니다. 작아 보이지만 활발히 개발하는 동안 실제 시간을 절약해 주는 부분입니다.
전체 회로는 원형 PCB에 배치됩니다. 조이스틱과 encoder ring이 중앙을 공유하고, 두 개의 버튼과 여러 커넥터가 가장자리를 따라 배치되며, SWD 헤더는 한쪽에 놓입니다.

PC 측은 제가 MAKMOUSE라고 이름 붙인 Windows 앱입니다. 현재까지 구현된 기능을 몇 가지 꼽자면 다음과 같습니다.
애플리케이션별 프로필. 프로필(스크린샷의 Altium, Chrome, Fusion 360)은 하나 이상의 .exe 이름과 일치하도록 설정할 수 있으며, 포커스된 창에 따라 자동으로 전환되고 하나의 프로필을 기본값으로 지정할 수 있습니다. 하나의 프로필에 여러 실행 파일을 등록할 수도 있습니다. 예를 들어 앱 제품군(Fusion360.exe + Inventor.exe)을 하나의 프로필로 묶거나, 하나의 "Chrome" 프로필에서 Chromium 기반 브라우저를 여러 개 지원할 때 유용합니다.

버튼별 유연한 설정. 세 개의 사이드 버튼은 각각 다음 중 하나로 독립적으로 설정할 수 있습니다.
표시된 Fusion 360 프로필에서는 Button 1이 Pan을 전환하고, Button 2가 왼쪽 마우스 버튼과 함께 Shift+A를 누른 상태로 유지하며, Button 3은 누를 때마다 "S"를 한 번 전송합니다. Chrome 프로필에서는 동일한 물리 버튼 세 개가 완전히 다르게 동작합니다. Button 1은 Orbit, Button 2는 Shift+A 전송, Button 3은 가운데 마우스 버튼을 누른 상태에서 Ctrl+Shift+H를 전환합니다. 동일한 하드웨어에 애플리케이션별 리매핑을 적용하는 것, 이것이 바로 제가 직접 만든 핵심 이유입니다.
3D 내비게이션 제스처. Orbit, Pan, Zoom은 각각 한 행을 차지합니다. 각 행에는 키를 누른 상태의 조합, 선택적 홀드 버튼, 상호작용 방식(커서 드래그 또는 마우스 휠), 축이 지정됩니다. 즉, MAKMOUSE는 대상 애플리케이션이 내비게이션에 기본적으로 사용하는 마우스+수정 키 제스처를 그대로 에뮬레이트하므로, 해당 애플리케이션에 공식 3D 마우스 드라이버 지원이 내장되어 있을 필요가 없습니다. 실질적으로 이는 3Dconnexion이 공식 지원하는 소수의 CAD 패키지에만 국한되지 않는다는 뜻입니다. 수정 키를 누른 채 드래그하는 조합으로 내비게이션할 수 있는 앱이라면(대부분의 앱이 그렇듯) Galileo 프로필을 사용할 수 있습니다. 기본 애드인 연결 지점을 제공하는 애플리케이션을 위한 "Direct control (3D add-in)" 옵션도 있어, 대상 앱이 지원하는 기능에 따라 대체 경로인 드래그 에뮬레이션과 '정식' 경로인 네이티브 축 제어를 함께 사용할 수 있습니다.

감도 및 동작. 조이스틱("knob")과 인코더 링("zoom")에 대한 감도 슬라이더가 각각 제공되며, X/Y 반전, X/Y 교체, 몇 가지 제스처 사용 편의 옵션(화면 가장자리에서 재고정, 제스처 시작 전 커서 중앙 정렬, 제스처가 끝난 위치에 커서 유지)도 있습니다.
실제 HID 모니터. Monitor 탭에는 실시간 버튼 상태, 원시 HID report 바이트, 파싱된 X/Y 축 보기, 그리고 모든 report, 파싱된 마우스 이동 델타, 프로필 전환을 기록하는 스크롤 이벤트 로그가 표시됩니다. 이는 대부분의 상용 설정 소프트웨어가 굳이 제공하지 않는 종류의 진단 도구로, 펌웨어 개발뿐 아니라 나중에 자신의 설정을 문제 해결하려는 사람에게도 매우 유용합니다.


비상 정지 스위치. Settings에는 전역 비상 정지 단축키가 포함되어 있습니다(기본값: Ctrl+Alt+F12). 이 단축키를 누르면 MAKMOUSE가 완전히 비활성화됩니다. 프로필이 오작동하여 원하지 않는 입력을 보내더라도 무언가를 뽑을 필요 없이, 키 한 번만 누르면 꺼집니다.

솔직히 짚고 넘어갈 만한 점이 하나 있습니다. "Number of side buttons" 설정은 이미 최대 6개까지 구성할 수 있으며, 실시간 미리보기 패널에도 6버튼 레이아웃이 표시됩니다. 이는 물리적으로 버튼이 3개뿐인 현재 Galileo 3.0 하드웨어보다 앞선 기능입니다. 향후 개정판을 위한 여유 설계일 수도 있고, 처음부터 소프트웨어가 장치에 종속되지 않도록 설계되었다는 증거일 수도 있습니다. 어느 쪽이든 이 앱이 이 보드 하나에만 하드코딩되어 있지 않다는 점을 보여주는 좋은 신호입니다.

또한 "Continuous gestures" 섹션도 있습니다. 여기서는 마우스 이동과 스크롤을 각각 키/버튼을 누른 상태의 조합으로 트리거합니다. 다만 스크린샷만 보고 정확한 동작을 지나치게 설명하고 싶지는 않습니다. 실제 HID report 형식과 프로필 전환 시 포그라운드 프로세스를 감지하는 방식과 함께, 이는 Part 2의 소프트웨어 아키텍처 심층 분석에서 다루기에 적합한 내용입니다.

솔직히 말하면, 실제 SpaceMouse는 동시에 6-DOF로 움직일 수 있고, 지원되는 애플리케이션에서는 연결하는 순간 작동하는 내비게이션 프로필을 제공합니다. 수동으로 제스처를 매핑할 필요도 없습니다. Galileo는 동시 축 제어의 감각을 따라갈 수 없으며, 새로운 애플리케이션 프로필을 추가할 때마다 사전에 수작업이 필요합니다. 하지만 Galileo가 제공하는 것은 브라우저처럼 3Dconnexion이 들어본 적도 없는 앱을 포함해, 말 그대로 어떤 Windows 애플리케이션이든 물리 컨트롤에 반응하도록 만들 수 있는 능력입니다. 모든 버튼, 제스처, LED 색상을 다른 누구도 아닌 자신이 정의할 수 있습니다. 소프트웨어 라이선스 비용은 $0이고, BOM 비용도 가장 저렴한 상용 제품보다 훨씬 적게 들기 때문에, 계속해서 커스터마이징할 생각인 프로젝트에는 이것이 올바른 절충이라고 느껴졌습니다.
인클로저는 거의 완성되었지만 아직 끝나지 않았으므로, Part 2에서는 완성 후의 물리적 제작 과정을 다룰 예정입니다. 최종 조립, 부품이 실장된 보드의 실제 사진, 그리고 MAKMOUSE가 실제로 장치와 통신하는 방식에 대한 심층 분석이 포함됩니다. 즉, HID report 구조, 프로필 전환 로직, 조이스틱 움직임을 Fusion 360 내부의 Orbit 명령으로 변환하는 제스처 에뮬레이션 계층을 살펴봅니다.
설치 파일은 GitHub에서 다운로드할 수 있습니다.
https://github.com/makao1253/MAKMOUSE-CAD-Software
원문: https://www.instructables.com/Galileo-Building-a-Fully-Custom-3D-Navigation-Cont/