配置开发环境

pass

获取源码

从官方下载最新的代码, 并用vscode 打开

git clone https://github.com/78/xiaozhi-esp32.git
cd xiaozhi-esp32/
code .

修改芯片型号为esp32s3及对应的硬件串口号

创建新的Board

  1. 在"main/board"下创建文件夹"esp32-s3-eye"
  2. 在"esp32-s3-eye"下分别建议以下3个文件"config.h" "confg.json" "esp32-s3-eye.cc"

配置config.h

  1. 宏定义GPIO引脚及相关配置参数
  2. 引脚信息参考ESP32-S3-EYE的原理图
    1. ESP32-S3-EYE-MB v2.2 主板原理图 (PDF)
    2. ESP32-S3-EYE-SUB 子板原理图 (PDF)
  3. ESP32-S3-EYE并没有扬声器,先把引脚配置到TF卡上(补充说明)
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_

#include <driver/gpio.h>

#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. 以下是修改完的代码
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. 修正后的代码如下
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,代码如下
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的配置

{
    "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, 并配置为默认的开发板

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加入两行代码

# 根据 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/hallym/xiaozhi-for-esp32-s3-eye

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐