# xiaozhi for esp32-s3-eye **Repository Path**: hallym/xiaozhi-for-esp32-s3-eye ## Basic Information - **Project Name**: xiaozhi for esp32-s3-eye - **Description**: 移植小智到ESP32-S3-EYE - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-19 - **Last Updated**: 2025-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 移植小智到ESP32-S3-EYE ![](./doc/00.png) ## 配置开发环境 pass ## 获取源码 从官方下载最新的代码, 并用vscode 打开 ```bash git clone https://github.com/78/xiaozhi-esp32.git cd xiaozhi-esp32/ code . ``` 修改芯片型号为esp32s3及对应的硬件串口号 ![](./doc/01.png) ## 创建新的Board 1. 在"main/board"下创建文件夹"esp32-s3-eye" 2. 在"esp32-s3-eye"下分别建议以下3个文件"config.h" "confg.json" "esp32-s3-eye.cc" ![](./doc/02.png) ### 配置config.h 1. 宏定义GPIO引脚及相关配置参数 2. 引脚信息参考ESP32-S3-EYE的原理图 1. [ESP32-S3-EYE-MB v2.2 主板原理图](https://dl.espressif.com/dl/schematics/SCH_ESP32-S3-EYE-MB_20211201_V2.2.pdf) (PDF) 2. [ESP32-S3-EYE-SUB 子板原理图](https://dl.espressif.com/dl/schematics/SCH_ESP32-S3-EYE_SUB_V1.1_20210913.pdf) (PDF) 3. ESP32-S3-EYE并没有扬声器,先把引脚配置到TF卡上([补充说明](#解决没有音频输出问题)) ```c++ #ifndef _BOARD_CONFIG_H_ #define _BOARD_CONFIG_H_ #include #define AUDIO_INPUT_SAMPLE_RATE 16000 #define AUDIO_OUTPUT_SAMPLE_RATE 16000 // audio io #define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_42 #define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_41 #define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_2 #define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_40 #define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_39 #define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_38 // Buttons #define BUILTIN_LED_GPIO GPIO_NUM_3 #define BOOT_BUTTON_GPIO GPIO_NUM_0 // Display #define DISPLAY_BACKLIGHT_PIN GPIO_NUM_48 #define DISPLAY_MOSI_PIN GPIO_NUM_47 #define DISPLAY_CLK_PIN GPIO_NUM_21 #define DISPLAY_DC_PIN GPIO_NUM_43 #define DISPLAY_RST_PIN GPIO_NUM_NC #define DISPLAY_CS_PIN GPIO_NUM_44 #define LCD_TYPE_ST7789_SERIAL #define DISPLAY_WIDTH 240 #define DISPLAY_HEIGHT 240 #define DISPLAY_MIRROR_X false #define DISPLAY_MIRROR_Y false #define DISPLAY_SWAP_XY false #define DISPLAY_INVERT_COLOR true #define DISPLAY_RGB_ORDER LCD_RGB_ELEMENT_ORDER_RGB #define DISPLAY_OFFSET_X 0 #define DISPLAY_OFFSET_Y 0 #define DISPLAY_BACKLIGHT_OUTPUT_INVERT false #define DISPLAY_SPI_MODE 0 // Camera #define CAMERA_PIN_D0 GPIO_NUM_11 #define CAMERA_PIN_D1 GPIO_NUM_9 #define CAMERA_PIN_D2 GPIO_NUM_8 #define CAMERA_PIN_D3 GPIO_NUM_10 #define CAMERA_PIN_D4 GPIO_NUM_12 #define CAMERA_PIN_D5 GPIO_NUM_18 #define CAMERA_PIN_D6 GPIO_NUM_17 #define CAMERA_PIN_D7 GPIO_NUM_16 #define CAMERA_PIN_XCLK GPIO_NUM_15 #define CAMERA_PIN_PCLK GPIO_NUM_13 #define CAMERA_PIN_VSYNC GPIO_NUM_6 #define CAMERA_PIN_HREF GPIO_NUM_7 #define CAMERA_PIN_SIOC GPIO_NUM_5 #define CAMERA_PIN_SIOD GPIO_NUM_4 #define CAMERA_PIN_PWDN GPIO_NUM_NC #define CAMERA_PIN_RESET GPIO_NUM_NC #define XCLK_FREQ_HZ 20000000 #endif // _BOARD_CONFIG_H_ ``` ### 移植Board代码 1. 大部分代码可以参考"compact_wifi_s3_cam.cc" 2. 只针对需注意的地方说明 #### 显示屏部分 1. 通过一些外部参考资料得到ESP32-S3-EYE的显示屏驱动芯片为ST7789 2. 因为只针对该开发板移植,直接删除了没有必要的条件编译 3. 以下是修改完的代码 ```c++ void InitializeLcdDisplay() { esp_lcd_panel_io_handle_t panel_io = nullptr; esp_lcd_panel_handle_t panel = nullptr; // 液晶屏控制IO初始化 ESP_LOGD(TAG, "Install panel IO"); esp_lcd_panel_io_spi_config_t io_config = {}; io_config.cs_gpio_num = DISPLAY_CS_PIN; io_config.dc_gpio_num = DISPLAY_DC_PIN; io_config.spi_mode = DISPLAY_SPI_MODE; io_config.pclk_hz = 40 * 1000 * 1000; io_config.trans_queue_depth = 10; io_config.lcd_cmd_bits = 8; io_config.lcd_param_bits = 8; ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &panel_io)); // 初始化液晶屏驱动芯片 ESP_LOGD(TAG, "Install LCD driver"); esp_lcd_panel_dev_config_t panel_config = {}; panel_config.reset_gpio_num = DISPLAY_RST_PIN; panel_config.rgb_ele_order = DISPLAY_RGB_ORDER; panel_config.bits_per_pixel = 16; ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); esp_lcd_panel_reset(panel); esp_lcd_panel_init(panel); esp_lcd_panel_invert_color(panel, DISPLAY_INVERT_COLOR); esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); display_ = new SpiLcdDisplay(panel_io, panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, { .text_font = &font_puhui_16_4, .icon_font = &font_awesome_16_4, .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), }); } ``` #### 相机部分 1. 经过测试相机拍到的照片是上下番转的, 增加了一行代码"camera_->SetVFlip(true);" 2. 修正后的代码如下 ```c++ void InitializeCamera() { camera_config_t config = {}; config.pin_d0 = CAMERA_PIN_D0; config.pin_d1 = CAMERA_PIN_D1; config.pin_d2 = CAMERA_PIN_D2; config.pin_d3 = CAMERA_PIN_D3; config.pin_d4 = CAMERA_PIN_D4; config.pin_d5 = CAMERA_PIN_D5; config.pin_d6 = CAMERA_PIN_D6; config.pin_d7 = CAMERA_PIN_D7; config.pin_xclk = CAMERA_PIN_XCLK; config.pin_pclk = CAMERA_PIN_PCLK; config.pin_vsync = CAMERA_PIN_VSYNC; config.pin_href = CAMERA_PIN_HREF; config.pin_sccb_sda = CAMERA_PIN_SIOD; config.pin_sccb_scl = CAMERA_PIN_SIOC; config.sccb_i2c_port = 0; config.pin_pwdn = CAMERA_PIN_PWDN; config.pin_reset = CAMERA_PIN_RESET; config.xclk_freq_hz = XCLK_FREQ_HZ; config.pixel_format = PIXFORMAT_RGB565; config.frame_size = FRAMESIZE_QVGA; config.jpeg_quality = 32; config.fb_count = 1; config.fb_location = CAMERA_FB_IN_PSRAM; config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; camera_ = new Esp32Camera(config); camera_->SetHMirror(false); camera_->SetVFlip(true); } ``` #### LED部分 1. 该开发板没有单总线全彩LED, 仅有一颗绿色LED; 2. 两种方案 1. 直接删除LED部分代码, 应用层代码直接使用父类里返回的的NoLed指针; 2. 改用SingleLed类实例化板载LED,代码如下 ```c++ virtual Led* GetLed() override { static GpioLed led(BUILTIN_LED_GPIO, false, LEDC_TIMER_1, LEDC_CHANNEL_1); return &led; } ``` 经测试,不能能使用LEDC的默认配置, 因为显示屏使用的LEDC_CHANNEL_0, 使用默认配置会导致背光闪烁. #### 电量检测 不用尝试开启14引脚的ADC功能, 它位于ADC2_CH3, 与Wifi功能冲突. ### 配置config.json 因为ESP32-S3-EYE开发板的Flash配置是8M, 在config中更改flash的配置 ```json { "target": "esp32s3", "builds": [ { "name": "esp32-s3-eye", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"", "CONFIG_USE_ESP_WAKE_WORD=y" ] } ] } ``` 以上配置在编译时并不能生效, 使用 “python3 scripts/release.py esp32-s3-eye"发布时可用. 如果执行过一次上述指令,再没有清除前重新编译时依然有效. ## 修改编译选项 修改Kconfig.projbuild增加BOARD_TYPE, 并配置为默认的开发板 ```bash choice BOARD_TYPE prompt "Board Type" default BOARD_TYPE_ESP32_S3_EYE help Board type. 开发板类型 config BOARD_TYPE_ESP32_S3_EYE bool "ESP32-S3-EYE 开发板" depends on IDF_TARGET_ESP32S3 config BOARD_TYPE_BREAD_COMPACT_WIFI bool "面包板新版接线(WiFi)" depends on IDF_TARGET_ESP32S3 ... ``` 修改CMakeLists.txt加入两行代码 ```cmake # 根据 BOARD_TYPE 配置添加对应的板级文件 if(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI) set(BOARD_TYPE "bread-compact-wifi") elseif(CONFIG_BOARD_TYPE_ESP32_S3_EYE) set(BOARD_TYPE "esp32-s3-eye") elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ML307) set(BOARD_TYPE "bread-compact-ml307") ... ``` ## 解决没有音频输出问题 自制的音频模块,从TF卡接口引出 工程文件及可用于制作的Gerber文件[下载](https://gitee.com/pcboard/hlc0004)(立创可以白嫖镀金板) ![](./doc/03.png)