Сборка робота Xiaozhi на ESP32-S3: гайд по железу и прошивке | 2026 | AiManual
AiManual Logo Ai / Manual.
13 Фев 2026 Гайд

Сборка робота Xiaozhi на ESP32-S3: полное руководство по железу, прошивке и настройке

Пошаговое руководство по сборке робота Xiaozhi на ESP32-S3 с OV2640, ST7789, INMP441. Установка ESP-IDF, настройка SPI, прошивка и отладка на 13.02.2026.

Зачем собирать 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-N16R816 МБ Flash, 8 МБ PSRAM850-1200
КамераOV2640 (не OV3660!)2 МП, DVP интерфейс350-500
ДисплейST7789 1.14" IPS240x135, SPI450-600
МикрофонINMP441I2S, 64 дБ SNR200-300
УсилительMAX98357AКласс D, I2S180-250
Драйвер моторовTB6612FNGДва канала по 1.2А150-200
МоторыN20 6V 200 RPMС энкодерами (обязательно!)2×400
💡
Не берите OV3660 вместо OV2640! Первый требует 3.3V для аналоговой части и 1.8V для цифровой, что усложняет схему питания. OV2640 работает от 3.3V и проще в подключении. Проверьте маркировку на камере при получении.

Пайка: где чаще всего ошибаются

Плата 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-контроллеров, но они имеют ограничения:

УстройствоИнтерфейсКонтроллерПины (пример)Частота
Дисплей ST7789SPI (4-проводной)SPI2 (HSPI)CLK=12, MOSI=11, CS=10, DC=940 МГц
SD-картаSPI (1-битный)SPI3 (VSPI)CLK=17, MOSI=16, MISO=18, CS=1520 МГц
INMP441 → MAX98357AI2SI2S0BCLK=47, WS=21, DO=14, DI=1344.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

Если изображение зеленое или полосатое:

  1. Проверьте питание камеры (3.3V). Падение ниже 3.2V = шум.
  2. Увеличьте длину проводов XCLK и PCLK? Уменьшите! Максимум 10 см.
  3. В menuconfig: Component config → Camera → Max buffer size установите 4096 вместо 2048.
  4. Попробуйте снизить частоту 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) заниматься тяжелой навигацией.
💡
ESP32-S3 поддерживает USB-OTG. Можно подключить его к более мощному одноплатнику (например, Radxa RK3588) и передавать видео по USB Video Class (UVC). Получаем камеру с компрессией MJPEG без нагрузки на CPU по Wi-Fi.

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). А даже если убьете - новая плата стоит как два обеда в столовой. Удачи в сборке!