移植小智到ESP32-S3-EYE
本文介绍了ESP32-S3-EYE开发板的配置过程。主要内容包括:1)创建开发板配置文件,定义GPIO引脚、音频采样率等参数;2)移植显示屏驱动,针对ST7789芯片进行初始化;3)修正相机上下翻转问题;4)LED配置方案;5)修改编译选项和分区表以适配8MB Flash;6)解决音频输出问题,提供自制音频模块方案。开发过程中参考了ESP32-S3-EYE原理图,并对显示、相机等模块进行了针对性适
·

配置开发环境
pass
获取源码
从官方下载最新的代码, 并用vscode 打开
git clone https://github.com/78/xiaozhi-esp32.git
cd xiaozhi-esp32/
code .
修改芯片型号为esp32s3及对应的硬件串口号
![]()
创建新的Board
- 在"main/board"下创建文件夹"esp32-s3-eye"
- 在"esp32-s3-eye"下分别建议以下3个文件"config.h" "confg.json" "esp32-s3-eye.cc"

配置config.h
- 宏定义GPIO引脚及相关配置参数
- 引脚信息参考ESP32-S3-EYE的原理图
- ESP32-S3-EYE-MB v2.2 主板原理图 (PDF)
- ESP32-S3-EYE-SUB 子板原理图 (PDF)
- 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代码
- 大部分代码可以参考"compact_wifi_s3_cam.cc"
- 只针对需注意的地方说明
显示屏部分
- 通过一些外部参考资料得到ESP32-S3-EYE的显示屏驱动芯片为ST7789
- 因为只针对该开发板移植,直接删除了没有必要的条件编译
- 以下是修改完的代码
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(),
});
}
相机部分
- 经过测试相机拍到的照片是上下番转的, 增加了一行代码"camera_->SetVFlip(true);"
- 修正后的代码如下
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部分
- 该开发板没有单总线全彩LED, 仅有一颗绿色LED;
- 两种方案
- 直接删除LED部分代码, 应用层代码直接使用父类里返回的的NoLed指针;
- 改用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文件下载(立创可以白嫖镀金板)

完整源码地址
更多推荐



所有评论(0)