





여러분, 안녕하세요. 다시 오신 것을 환영합니다!
소개합니다, Pebble을, 실제 돌처럼 보이고 만져지는 느낌이 들도록 설계한 초소형 음성 레코더입니다.
이 프로젝트의 아이디어는 제가 계속 겪던 문제에서 시작되었습니다. 하루에도 무작위 프로젝트 아이디어가 터무니없이 많이 떠오르는데, 막상 작업을 시작하려고 앉으면 그중 절반은 사라져 버립니다. 그래서 버튼만 누르면 아이디어를 녹음하고 나중을 위해 저장할 수 있는 간단한 작은 장치를 만들고 싶었습니다.
Pebble의 핵심에는 RK3566 프로세서로 구동되는 SBC인 UniHiker M10이 있습니다. 이 보드에는 터치스크린, 마이크, SD 카드 지원 기능이 내장되어 있습니다. 여기에 맞춤형 전원 회로를 설계하고, 자연석의 유기적인 형태에서 영감을 받아 외함 전체를 처음부터 설계했습니다.
Pebble의 중심에는 이 장치를 위해 특별히 설계한 간단한 녹음 인터페이스가 있습니다.
메인 화면에는 타이머가 표시되는 큰 녹음 버튼이 있습니다. 버튼을 누르면 Pebble이 내장 마이크를 통해 녹음을 시작하고, 타이머가 작동하여 녹음한 시간을 정확히 확인할 수 있습니다.
버튼을 다시 누르면 녹음이 중지됩니다. 그러면 오디오 파일이 SD 카드에 바로 저장됩니다.
하지만 매번 SD 카드를 빼지 않고도 녹음 파일에 쉽게 접근할 수 있는 방법도 필요했습니다. UniHiker M10에는 Wi-Fi 연결 기능이 있으므로, Pebble은 로컬 네트워크에 연결하여 자체 웹 인터페이스를 호스팅할 수 있습니다.
장치는 로컬 IP 주소를 UI에 직접 표시합니다. 같은 네트워크에 연결된 다른 장치의 브라우저에 해당 IP 주소를 입력하면 Pebble 웹 앱으로 이동합니다.
웹 앱에는 SD 카드에 저장된 모든 녹음 파일이 표시되며, 여기에서 브라우저로 바로 재생하거나 오디오 파일을 다운로드할 수 있습니다.
따라서 모든 녹음 파일은 SD 카드에 저장되고, 웹 인터페이스는 로컬 네트워크를 통해 파일에 접근하고 관리할 수 있는 편리한 방법만 제공합니다.
이 제작에 사용한 부품은 다음과 같습니다-




디자인을 시작하면서 기존의 전자기기 외함과는 확실히 차별화되는 외함을 만들고 싶었습니다. 완벽하게 대칭이고 각진 상자 형태보다는 유기적이고 자연스러운 무언가를 원했습니다.
가장 먼저 떠오른 것은 돌이나 자갈이었습니다. 자연석에서 볼 수 있는 불규칙하고 곡선적인 형태를 좋아하기 때문에, 근처 강둑에서 돌 몇 개를 주워 형태를 관찰하기 시작했습니다.
그 돌들을 참고 자료로 삼아 직접 몇 가지 형태를 스케치하고, 다양한 곡선과 비율, 실루엣을 실험했습니다.
형태와 도면을 조금씩 다듬은 끝에 결국 원하던 형태에 도달했습니다. 돌처럼 보일 만큼 자연스러우면서도 내부에 모든 전자 부품을 넣을 수 있는 공간을 충분히 제공하는 단순하고 유기적인 형태였습니다.




원하던 형태를 완성한 뒤, 도면을 Fusion 360으로 가져와 스케치를 실제 CAD 모델로 변환하는 참고 자료로 사용했습니다.
그다음 외함을 쉘 형태로 만들고 두 개의 반쪽으로 나눴습니다. 이후 UniHiker 보드를 먼저 배치하고, 맞춤형 전원 회로와 리튬 셀을 차례로 넣어 보며 내부 구성을 맞췄습니다.
이 과정에서 중요한 부분은 원래의 돌 같은 형태를 유지하면서 모든 부품이 깔끔하게 들어맞도록 하는 것이었습니다.
일반적인 엔지니어링 및 반복 수정 과정을 거친 끝에, 기존 전자기기 외함이 아니라 돌처럼 보이고 만져지는 느낌을 유지하는 매우 미니멀한 외함을 완성했습니다.
또한 외함을 분해하지 않고도 중요한 포트와 조작부에 쉽게 접근할 수 있도록 했습니다.
Pebble의 뒷면에는 microSD 카드에 바로 접근할 수 있는 작은 개구부를 만들었습니다. 따라서 녹음 파일을 옮기거나 관리해야 할 때 카드 홀더에서 카드를 꺼낼 수 있습니다.
USB Type-C 포트는 외함 하단에 배치했으며 장치를 충전하는 데 사용됩니다. 전원 버튼도 하단에 배치하여 조작부를 눈에 띄지 않게 숨기면서도 필요할 때 쉽게 누를 수 있도록 했습니다.
이렇게 하면 전체적인 돌 같은 외관을 깔끔하게 유지하면서도 장치를 사용하고 관리하는 데 필요한 모든 기능에 접근할 수 있습니다.


모델을 확정한 뒤 메시 파일을 내보내고 외함의 두 반쪽을 출력했습니다.
상단과 하단 부품은 0.4 mm 노즐, 0.2 mm 레이어 높이, 25% 자이로이드 인필을 사용해 Hyper Grey PLA로 출력했습니다. 트리 서포트는 필요한 곳에만 사용했으며, 주로 외함 내부에 적용했습니다.
두 부품 모두 바닥면이 빌드 플레이트를 향하도록 출력했습니다. 덕분에 외부 표면이 위쪽을 향하게 되어, 눈에 보이는 상단 레이어를 훨씬 깔끔하게 마감할 수 있었습니다.
서포트에는 0.3 mm Z-distance를 사용하고, 서포트와 실제 부품 사이에 네 개의 레이어를 두었습니다. 이렇게 하면 서포트를 쉽게 제거할 수 있을 만큼 충분히 분리하면서도 외함 내부의 오버행을 안정적으로 지지할 수 있습니다.



이 프로젝트의 두뇌로는 DFRobot의 소형 싱글 보드 컴퓨터인 UNIHIKER M10을 사용했습니다. Debian Linux를 실행하며, 쿼드 코어 ARM Cortex-A35 프로세서, 512 MB RAM, 16 GB 온보드 eMMC 스토리지를 기반으로 합니다.
Pebble 같은 프로젝트에 특히 유용한 점은 보드에 이미 다양한 하드웨어가 탑재되어 있다는 것입니다. 2.8인치 터치스크린, 내장 마이크, Wi-Fi와 Bluetooth, microSD 카드 슬롯, 여러 확장 인터페이스가 함께 제공됩니다.
사실 저는 이전에도 UNIHIKER M10을 사용해 PathFinder 프로젝트를 진행했으며, Linux와 Python 환경을 활용해 오프라인 내비게이션 장치를 만들었습니다.
Pebble에서는 이와 동일한 기능을 여러 가지 활용하지만, 훨씬 단순한 목적인 오디오 녹음과 관리에 사용합니다.
DFRobot은 또한 정말 포괄적인 Wiki 를 M10용으로 제공합니다. 여기에는 하드웨어 문서, 핀 배치, 소프트웨어 가이드, 예제 및 Python 라이브러리가 포함되어 있어 보드에서 커스텀 애플리케이션을 훨씬 쉽게 개발할 수 있습니다. 이 보드에는 바로 사용할 수 있는 Python 환경이 제공되며 Jupyter Notebook과 VS Code 같은 도구를 통한 개발도 지원하므로, Pebble의 전체 인터페이스와 기능을 Python으로 구현할 수 있었습니다.



여기서는 여러 배터리 관련 프로젝트에서 사용해 온 IP5306 Power Management IC 회로를 사용합니다. 이 SOIC8 패키지 IC는 3.7V 리튬 이온 또는 LIPO 셀에서 안정적인 5V, 2.4A를 제공하며, 과충전 보호, 과방전 보호, 배터리 잔량 표시, 충전 상태 표시와 같은 중요한 기능도 포함합니다.
이 IC에 대한 자세한 정보가 필요하다면 아래 데이터시트를 참고하세요.
https://www.skytech.ir/DownLoad/File/2566_IP5306.pdf
Fusion 360 CAD 파일의 맞춤형 회로 설계를 따라 PCB CAD에서 보드 외곽선을 제작했습니다. CAD 치수에 따라 모든 부품을 순서대로 배치하여 보드 레이아웃을 완성했습니다. 모든 부품의 배치가 맞춰진 후 최종 보드를 제작용으로 준비했습니다.










전원으로는 이 구성에 매우 잘 맞는 3.7V 600 mAh Li-Po 셀을 사용합니다. 원래는 14500 3.7V 600 mAh Li-ion 셀을 사용하려 했지만 쉽게 구할 수 없어서 Li-Po로 변경했습니다.
두 셀 모두 정격 전압과 용량이 같고 Li-Po가 훨씬 더 얇아 인클로저 내부에 넣기 쉽기 때문에, 이는 실제로 타협이라고 할 수 없습니다.
배터리는 JST 커넥터를 통해 커스텀 전원 회로에 연결됩니다. Pebble을 켜려면 회로에 장착된 수직형 푸시 버튼을 누르면 됩니다. 그러면 회로에 전원이 들어오고 표시 LED가 켜져 전원 시스템이 활성화되어 UniHiker M10에 안정적인 5V 출력을 공급하고 있음을 보여 줍니다.



작은 문제 중 하나는 UniHiker M10에 보드 전원 공급에 직접 사용할 수 있는 전용 5 V 또는 VIN 입력 핀이 없다는 점이었습니다. 보드는 일반적으로 USB Type-C 포트를 통해 전원을 공급받으므로, 기존 전원 경로를 대신 사용하기로 했습니다.
USB Type-C 케이블을 UniHiker에 연결한 뒤 멀티미터로 PCB를 추적하여 USB 포트에서 공급되는 5 V 전원을 전달하는 테스트 패드를 찾았습니다. 올바른 패드를 확인한 후 두 개의 전선을 직접 납땜했습니다.
그런 다음 이 두 전선을 커스텀 전원 회로의 5 V 출력에 연결하여, UniHiker가 USB Type-C 포트를 통해 받을 때와 동일한 5 V 전원을 공급받도록 했습니다.
모든 연결을 완료하면 전원 회로의 전원 버튼을 눌러 시스템을 켤 수 있으며, UniHiker에 전원이 공급되고 Pebble 전체 시스템이 작동하기 시작합니다.
전체 코드는 제 GitHub에서 확인하세요.
https://github.com/razorArnov/UniRecorder
Pebble은 UNIHIKER에서 나란히 실행되는 두 개의 Python 스크립트로 구성됩니다.
recorder.py- 터치스크린 UI를 구동하고, 버튼 입력을 감지하며, 오디오를 녹음합니다.
webpage.py - 포트 5000에서 Flask 웹 서버를 호스팅하며, 녹음 파일을 재생하고 다운로드할 수 있는 무선 저장소 역할을 합니다.
화면의 돌을 탭하면 녹음 중 돌이 맥동하며 숫자가 올라갑니다. 다시 탭하면 녹음 파일이 저장되고, 기기 화면 하단에 표시된 IP 주소를 열면 스크롤 가능한 카드 형태로 녹음 파일이 나타나 바로 다운로드할 수 있습니다.
디바이스 UI
1. 디스플레이 설정
UNIHIKER의 'unihiker' 라이브러리는 화면에 객체를 그리기 위한 'GUI' 클래스를 제공합니다. recorder는 단색 위에 대각선 레이어를 겹쳐 그려 대리석 배경을 만듭니다:
2. Pebble 버튼(스큐어모픽 원형)
평면적인 버튼 대신 "pebble"은 세 개의 원을 겹쳐 만든 구조입니다. 아래쪽의 그림자 원, 왼쪽 위의 하이라이트 원, 중앙의 본체 원으로 구성됩니다. 이로써 돌이 솟아 있는 3D 형태처럼 보이는 착시가 만들어집니다.
3. 녹음 로직
녹음 전환은 하나의 함수에서 처리됩니다. 녹음이 시작되면 슬레이트 블루 색상인 강조 색상 #3F6B8C가 pebble 전체를 채우고, 메인 루프가 펄스 애니메이션을 시작합니다:
메인 루프는 녹음 반경이 R_MIN = 46과 R_MAX = 62 사이에서 20 fps로 진동하는 동안 pebble이 숨을 쉬듯 커졌다 작아지게 합니다.
4. 지능형 파일 이름 지정
파일은 MicroSD 카드의 /media/mmcblk0p1/Voice_Memos에 저장됩니다. 파일 이름에는 자동 증가 인덱스가 포함되고 및 벽시계 타임스탬프가 포함되지만, 기기 시계의 연도가 ≥ 2001로 정상적으로 보일 때만 포함됩니다. 즉, 기기가 실제로 NTP 동기화를 완료한 경우입니다.
이를 통해 두 가지 문제를 방지합니다. 인덱스는 재부팅 시 파일이 덮어써지는 것을 막고, 연도 조건은 시간이 틀어진 시계에서 잘못된 타임스탬프가 생성되는 것을 방지합니다.
인덱스는 정규 표현식을 사용해 기존 파일 이름을 검색하여 결정합니다:
물리 버튼 지원
UNIHIKER 측면의 A 버튼은 다음 한 줄로 연결됩니다:
디바운스 가드는 빠르게 탭할 때 신호가 두 번 발생하는 것을 방지합니다.
웹 대시보드
1. HTTP Range를 지원하는 Flask 서버
웹 서버는 최소한의 Flask 앱입니다. 핵심은 'send_from_directory'에 'conditional=True'를 전달하는 것입니다. 이렇게 하면 HTTP range 요청이 활성화되어, 브라우저의 <audio> 플레이어가 파일 전체를 먼저 다운로드하지 않고도 파일 내에서 구간을 이동하거나 탐색할 수 있습니다.
2. 녹음 파일 목록 표시
'list_recordings()' 함수는 SD 카드를 읽고 타임스탬프를 추출한 뒤 최신순으로 정렬된 항목을 반환합니다.
3. 클라이언트 측 시간대 처리
UNIHIKER는 UTC로 실행되거나 올바른 시간대가 전혀 설정되지 않을 수 있습니다. 타임스탬프를 서버 측에서 형식화하면, 다른 시간대에서 대시보드에 접속하는 사람마다 잘못된 시간을 보게 됩니다. 대신 원시 epoch 타임스탬프를 data-ts 속성으로 브라우저에 전달한 다음, JavaScript에서 보는 사람의 로케일을 사용해 형식화합니다:
4. 클록 드리프트 경고
UNIHIKER M10에는 배터리 백업 RTC가 없습니다. 오프라인 상태로 부팅하면 시계가 2019년의 어느 시점으로 기본 설정됩니다. 대시보드는 서버가 보고한 시간과 브라우저의 Date.now()를 비교하여 이를 감지합니다. 차이가 3분을 초과하면 경고 배너가 표시됩니다:
5. Marble UI(CSS)
웹 UI는 SVG 기반 프랙털 노이즈 텍스처를 data URI로 인라인 렌더링하는 순수 CSS를 사용합니다. canvas도, WebGL도 없이, 마크업에 CSS filter 효과만 적용합니다:
각 녹음 카드는 뉴모픽 석판이며, 오목한 그림자로 오디오 플레이어가 들어갈 홈을 만들고 볼록한 그림자로 카드가 떠 있는 효과를 냅니다:
설정 및 실행
1. 파일을 UNIHIKER에 복사하기
SSH 또는 UNIHIKER의 파일 관리자를 통해 연결한 다음 두 스크립트를 모두 홈 디렉터리에 넣습니다:
2. Flask 설치
3. 웹 서버 시작(백그라운드)
4. 레코더 시작
레코더가 실행되면 화면 하단에 웹 서버 URL이 표시됩니다. 같은 Wi-Fi 네트워크에 연결된 모든 기기에서 이 URL을 엽니다.
5. 부팅 시 자동 시작
UNIHIKER의 전원이 켜질 때 두 스크립트가 자동으로 실행되도록 하려면 /etc/rc.local에 추가하거나 Mind+ / UNIHIKER 앱의 내장 "Start on Boot" 옵션을 사용합니다.


이제 표면 마감 공정을 시작합니다. 출력 부품에 작업을 진행하여 눈에 보이는 3D 프린팅 적층선을 제거하는 단계입니다.
첫 단계로 100방 사포와 사포 홀더를 사용합니다. 두 부품의 외부 표면을 샌딩하면서 전체 표면을 고르게 작업합니다.
이 단계의 목표는 눈에 보이는 적층선을 완전히 제거하고 표면을 평평하게 만드는 것입니다.

다음은 프라이밍 공정입니다. 이를 위해 Epoxy Grey Spray Primer를 사용하고 케이스의 두 부품 모두에 여러 번 얇게 도포합니다.
총 세 번 도포했습니다. 첫 번째 코팅 후 프라이머가 마를 때까지 약 한 시간 기다린 다음 두 번째 코팅을 적용했습니다. 그런 다음 한 시간 더 건조한 후 세 번째이자 마지막 코팅을 적용했습니다.



이제 케이스를 페인팅하는 재미있는 단계입니다.
이를 위해 주로 검은색과 흰색, 두 가지 아크릴 물감을 사용했습니다. 목표는 Pebble에 돌의 자연스러운 색과 질감을 닮은 어둡고 약간 회색빛 도는 외관을 주는 것이었습니다.
먼저 케이스 전체에 검은색 페인트를 칠했습니다. 작업이 끝난 뒤 흰색 페인트로 표면 전체에 무작위 선과 하이라이트를 몇 군데 추가했습니다. 색을 완벽하게 균일하게 만들려 한 것은 아니며, 돌에서 볼 수 있는 자연스러운 변화와 비슷한 불규칙한 회색빛 패턴을 만드는 것이 목적이었습니다.
조금 실험해 본 뒤 최종적인 돌 느낌의 마감이 마음에 들었습니다. 페인트를 보호하고 마감의 내구성을 높이기 위해 아크릴 컨포멀 스프레이를 두 번 도포했으며, 각 코팅 사이에 약 30분의 간격을 두었습니다.
이렇게 하여 페인트 위에 보호층이 생겼고 최종 마감이 훨씬 더 튼튼하고 오래 유지되도록 도와주었습니다.





최종 조립은 리튬 배터리용으로 지정된 부분에 양면테이프를 붙이는 것으로 시작합니다. 이렇게 하면 Li-Po 셀이 케이스 내부에 단단히 고정됩니다.
다음으로 맞춤형 전원 회로를 제 위치에 놓고 양면테이프 위에 Li-Po 셀을 장착합니다. 전원 회로는 케이스에 압입 방식으로 맞춰지며, 주변에 설계된 리브가 회로를 단단히 고정해 움직일 공간이 없습니다.
그런 다음 UniHiker M10을 케이스 반대쪽 절반의 지정된 위치에 넣고, 모든 배선을 연결하여 내부에 깔끔하게 정리합니다.
모든 부품을 제자리에 배치한 뒤 케이스의 두 절반을 맞추고 M2 나사 네 개로 고정합니다.
이로써 조립이 드디어 완료되었습니다.




그리고 이것이 제작의 최종 결과물입니다: Pebble이라는 돌로 위장한 완전한 기능의 음성 녹음기입니다.
무작위로 떠오른 프로젝트 아이디어를 기록하려는 단순한 발상에서 시작했지만, 맞춤형 케이스와 전원 시스템, 녹음 인터페이스, 웹 앱을 갖춘 작고 완전한 기기로 완성되었습니다.


이로써 Pebble 제작 과정의 마지막에 도달했습니다.
기기는 정말 잘 작동하고, 완성된 모습도 꽤 마음에 듭니다. 간단한 음성 녹음기에 UniHiker M10을 사용하는 것이 조금 과하다고 생각할 수도 있는데, 솔직히 저도 전적으로 동의합니다. 실제로 그렇습니다.
향후 버전에서는 UniHiker를 완전히 대체하여 더 작고 저렴하며 특정 목적에 맞게 설계된 무언가를 사용하는 방식으로 이 문제를 해결하고 싶습니다. 아마 맞춤형 보드를 설계하고 전자 부품에 관한 R&D도 진행해야겠지만, 그건 다음에 할 프로젝트입니다.
일단 Pebble은 완성되었고, 최종 결과가 정말 마음에 듭니다.
프로젝트에 관해 궁금한 점이 있다면 댓글을 남기거나 Instagram으로 DM을 보내 주세요. 그곳에서 꽤 활발히 활동하고 있으며 제 프로젝트에 대해 이야기하는 것을 언제나 좋아합니다.
여기까지 함께해 주셔서 감사합니다. 곧 새로운 프로젝트로 돌아오겠습니다.
평화!
원문: https://www.instructables.com/PEBBLE-Portable-Audio-Recorder/