PocketMuse
ESP32로 만드는 음악 플레이어이자 음성 단말입니다. 로컬 음악을 재생하고 Spotify를 제어합니다. 음성과 터치로 집 안의 기기를 조작하는 홈 대시보드도 함께 만들고 있습니다.
화면 밖의 소프트웨어를 배우기
시뮬레이터와 실제 기기에서 같은 코드 쓰기
화면과 제품 로직을 하드웨어에서 분리하고, 데스크톱 시뮬레이터와 실제 기기에서 같은 코드를 사용합니다. 화면을 빠르게 고쳐 보고, 실제 기기에서는 터치와 소리, 연결 상태를 확인합니다.
연결에 문제가 생겨도
Wi-Fi가 시작되지 않아도 로컬 음악은 재생하고, 연결이 잠깐 끊겨도 보고 있던 화면을 유지하도록 다듬었습니다. 일부 기능의 문제가 기기 전체의 사용을 멈추게 하지 않도록 살피고 있습니다.
설계와 구현
공통 코드와 기기의 경계
버튼·SDL 입력 → 공통 재생 상태·LVGL 화면
SD 파일 → 디코더 → 재생 제어·PCM → I2S 출력
재생 상태와 PCM 처리, LVGL 화면을 공통 코드로 두고 macOS의 SDL과 ESP-IDF가 각 환경의 입출력을 맡도록 나눴습니다. 펌웨어도 앱 동작, 보드 배선과 주변장치, 빌드 설정을 분리했습니다.
재생·화면·네트워크를 따로 진행하기
음악은 디코더에서 탐색·일시정지·진행률·볼륨 단계를 거쳐 I2S 출력으로 흐릅니다. 디코딩은 별도 FreeRTOS 작업에서 실행하고, 곡이 바뀌면 이전 재생을 취소합니다. 화면 갱신과 네트워크도 별도 작업으로 분리했습니다. Spotify 원격 제어와 Home Assistant 연결의 서비스 인증은 Gateway가 맡습니다.
메모리와 바이트 배열까지 내려가 보기
큰 읽기 버퍼는 PSRAM을 활용하고, DMA가 직접 읽는 버퍼는 내부 SRAM에 둡니다. 24비트 FLAC이 잡음으로 출력되던 문제는 디코더와 전송 경계를 나눠 추적했습니다. 공통 PCM 표현을 유지하면서 ESP32와 S3가 요구하는 서로 다른 바이트 배열을 I2S 직전에 변환하도록 했습니다.
검증과 남은 범위
재생 상태, 중단과 진행률, PCM 바이트 변환을 다루는 호스트 테스트를 두었습니다. 실제 S3 기기에서는 음악 재생과 USB 마이크 녹음을 90초 동안 함께 실행한 기록이 있습니다. 현재 음악용 빌드는 Assistant·WakeNet을 별도 옵션으로 둡니다.
지금까지와 다음 단계
현재는 실제 기기에서 음악 재생과 음성 응답을 확인한 프로토타입입니다. 홈 대시보드에서는 집 안의 기기 제어도 확인했습니다. 케이스 조립 후의 소리와 전원 구성, 장시간 동작은 더 검증해야 합니다.
화면이 늦게 반응하는 이유를 메모리와 통신 경로에서 찾아보며, 임베디드 개발을 배우고 있습니다.