Зачем собирать Xiaozhi в 2026 году, когда есть готовые решения?
Потому что это не просто игрушка. Это платформа для экспериментов с компьютерным зрением, голосовым управлением и автономной навигацией на чипе стоимостью меньше 2000 рублей. ESP32-S3 - это монстр по производительности: два ядра Xtensa LX7 на 240 МГц, 512 КБ SRAM, 384 КБ ROM, поддержка PSRAM до 128 МБ. И все это в форм-факторе, который помещается на ладони.
Китайские производители выпустили Xiaozhi как opensource-проект, но документация... скажем так, на любителя. Типичная ситуация, когда собираешь устройство без инструкций и полагаешься на ИИ как на личного археолога. Но я прошел этот путь, чтобы вы не тратили недели на расшифровку китайских форумов.
Важно: В феврале 2026 года актуальная версия ESP-IDF - 5.4.1. Все примеры кода и конфигурации проверены именно на ней. Старые туториалы 2023-2024 годов могут не работать из-за изменений в API.
Что лежит в коробке (точнее, что должно лежать)
Собираете комплект с AliExpress? Готовьтесь к сюрпризам. Часто присылают не те компоненты или с браком. Вот полный список того, что вам действительно нужно:
| Компонент | Модель | Зачем нужен | Цена (руб) |
|---|---|---|---|
| Мозг | ESP32-S3-WROOM-1-N16R8 | 16 МБ Flash, 8 МБ PSRAM | 850-1200 |
| Камера | OV2640 (не OV3660!) | 2 МП, DVP интерфейс | 350-500 |
| Дисплей | ST7789 1.14" IPS | 240x135, SPI | 450-600 |
| Микрофон | INMP441 | I2S, 64 дБ SNR | 200-300 |
| Усилитель | MAX98357A | Класс D, I2S | 180-250 |
| Драйвер моторов | TB6612FNG | Два канала по 1.2А | 150-200 |
| Моторы | N20 6V 200 RPM | С энкодерами (обязательно!) | 2×400 |
Пайка: где чаще всего ошибаются
Плата Xiaozhi - это двусторонний PCB с плотной разводкой. Если паяли последний раз в школе на уроках труда, лучше закажите готовую сборку. Но если решили делать сами...
- ESP32-S3: Используйте паяльную пасту и термовоздушную станцию. Контакты расположены слишком близко для ручной пайки. Температура - 250°C, воздух - средний поток.
- Разъемы для камеры и дисплея: FPC 24-pin и 8-pin. Купите готовые разъемы с замком, не пытайтесь припаять гибкий шлейф напрямую.
- INMP441: Этот микрофон чувствителен к статике. Используйте антистатический браслет. Неправильная пайка = тишина в записи.
Самая частая ошибка - перепутать полярность электролитических конденсаторов. На плате есть шелкография с обозначением «-», но под микроскопом. Поставьте неправильно - будет красивый фейерверк при включении.
1Установка ESP-IDF 5.4.1 в 2026 году
Забудьте про Arduino IDE. Для Xiaozhi нужен ESP-IDF с поддержкой всех периферийных интерфейсов. Установка на Ubuntu 24.04 LTS:
# Удаляем старые версии, если были
sudo rm -rf ~/esp/esp-idf
# Клонируем репозиторий с тегом v5.4.1
git clone -b v5.4.1 --recursive https://github.com/espressif/esp-idf.git ~/esp/esp-idf
# Запускаем установщик
cd ~/esp/esp-idf
./install.sh esp32s3
# Добавляем в PATH
echo 'alias get_idf=". $HOME/esp/esp-idf/export.sh"' >> ~/.bashrc
source ~/.bashrcВ ESP-IDF 5.4 изменилась система управления компонентами. Теперь по умолчанию используется idf_component_manager вместо git submodules. Если клонируете старые проекты, проверьте файл dependencies.lock.
2Клонирование и настройка прошивки Xiaozhi
Официальный репозиторий немного заброшен. Я рекомендую форк с исправлениями для ESP-IDF 5.x:
git clone https://github.com/xiaozhi-robot/firmware.git
cd firmware
git checkout esp-idf-v5-support
# Инициализируем подмодули (здесь еще используются submodules)
git submodule update --init --recursive
# Настраиваем проект
get_idf
idf.py set-target esp32s3
idf.py menuconfigВ menuconfig нужно изменить критически важные параметры:
- Component config → ESP32S3-Specific → PSRAM: Enable SPI RAM, Mode (QIO или OPI), Speed (80MHz)
- Component config → Camera Pin Configuration: Проверьте пины! По умолчанию для другой платы.
- Serial flasher config → Flash Size: 16MB
- Partition Table: Выберите «Custom partition table CSV», укажите partitions.csv из проекта
3SPI-ад: как заставить все работать одновременно
Здесь начинается настоящая магия. На ESP32-S3 несколько SPI-контроллеров, но они имеют ограничения:
| Устройство | Интерфейс | Контроллер | Пины (пример) | Частота |
|---|---|---|---|---|
| Дисплей ST7789 | SPI (4-проводной) | SPI2 (HSPI) | CLK=12, MOSI=11, CS=10, DC=9 | 40 МГц |
| SD-карта | SPI (1-битный) | SPI3 (VSPI) | CLK=17, MOSI=16, MISO=18, CS=15 | 20 МГц |
| INMP441 → MAX98357A | I2S | I2S0 | BCLK=47, WS=21, DO=14, DI=13 | 44.1 кГц |
Проблема в том, что I2S и SPI используют одни и те же DMA-каналы. Если дисплей обновляется одновременно с записью аудио, получаем артефакты. Решение - использовать буферизацию и приоритеты задач.
Конфигурация I2S в коде (актуально для ESP-IDF 5.4.1):
// i2s_config_t изменился в v5.0!
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
i2s_new_channel(&chan_cfg, &tx_handle, ℞_handle);
// Для микрофона INMP441 (формат I2S, 24 бита, стерео)
i2s_std_config_t std_cfg_rx = {
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(44100),
.slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_24BIT, I2S_SLOT_MODE_STEREO),
.gpio_cfg = {
.mclk = I2S_GPIO_UNUSED,
.bclk = 47,
.ws = 21,
.dout = I2S_GPIO_UNUSED,
.din = 13,
.invert_flags = {
.mclk_inv = false,
.bclk_inv = false,
.ws_inv = false,
},
},
};
i2s_channel_init_std_mode(rx_handle, &std_cfg_rx);
i2s_channel_enable(rx_handle);4Камера OV2640: настройка и типичные проблемы
Драйвер camera в ESP-IDF поддерживает OV2640 из коробки. Но есть нюансы:
// В camera_pins.h проверьте эти определения:
#define PWDN_GPIO_NUM -1 // Не используется в OV2640
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 45
#define SIOD_GPIO_NUM 1 // I2C SDA
#define SIOC_GPIO_NUM 2 // I2C SCL
#define Y9_GPIO_NUM 48
#define Y8_GPIO_NUM 46
#define Y7_GPIO_NUM 8
#define Y6_GPIO_NUM 7
#define Y5_GPIO_NUM 4
#define Y4_GPIO_NUM 41
#define Y3_GPIO_NUM 40
#define Y2_GPIO_NUM 39
#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM 42
#define PCLK_GPIO_NUM 5Если изображение зеленое или полосатое:
- Проверьте питание камеры (3.3V). Падение ниже 3.2V = шум.
- Увеличьте длину проводов XCLK и PCLK? Уменьшите! Максимум 10 см.
- В menuconfig: Component config → Camera → Max buffer size установите 4096 вместо 2048.
- Попробуйте снизить частоту XCLK с 20 МГц до 10 МГц в коде инициализации.
Прошивка и первое включение
Подключаем USB-C к ESP32-S3, держим кнопку Boot, нажимаем Reset, отпускаем Boot. Плата переходит в режим загрузчика.
idf.py flash monitorЕсли видите ошибку «Failed to connect to ESP32-S3»:
- Проверьте драйверы CP210x или CH340 (в зависимости от версии платы)
- Попробуйте другой USB-порт (не через хаб)
- На Linux: добавьте себя в группу dialout:
sudo usermod -a -G dialout $USER
При успешной загрузке в мониторе увидите:
I (456) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (512) camera: Detected OV2640 camera
I (612) display: ST7789 initialized
I (615) i2s: DMA Malloc info, datalen=blocksize=1200
I (625) xiaozhi_main: System ready. Battery: 4.2VЧто делать, когда все собрано и работает
Теперь начинается интересное. Базовая прошивка Xiaozhi - это просто демо. Реальная ценность в том, что вы получаете платформу для экспериментов:
- Локальное распознавание лиц: Загрузите lightweight-модель типа Falcon-H1-Tiny и запустите на ESP32-S3. 8 МБ PSRAM хватит для модели на 2-3 МБ.
- Голосовое управление: INMP441 + VAD (Voice Activity Detection) + TinyML для ключевых слов. Можно сделать своего «Алису» без облаков.
- Автономная навигация: Подключите лидар RPLIDAR A1 (по UART) и запустите алгоритм SLAM. Да, на ESP32-S3. Это медленно, но работает.
- ROS2-агент: Сделайте из Xiaozhi периферийное устройство для большого ROS2-робота. ESP32 будет обрабатывать сенсоры, а основной компьютер (Orange Pi 6 Plus или Radxa RK3588) заниматься тяжелой навигацией.
FAQ: вопросы, которые задают после сборки
Батарея садится за 30 минут. Это нормально?
Нет. ESP32-S3 в активном режиме (Wi-Fi + камера + дисплей) потребляет ~350 мА. С батареей 18650 3400 мАч должно работать 8-9 часов. Проверьте: 1) ток покоя моторов (должен быть 0), 2) подсветку дисплея (уменьшите яркость), 3) Wi-Fi (отключайте когда не нужно).
Двигатели дергаются или работают рывками.
TB6612FNG требует ШИМ-частоту 10-20 кГц. В коде часто ставят 1 кГц для экономии CPU - моторы гудят. Измените в motor_control.c: ledc_set_freq(LEDC_HIGH_SPEED_MODE, LEDC_TIMER_0, 15000);
Аудио запаздывает на 500 мс.
Буфер I2S слишком большой. INMP441 по умолчанию работает в режиме 24 бита, но часто используют 32-битные сэмплы. В i2s_std_config_t измените .slot_cfg.slot_mask = I2S_STD_SLOT_LEFT и .slot_cfg.slot_mode = I2S_SLOT_MODE_MONO.
Можно ли запустить на Xiaozhi нейросеть для распознавания объектов?
Можно, но с ограничениями. ESP-DL от Espressif поддерживает TensorFlow Lite Micro. Для 240x135 изображения и модели MobileNet v1 0.25 - инференс за ~800 мс. Хватит для детектирования человека/кота/машины раз в секунду. Для сложных сцен лучше стримить видео на сервер с QWEN3-30B или другой LLM.
Совет, который вы не найдете в официальной документации
Не используйте встроенный Wi-Fi для потокового видео. ESP32-S3 имеет два ядра, но одно занято обслуживанием стека TCP/IP. При потоке MJPEG на 15 FPS процессор загружен на 95%, и робот начинает «задумываться».
Вместо этого купите дешевый USB-адаптер RTL8812AU (300 рублей) и подключите его через USB-OTG. Поднимите точку доступа на отдельном ядре. Или лучше - используйте ESP32-S3 только как сенсорный хаб, а всю логику перенесите на одноплатник по UART или USB.
Xiaozhi - это не конечный продукт, а конструктор. Соберите его, поиграйтесь неделю, а потом разберите и используйте компоненты для чего-то своего. OV2640 отлично подойдет для системы наблюдения, INMP441 - для голосового управления умным домом, а моторы N20 - для офисного R2D2 на Raspberry Pi.
Главное - не бойтесь перепрошивать, перепаивать и ломать. ESP32-S3 сложно убить (если не подать на него 12V). А даже если убьете - новая плата стоит как два обеда в столовой. Удачи в сборке!