Самодельная колонка для голосового ИИ-дворецкого «Себастьян» (локальный ИИ на домашнем сервере). Внутри две платы ESP32, дисплей с тачем, стерео-динамики, микрофон, Bluetooth-колонка, AUX-выход, ARGB-подсветка и радио 433 МГц.
Статус: стенд собран, все узлы проверены (кроме переключателя источника звука 74HC4053 — ещё не пришёл). Сейчас на платах стоит тестовая прошивка с экранами для проверки всего железа. Голосовой контур (прошивка XiaoZhi / связь с сервером Себастьяна) — следующий этап.
┌──────────────── UART 115200 (TX/RX накрест + GND) ───────────────┐
│ │
┌────────────┴─────────────┐ ┌──────────────┴───────────┐
│ ESP32-S3-N16R8 «ГОЛОВА» │ │ ESP32 «СО-ПРОЦЕССОР» │
│ дисплей 2.4" + тач │ │ Bluetooth-колонка (A2DP)│
│ SD-карта (MP3) │ │ AUX: PCM5102A │
│ 2× MAX98357A (стерео) │ │ ARGB-лента │
│ микрофон INMP441 │ │ радио 433 (RX + TX) │
│ Wi-Fi: часы, OTA │ │ 3 сенсорные кнопки │
│ детект штекера AUX │ │ кнопка микрофона │
└──────────────────────────┘ │ замер батареи │
└──────────────────────────┘
- Голова (S3) — голосовой контур: экран, звук в динамики, микрофон, Wi-Fi. Главная плата.
- Со-процессор (обычная ESP32) — всё остальное: Bluetooth-звук (S3 так не умеет — у него нет Bluetooth Classic), радио, свет, кнопки, батарея.
- Платы общаются текстовыми командами по UART.
UPS-модуль HW-465 (2×18650 параллельно, зарядка USB-C, повышайка 5 В 3 А, авто-переход на батарею при отключении USB) → тумблер → общий рельс 5 В на обе ESP, усилители, PCM, ленту, радио. Земля общая.
| Папка | Плата | Что |
|---|---|---|
S3/ |
ESP32-S3-N16R8 (голова) | PlatformIO-проект головы |
ESP32/ |
ESP32 D0WD-V3 (со-процессор) | PlatformIO-проект со-процессора |
В каждом проекте:
src/main.cpp— прошивкаsrc/secrets.h— Wi-Fi и пароль OTA (не в git, шаблон:src/secrets.example.h)secrets.ini— пароль OTA для заливки по Wi-Fi (не в git)platformio.ini— окружения: обычное (по кабелю) и*_ota(по Wi-Fi)
- Скопируй
src/secrets.example.h→src/secrets.h, впиши Wi-Fi и пароль OTA. - Создай
secrets.ini:[env:esp32s3_ota] ; у со-процессора: [env:esp32_ota] upload_flags = --auth=ПАРОЛЬ_OTA
- В VS Code внизу выбери
env:esp32s3(голова) илиenv:esp32(со-процессор) → Upload.
- Голова: Wi-Fi и OTA включаются сами при старте. Выбери
env:esp32s3_ota→ Upload. IP головы — на экране (HOME / SYSTEM), вписан вupload_port. - Со-процессор: на экране головы страница SYSTEM → COPROC OTA (лента станет фиолетовой, Bluetooth выключится). Дождись
COPROC OTA: ZHDU <IP>→env:esp32_ota→ Upload. Есть 5 минут, потом плата сама вернётся в обычный режим. - Windows при первой заливке спросит разрешение для Python в брандмауэре — разрешить, иначе
No response from the ESP.
Листать кнопками < и > внизу.
| Экран | Что показывает | Кнопки |
|---|---|---|
| HOME | часы (NTP, МСК), дата, Wi-Fi, батарея %, BT, связь плат, аудио | VOL−, PLAY/STOP, VOL+ |
| AUDIO | SD, громкость, мьюты, штекер AUX, уровень микрофона | PLAY, MIC TEST, VOL±, SPK MUTE, AUX MUTE, AUX MUSIC, L/R TEST |
| SENSORS | связь в обе стороны, батарея, BT, сенсоры T1/T2/T3/MIC (круги) | LED NEXT, BEEP |
| RADIO | пульт 433: коды 1–21 + HOLD, что поймал приёмник | 22 кнопки |
| SYSTEM | Wi-Fi, IP, OTA, память, аптайм, причина перезагрузки | COPROC OTA, REBOOT HEAD |
Сенсорные кнопки на корпусе: 1 — тише, 2 — play/stop, 3 — громче.
| Узел | Пины |
|---|---|
| Дисплей ST7789 240×320 + тач XPT2046 (общая SPI) | SCK 12, MOSI 11, MISO 13, LCD_CS 10, DC 9, RST 14, BL 21, TOUCH_CS 16, T_IRQ 17 |
| SD-карта (своя SPI) | SCK 6, MOSI 7, MISO 15, CS 5 |
| I2S → 2× MAX98357A (+ PCM5102A позже через 74HC4053) | BCLK 40, LRC 41, DIN 42 |
| Мьют динамиков (2× BC547) | 2 (LOW = играют) |
| Мьют AUX (PCM5102A XSMT) | 39 (HIGH = играет) |
| Детект штекера AUX | 3 (через 10 кОм, HIGH = вставлен) |
| Микрофон INMP441 (I2S0) | SCK 47, WS 48, SD 38, L/R → GND |
| UART к со-процессору | TX 8, RX 18 |
| Монитор (USB-UART) | 43/44 — не трогать |
Нельзя: 35–37 (заняты PSRAM), 0 (BOOT), 19/20 (USB), 45/46 (strapping). Свободны: 1, 4.
| Узел | Пины |
|---|---|
| I2S → PCM5102A (AUX) | BCK 26, LCK 25, DIN 22 |
| Выбор источника 74HC4053 (когда будет) | 21 (LOW = S3) |
| ARGB-лента (4 диода) | 32 → 470 Ом → Din |
| Сенсоры TTP223 | 36 (T1), 35 (T2), 34 (T3) |
| Кнопка микрофона | 4 (pull-up) |
| Замер батареи | 33 (делитель 10к/10к от B+) |
| Радио 433 | RX 27 (через делитель 10к/20к), TX 13 |
| UART к голове | RX2 16, TX2 17 |
Нельзя: 12 (не даст загрузиться), 0/2 (strapping), 1/3 (USB). Свободны: 14, 18, 19, 23, 39 (только вход).
| Направление | Строка | Смысл |
|---|---|---|
| S3 → ESP | PING n |
проверка связи (ответ P,n) |
| S3 → ESP | BEEP / MUSIC / LED |
мелодия в AUX / тестовая музыка вкл-выкл / режим ленты |
| S3 → ESP | RF n / RFHOLD |
отправить радиокод n (1–21) / код 1 три раза |
| S3 → ESP | OTA |
режим прошивки по Wi-Fi |
| ESP → S3 | S,t1,t2,t3,mic,bat_mV,uptime,bt,music |
статус 5 раз в секунду |
| ESP → S3 | T,n |
нажат сенсор n |
| ESP → S3 | R,n,code / L,n,code / U,code |
пойман триггер / код подсветки / чужой код |
| ESP → S3 | X,n,code |
радиокод отправлен |
| ESP → S3 | W,state,pct,ip |
статус OTA со-процессора |
- MAX98357A (клоны): SD подтянут к VIN через ~4 кОм. Левый канал — ничего не нужно. Правый — 1 кОм с SD на GND (≈1 В). Проверка: AUDIO → L/R TEST (левый 3 стука, правый 2).
- PCM5102A: перемычки снизу H1, H2, H4 — середина на L (GND), иначе шум. SCK → GND. H3 = XSMT.
- GPIO37 на S3 N16R8 занят PSRAM — микрофон на нём вешал плату (WDT).
- Флеш 16 МБ: в
platformio.iniнуженboard_upload.flash_size = 16MB, иначе загрузчик крутится в перезагрузках. - Со-процессор: разметка
min_spiffs.csv(2 слота под OTA),huge_app.csvOTA не умеет. - Bluetooth и Wi-Fi на обычной ESP32 мешают друг другу — поэтому OTA со-процессора отдельным режимом.
- Радио HOLD = код 1 три раза подряд (длинная пачка не срабатывает).
- ARGB работает напрямую от 3.3 В через 470 Ом, 10 кОм — слишком много.
- 74HC4053 — переключение источника звука (S3 ↔ Bluetooth) на усилители и AUX
- Замена сдохшего MAX98357A
- Сборка питания от UPS-модуля, замер батареи
- Корпус
- Голосовой контур: XiaoZhi на S3 ↔ сервер Себастьяна