Wanna be surface dial
마이크로소프트 서피스 다이얼(Microsoft Surface Dial)12
마이크로소프트 서피스 다이얼(이하 서피스다이얼 또는 다이얼)은 퍽(Puck) 형태로 회전과 클릭이 가능한 새로운 형태의 입력 디바이스 입니다.
데모 영상을 보았을 때 꽤나 인상적이었습니다. 주력 입력장치로의 역할은 어렵겠지만 보조 입력수단으로서 마우스나 스타일러스 펜과 함께 사용하는 장면은 매우 매력적으로 보였습니다.
그리고 다이얼을 화면에 접촉했을 때 디바이스를 중심으로 둥글게 펼쳐지는 유저 인터페이스도 신선하고 유용해 보였습니다. 다만 해당 기능은 일부 서피스 디바이스에서만 가능한점이 아쉽습니다.
새로운 형태의 입력장치3
서피스 다이얼을 출시하면서 마이크로소프트는 Radial Controller 라는 명칭의 새로운 입력장치 타입을 정의한 것으로 보입니다. 서피스 다이얼이 아니지만 유사한 형태의 USB 타입 디바이스가 존재하는 것을 최근에 알게 되었습니다.
그래서 관련 정보를 찾아보니 Windows radial controller implementation guide4 페이지에서 정보를 찾아볼 수 있었고, 새롭게 정의된 래디얼 컨트롤러 디바이스는 윈도우즈에서 인식/사용이 가능하다는 것을 알게 되었습니다. (리눅스 커널에서도 관련 디바이스에 대한 HID를 추가한 것으로 보입니다)
해당 문서내 하위 링크를 참조하면 래디얼 컨트롤러는 HID(Human Interface Device)로서 USB, BLE, I2C 통신 인터페이스 형태로 연결될 수 있다는 것과 디자인 가이드, 필수적인 기능 요구사항 등이 잘 정리되어 있었습니다.
그리고 HID 디바이스로서 호스트와 주고받는 정보에 대해 기술된 샘플 디스크립터를 Windows radial controller sample report descriptors5에서 확인 가능했습니다.
가능성 테스트
이전에 USB HID 장치로서 미디어 볼륨이나 재생 등을 제어하는 미디어 컨트롤러 제작에 관련된 포스팅을 작성했습니다6. Windows radial controller designs7를 참고하면 미디어 컨트롤러는 래디얼 컨트롤러에서 요구하는 하드웨어 사양과 비교했을 때 최소한의 요구사항을 만족하는 것으로 보였습니다.
그래서 샘플 디스크립터를 이전에 제작한 컨트롤러에 적용하고, 래디얼 컨트롤러로서 동작 가능성을 확인했습니다.
다행히도 큰 어려움없이 디스크립터를 정의하고 일부 조정만으로 서피스 다이얼이 제공하는 기능 동작 흉내가 가능했습니다.
이로써 래디얼 컨트롤러 구현은 생각보다 쉽게 끝이 났습니다. 하지만 여기서 멈추지 않고 좀 더 그럴 듯한 디바이스 제작을 위한 프로젝트를 기획합니다.
서피스 다이얼은 무선이잖아
비슷한 상용 제품을 보면 대부분 USB를 사용하는 유선 형태의 디바이스로 되어있습니다. 사실 일부 서피스 에서만 인식 가능한 스크린 컨택트 기능을 구현할 것이 아니라면 굳이 무선일 필요는 없을 것 같습니다.
하지만 항상 개인 프로젝트를 진행함에 있어서 중요한 것은 결과물이 아닌 과정입니다. 유사한 디바이스를 만들겠다는 결과론적인 목표보다는 과정을 통해 관련 기술의 원리나 특징을 이해하고, 원 개발자가 치열하게 고민했던 흔적을 비슷하게 따라가 보는 지적유희에 대한 목표를 지향합니다.
그래서 서피스 다이얼은 무선이니깐 무선으로 기획을 합니다?!
래디얼 컨틀롤러에서 지원하는 통신 인터페이스에서 무선은 BLE(Bluetooth Low Energy) 뿐 입니다. BLE 통신 모듈과 프로세서를 구분사용하는 것은 일부 제약이 있을 수 있으므로, 통신과 프로세싱이 하나의 칩이나 모듈에서 이루어지도록 Nordic사의 nrf52 프로세서를 사용하기로 합니다. (나중에 알았지만 서피스 다이얼도 해당 디바이스로 제작되어있습니다)
알리익스프레스에서 모듈이 대략 4~7불 사이에서 판매가되고 있는 것을 확인하고 일단 주문을 걸어두었습니다. 그리고 서피스 다이얼을 보유하고 있지 않기 때문에 서피스 다이얼이 어떤 구조로 구성 되어있는지 정보를 찾아보았습니다.
서피스 다이얼 하드웨어 구조
서피스 다이얼의 하드웨어 구조는 IFixit의 Microsoft Surface Dial Teardown8에 분해 과정과 사진이 잘 나와 있었습니다.
분해과정을 통해 알려진 하드웨어적인 특징을 나열하면 아래와 같습니다.
- Nordic NRF52832 프로세서
- BLE 4.0
- 회전/클릭 인터페이스
- Optical 센서 기반 회전량 측정
- 햅틱용 진동 모터
- AAA 배터리 전원
프로세서는 이미 주문한 프로세서와 동일 프로세서가 사용되고 있었습니다. 회전량을 측정함에 있어서 엔코더가 아닌 옵티컬 센서(옵티컬 마우스)를 사용하는 것이 인상깊었습니다.
일반적인 Quadrature 엔코더는 연결 축 지름이 6mm가 거의 표준이라 58mm의 지름을 가진 큰 다이얼을 체결하기에는 안정적이지 못할 수 있으니 상대적으로 더 안정적이고 흔들림 없게 하기 위해서 원통형 축에 옵티컬 센서 기반으로 회전량을 측정한 것이 아닌가하는 생각이 들었습니다.
진동 모터는 사용자에게 피드백을 주는 용도로 회전 시 회전 클릭감을 주는 용도로 사용되는 것 같습니다.
서피스 다이얼 클론 제작 기획
서피스 다이얼 하드웨어 구조를 보니 3D 프린터나 CNC 작업 없이는 유사한 하드웨어 구조를 재연하는 것은 어려울 것으로 판단이 들었습니다.
사실상 서피스 다이얼 클론을 만드는 것은 어렵고 대신 서피스 다이얼이 되고 싶은 디바이스 그래서 Wanna be surface dial이라는 이름으로 디바이스를 기획하였습니다.
이 디바이스는 이름 답게 언젠가는 서피스 다이얼이 되는 것을 목표로 단계적으로 개선된 버젼을 만들기로 합니다.
-
프로세서
프로세서는 이미 서피스 다이얼과 동일한 NRF52832 프로세서 모듈로 선정했습니다. 포트가 많이 필요없으므로 사이즈를 최대한 줄인 소형 모듈로 선택했습니다. -
다이얼(Dial) 또는 노브(Knob)
기존의 상용 노브나 다이얼을 찾아보니 서피스 다이얼 지름을 가진 노브 찾기가 어려웠습니다. 지름이 AAA 배터리를 담을 수 있을만큼 크기여야 하는데 사실 대부분 노브는 조정용도로 사용되므로 지름이 클 이유가 별로 없습니다.
제가 현실적으로 구할 수 있는 노브중 가장 큰 40mm 지름 사이즈로 타협을 하고, 노브 내부에는 회로 구성이 어려우므로 회로와 배터리는 별도의 엔클로저(enclosure)에 구성을하도록 합니다.
-
엔코더(Encoder)
서피스 다이얼과 같은 구조라면 옵티컬 센서가 필요하겠지만 클릭과 회전을 위한 기구를 만드는 것은 매우 어려우므로 기존 엔코더를 활용하기로 했습니다. -
진동모터(Vibrator)
기존 엔코더의 경우 회전 시 클릭감을 느낄 수 있기 때문에 햅틱 피드백이 크게 필요하지 않습니다. 물론 PC용 앱에서 피드백을 주는 경우가 있을 수는 있습니다 그래서 진동 모터 채용을 고민하였으나 회로나 배터리를 담을 물리적인 공간이 여유롭지 않고, 이번에도 별도 PCB 설계는 하지 않을 예정이므로 초기 버젼에서는 고려하지 않기로 했습니다. -
배터리(Battery)
큰 지름의 다이얼을 구할 수 있다면야 동일하게 AAA 배터리를 이용하려고 했으나 실질적으로는 그러지 못하였기 때문에 Li-Po 배터리를 이용하고 충전하는 방식을 고려했습니다. 충전 회로는 편의를 위해서 모듈을 사용하기로 합니다.
개발 환경 구축
IDE 및 SDK 설치
Nordic 개발환경은 기존에 잘 알려진 IAR이나 KEIL 같은 컴파일러와 IDE가 있지만 GCC 기반으로 개발환경 구성도 가능합니다. 그리고 ARM 디버거 제작사로 잘 알려진 Segger에서는 SES? 라는(1세대 걸그룹을 연상케 하는)이름으로 Segger Embedded Studio9를 비상업적 용도 사용 시 무료로 제공합니다.
IAR이나 KEIL도 이와 비슷하게 32kB 제한된 버젼으로 평가판을 제공하기도 하는데 BLE 관련 스택 사이즈가 크다 보니 코드 사이즈 제한에 걸리기 쉽습니다. 그래서 개발환경을 SES로 구성하도록 합니다.
IDE는 https://www.segger.com/downloads/embedded-studio/ 에 방문하여 다운로드 및 설치 가능합니다.
설치 후 실행하면 다음과 같은 IDE 화면을 확인 할 수 있습니다.
SES를 설치하였으면 NRF52 개발을 위한 SDK를 다운받아 개발 할 수 있는 준비를 해야합니다. 여기서는 개발환경 구축에 대한 디테일한 설명을 하지 않습니다. 정보가 필요하신 분들은 아래의 페이지를 참고하시기 바랍니다.
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_gsg_ses%2FUG%2Fgsg%2Fintro.html
개발용 하드웨어 구성
프로세서 모듈을 배송받고 개발을 위해 하드웨어 개발 환경을 구성했습니다. 소형 모듈에 점퍼선과 핀 헤더를 연결하여 브레드 보드에 연결하고 엔코더와 버튼 그리고 디버거을 연결할 수 있도록 하였습니다.
테스트용 펌웨어를 라이팅하여 하드웨어 구성이나 동작에 이상이 없음을 확인하고 이제 본격적인 펌웨어 개발을 시작하도록 합니다.
… 다음 포스트에서 계속 …
-
https://www.microsoft.com/en-us/d/surface-dial/925r551sktgn ↩︎
-
https://support.microsoft.com/ko-kr/surface/surface-dial-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-1e58a0e6-4d4a-6303-afcd-ef0234047628 ↩︎
-
https://blogs.windows.com/windowsdeveloper/2016/12/01/new-input-paradigm-windows-surface-dial/ ↩︎
-
https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/radial-implementation-guide ↩︎
-
https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/radial-controller-sample-report-descriptors ↩︎
-
https://opensourcehardware.io/posts/projects/media-controller/2021-11-08-media-controller-dev-01/ ↩︎
-
https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/radial-controller-designs ↩︎
-
https://ifixit.com/Teardown/Microsoft+Surface+Dial+Teardown/74808 ↩︎
-
https://www.segger.com/products/development-tools/embedded-studio/ ↩︎