원문 캡처 · radiowaveshare.vercel.app
원문 캡처 · radiowaveshare.vercel.app

AI가 코딩을 바꾸면서 개발의 손맛을 잃었다고 느낀 한 개발자가 하드웨어와 맞춤형 기기를 만지며 다시 성취감을 찾았다. 직접 만든 책상 위 라디오에는 음악 방송과 아르메니아어 뉴스, 날씨 화면 등이 들어간다.

기기는 Waveshare ESP32-S3-RLCD-4.2 보드로 만들었다. 400×300 해상도의 흑백 반사형 화면과 240MHz 코어 2개, 플래시 메모리 16MB, PSRAM 8MB를 갖췄다. 브라우저나 리눅스 없이 작은 실시간 커널과 자체 코드로 작동한다.

휴대전화나 노트북에서 같은 와이파이에 연결한 뒤 http://desk.local을 열면 라디오 재생과 음량, 화면 전환, 날씨 도시 설정, 실내 온도·습도, 뉴스 알림을 제어할 수 있다. 웹 페이지와 JSON API는 펌웨어 안에서 실행되며 클라우드를 거치지 않는다. 기기는 처음에 자체 와이파이 네트워크를 열고 QR 코드로 연결을 안내한다. 사용자가 집 네트워크를 선택하면 접속 정보가 플래시에 저장되고 기기가 재부팅된다.

라디오 서비스 radiobananas.art는 날짜와 UTC 시각을 기준으로 섞은 재생목록을 모두에게 같은 순서와 시점으로 재생한다. 기기에서도 웹사이트와 동일한 순서를 계산하도록 구현했고, 웹사이트의 index.html에서 seededShuffle을 가져와 Node.js와 C++ 결과를 6,288개 사례에서 비교해 모두 일치했다고 설명한다. 오디오는 HTTP 범위 요청으로 현재 재생 위치에 맞춰 가져온다.

기기에는 아르메니아어 뉴스 사이트 loor.news, 생성형 날씨 화면, 시계와 실내 온·습도 표시, trainspotting도 들어갔다. 날씨 화면은 픽셀 단위로 그리며, 기기의 버튼으로 화면을 바꾸고 라디오를 멈출 수 있다. 휴대전화에서 와이파이로 조작한다.

개발자는 ESP-IDF와 C++를 사용했다. 메모리 부족을 겪은 뒤 큰 데이터와 네트워크 작업 스택을 PSRAM으로 옮겼고, 화면 전환 때 곡 사이의 공백을 2.7초에서 약 20밀리초로 줄였다고 밝혔다. ‘CHOOSE LIFE’ 화면의 프레임 처리 시간은 28.6밀리초에서 9.8밀리초로 줄었다. 펌웨어는 2.2MB이며, 빠른 내부 RAM은 0KB까지 떨어졌다가 약 45~55KB를 확보했다. 보드를 벽돌 상태로 만든 사례는 없었다고 전했다.

개발자는 다음 단계로 NFC 스티커가 붙은 작은 앨범 카드를 만들고, 카드를 기기에 대면 해당 앨범을 재생하는 NFC 리더로 바꾸고 싶다고 썼다. 작은 기기에서 대규모 언어 모델을 실행하거나 시각화를 만드는 아이디어도 있다고 덧붙였다.