

대부분의 "AI 비서 만들기" 프로젝트는 같은 지점에서 중단됩니다. 툴체인을 설치하고,
보드 정의를 선택하고 라이브러리 버전 문제를 해결한 뒤, 다음 단계로 넘어가야 합니다.
단 한마디를 듣기도 전에 눈앞에 펼쳐지는 붉은 글자 벽.
이것은 그 반대입니다. 시판되는 2.8인치 ESP32-S3 보드, 630 mAh 배터리,
3D 프린트 케이스, 그리고 브라우저 탭에서 바로 플래시할 수 있는 펌웨어입니다. 화면을
누르고, 질문을 한 다음 손을 떼세요. 애니메이션 얼굴과 함께 소리 내어 대답하고, 알람을 설정하며,
“잘 자”라고 말하면 조명을 꺼 줍니다.
**직접 작업하는 데 약 10분.** 플래싱은 70초, 조립은
몇 분이면 됩니다. 오래 걸리는 유일한 작업은 프린터로, 케이스 부품 4개 전체를 출력하는 데 대략 1시간 20분이 걸리며,
출력하는 동안 로봇을 플래시하고 설정할 수 있습니다.
커스텀 PCB도, 배선도 전혀 필요 없습니다. 납땜 인두를 꺼내는 유일한 경우는
열 삽입 너트 4개를 눌러 끼울 때입니다.
처음부터 끝까지 전체 제작 과정을 확인하세요(5분): https://youtu.be/vgklh-3mNh4
모든 것—펌웨어, 출력 파일, 부품 목록, 원클릭 플래셔—이
무료입니다: https://varozhan3212.github.io/robolynk-light/


**전자 부품**
- ES3C28P(또는 ES3N28P) ESP32-S3 보드 × 1 — 2.8인치 240×320 ILI9341 디스플레이,
정전식 터치, ES8311 오디오 코덱, 스피커 앰프, microSD 슬롯, USB-C
- LiPo 배터리, 3.7 V 630 mAh, JST-PH, **보호 회로 포함** × 1
- 8 Ω 소형 스피커 × 1
- microSD 카드 × 1(선택 사항 — 더 큰 얼굴 애니메이션에만 필요)
- GPS 모듈, UART 3.3 V × 1(선택 사항 — 배선이 필요한 유일한 부품)
**하드웨어**
- M2 열 삽입 너트 × 4
- M2 나사, 6–8 mm × 4
**공구**
- 3D 프린터(PETG 또는 PLA)
- 납땜 인두 — 삽입 너트를 눌러 끼울 때만 사용
- 글루건
- USB-C 케이블 및 Chrome 또는 Edge가 실행되는 컴퓨터
⚠️ **보드 모델 번호를 반드시 일치시키세요.** 다른 ESP32-S3 보드도 외관은 동일하지만
다른 디스플레이 컨트롤러를 사용하거나 오디오 코덱이 없으면 펌웨어가
그 장치에서 실행되지 않습니다. 이것이 빌드를 작동 불능으로 만드는 가장 흔한 원인입니다.


사진: B/02-printed-shells.jpg
사진: A/05-red-and-black-shells.jpg
기다려야 하는 단계는 출력뿐이므로 다른 일을 하기 전에 먼저 시작하세요. 출력하는 동안
보드에 펌웨어를 플래시하고 설정할 수 있습니다.
한 플레이트에 네 파일 모두 배치, **서포트 없음**:
| 파일 | 수량 | 비고 |
|---|---|---|
| front_shell_v22.stl | 1 | 디스플레이를 고정하며, 베젤이 평평하게 맞물림 |
| back_cover_v22.stl | 1 | USB-C와 microSD에 계속 접근 가능 |
| clips_v22.stl | 1 플레이트 | 내부 클립 |
| buttons_v22.stl | 1 플레이트 | 리셋 버튼과 부트 버튼용 캡 |
**설정:** PETG 또는 PLA · 레이어 높이 0.2 mm · 인필 20% · **서포트 없음** ·
파일을 불러올 때의 방향 그대로 — 방향을 다시 지정할 필요가 없습니다.
네 부품 모두 출력하는 데 약 **1시간 20분**이 걸립니다. 기본 프로파일을 사용해
Bambu Lab에서 출력했습니다. 클립과 버튼은 작아서 어느 셸 옆에도 함께 배치할 수 있습니다.
파일: https://github.com/varozhan3212/robolynk-light/tree/main/case

툴체인도, IDE도, 라이브러리도 필요 없습니다.
1. USB-C로 보드를 컴퓨터에 연결합니다.
2. **Chrome 또는 Edge**에서 플래셔를 엽니다(Safari와 Firefox에서는 사용할 수 없습니다 —
WebSerial을 지원하지 않기 때문입니다): https://varozhan3212.github.io/robolynk-light/
3. **Connect**를 누르고 직렬 포트를 선택한 다음 **Install**을 누릅니다.
4. 약 70초간 기다립니다.
이것으로 전체 과정이 끝납니다. 펌웨어는 런타임과
애플리케이션 및 모든 파일이 포함된 단일 이미지이므로, 두 번째 단계나 이후에 복사할
파일이 없습니다.
완료되면 보드가 다시 시작되고 스플래시 화면이 표시됩니다.
인두를 **낮은 온도**로 설정하고 M2 인서트 네 개를 앞면 셸에 눌러 넣습니다. 인서트가 직각으로 들어가도록 인두를 곧게 아래로
누르세요.
천천히 작업하고 다음 인서트로 넘어가기 전에 각각 식히세요. 서두르면 인서트가 기울어지고,
기울어진 인서트는 나사를 축에서 벗어나게 하므로 백 커버가 절대 평평하게 맞지 않습니다.

보드를 **디스플레이가 먼저 들어가도록** 넣고, 베젤이 평평하게 맞도록 안착시킵니다.
그런 다음 **보드 모서리를 핫글루로 고정하세요.** 보드가 움직이는 것을 막을 다른 방법은 없으며,
보드가 느슨하면 USB-C를 꽂을 때마다 포트에 힘이 가해집니다 — 이것이
보드를 망가뜨리는 원인입니다. 커넥터에 풀이 묻지 않게 하고 배터리가
놓일 위치도 깨끗하게 비워 두세요.

🚨 **연결하기 전에 배터리 극성을 확인하세요.** JST-PH 커넥터는 공급업체마다
표준이 같지 않으며, 셀을 반대로 연결하면 보드가 손상됩니다. 만약
배터리 하우징의 배선이 반대로 되어 있다면 억지로 연결하지 말고 하우징 안의 핀 위치를
바꾸세요.
확인했으면 배터리를 연결하고, 셸을 닫을 때 배터리가 눌리지 않도록 셀을 안쪽에
잘 넣습니다.


1. 바깥쪽에서 버튼 캡을 눌러 끼웁니다.
2. 백 커버를 장착합니다.
3. M2 나사 네 개를 조입니다.
케이스를 닫은 상태에서도 USB-C와 microSD 슬롯을 사용할 수 있으므로, 다시 열 필요가 없습니다.
펌웨어 업데이트도 마찬가지이며, 업데이트는 Wi-Fi를 통해 진행됩니다.
키보드도 없고 펌웨어에 하드코딩된 인증 정보도 없습니다.
1. 전원을 켭니다. 로봇에 **TAP TO BEGIN**이 표시됩니다.
2. 로봇이 **RoboLynk-XXXX**라는 자체 핫스팟을 만듭니다.
3. 휴대폰에서 해당 핫스팟에 연결한 뒤 **192.168.4.1**을 엽니다.
4. 목록에서 네트워크를 선택하고 비밀번호를 입력합니다.
⚠️ **2.4 GHz만 지원합니다.** 이 보드에는 5 GHz 무선 기능이 없으므로 5 GHz 전용 네트워크는
목록에 표시되지 않습니다.
1. https://robolynk.cloud에서 계정을 만드세요.
2. 로봇에서 **Settings → Info**로 이동하여 **6자리 설정
코드**를 확인하세요.
3. 해당 코드로 로봇을 추가하세요.
이제 화면을 누른 채로 질문한 다음 손을 떼세요.
최근 메시지 6개를 기억하므로 후속 질문도 가능합니다. "what's Dune about?"이라고 물은 직후 "who wrote
it?"이라고 물어도 무슨 뜻인지 알아듣습니다.
- 말하는 동안 **애니메이션 얼굴**이 표시됩니다.
- 음성으로 **알람과 타이머**를 설정할 수 있습니다.
- **Philips Hue 제어** — "turn on the lights", "dim the bedroom",
"lights to 50%".
- **네트워크가 전혀 없어도 작동하는 내장 조명과 SOS 신호가 있습니다.** 화면 왼쪽 위를 탭하면
흰색 LED가 켜지고, 3초간 누르면 SOS 패턴이 실행됩니다.
둘 다 Wi-Fi나 서버가 필요하지 않습니다.
- Wi-Fi를 통해 **스스로 업데이트됩니다**.
여기의 알림과 알람은 편의 기능입니다. 의학적으로 중요한 일에는
절대 의존하지 마세요.
마이크로컨트롤러에서 오디오를 캡처하는 무언가를 만들고 있다면 읽어 볼 가치가 있습니다.
세 가지 모두 "칩이 충분히 빠르지 않다"는 문제처럼 보였습니다. 하지만 어느 것도 그렇지 않았습니다.
**1. 모든 질문의 첫 단어가 사라졌습니다.** 사람들이 "why is the 4th
of July important"라고 물으면 트랜스크립트에는 "July is important"라고 나왔습니다. 원인은
실행 순서였습니다. 코드가 마이크를 켜기 *전에* 화면을 업데이트하고 가비지 컬렉션을 실행했습니다.
화면에 LISTEN이 표시되는 순간 사람들은 말하기 시작하므로,
첫 단어는 녹음되지 않았습니다. 이제는 마이크가 먼저 켜지고
그 뒤에서 정리 작업이 실행됩니다.
**2. 캡처 루프가 버퍼에서 조금씩만 읽고 있었습니다.** 네트워크로 한 번 전송할 때마다 오디오를 30 ms씩만 읽었는데,
전송 한 번에 약 110 ms가 걸렸습니다. 따라서 실제 시간의 겨우 1/4 정도만 캡처되었고, 나머지는 버퍼가 넘칠 때까지 쌓였습니다. 버퍼가
실제로 빌 때까지 읽고
더 큰 배치로 전송하자, 캡처 성능이 실제 시간의 27%에서 85%로 향상되었습니다. 가장 큰 비용을 초래한 세부 사항은
**블로킹 읽기는 데이터가 다 떨어졌다고 알려 주지 않는다는 점입니다. 그저 기다릴 뿐입니다.** 루프는 오디오를 잃는 동안 내내
정상적으로 작동하는 것처럼 보였습니다.
정상적으로 작동하는 것처럼 보였습니다.
**3. 스트리밍 음성이 대기할 곳이 없었습니다.** 네트워크에서 바로
170 ms 하드웨어 버퍼로 재생하면 늦게 도착한 패킷마다 들리는 끊김이 발생합니다. 재생을 시작하기 전에
약 600 ms를 미리 받아 더 큰 버퍼에 저장하자 문제가 완전히 사라졌습니다.
임베디드 오디오가 이상하게 작동할 때는 실리콘을 탓하기 전에 먼저 자체 실행 순서와 버퍼링을
의심하세요.
- **서버가 필요합니다.** 음성 및 언어 처리는 보드에서 이루어지지 않습니다.
이 프로젝트는 디바이스 측을 담당합니다.
- **얼굴 애니메이션이 메모리 예산을 좌우합니다.** 프레임은 RAM에 저장되며, 로더는
들어갈 수 있는 프레임 수를 결정하기 전에 TLS 핸드셰이크와 오디오 버퍼를 위한 여유 공간을
확보합니다. 이 여유 공간을 없애면 흰색 화면으로 부팅됩니다.
- 비트뱅잉 SPI 버스에 연결한 **microSD 카드는 느립니다** — 여기서는 약 93 KB/s이므로,
수 메가바이트 크기의 애니메이션을 부팅 시 로드하는 데 1분 넘게 걸립니다.
- 무선 스트리밍, 카메라 비전 및 웨이크 워드 감지 기능은 이전 코드에 존재하지만
이 빌드에서는 꺼져 있습니다. 아직 완성되지 않았으며
이 프로젝트의 일부가 아닙니다.
실제로 매일 사용 중인 작동 프로토타입입니다.
**라이선스:** CC BY-SA 4.0 — 자유롭게 제작하고, 변경하고, 만든 것을 판매할 수 있습니다. 단,
RoboLynk를 명시하고 동일한 조건으로 변경 사항을 공유해야 합니다.
Los Angeles의 RoboLynk LLC가 제작했습니다.
원문: https://www.instructables.com/Build-a-Talking-AI-Desk-Robot-You-Flash-From-a-Web/