From 958517b9314d6686fbf247fd74dc7cb31f63e7f3 Mon Sep 17 00:00:00 2001 From: EMORobots <512580942@qq.com> Date: Thu, 16 Jan 2025 15:09:37 +0800 Subject: [PATCH] Add esp sparkbot support (#70) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * audio interrupt * support esp launchpad online download * Update config.toml config url * Update README.md 新窗口打开 * Update config.toml * Update config.toml * Update config.toml * Update README.md * Update config.toml * Update config.toml * Update config.toml * fix config file and bin name error fix config file and bin name error * add Esp Launchpad in readme * Update config.toml * update readme * fit all board online download * Update config.toml firmware url to releases * Update README.md * Update README_en.md * Revert "Update config.toml" This reverts commit 1fe349d5b407fb33033490308372bdfcb621e5d7. * Revert "Update README.md" This reverts commit 8fc7dc8e68a47f0318c154eafd3b1d36c6f4f1f7. * Revert "Update README_en.md" This reverts commit 346ab09b90dafdaa6112bca50d8925634a87b052. * 增加esp SparkBot * sparkbot work ok * Update config.h * delete esp launchpad * Update application.cc * esp-sparkbot picture * Resolve display io and PA io conflicts on Esp Sparkbot board * Update CMakeLists.txt Keep the board type consistent with the folder name. --------- Co-authored-by: Xiaoxia --- docs/esp-sparkbot.jpg | Bin 0 -> 36275 bytes main/CMakeLists.txt | 4 +- main/Kconfig.projbuild | 2 + main/boards/esp-sparkbot/config.h | 47 ++++++ .../boards/esp-sparkbot/esp_sparkbot_board.cc | 144 ++++++++++++++++++ 5 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 docs/esp-sparkbot.jpg create mode 100644 main/boards/esp-sparkbot/config.h create mode 100644 main/boards/esp-sparkbot/esp_sparkbot_board.cc diff --git a/docs/esp-sparkbot.jpg b/docs/esp-sparkbot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7388403b003e3b921c19e0982d359c61cb5da71 GIT binary patch literal 36275 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 literal 0 HcmV?d00001 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 00b374bc..0c584db4 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -53,7 +53,7 @@ elseif(CONFIG_BOARD_TYPE_KEVIN_C3) set(BOARD_TYPE "kevin-c3") elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV) set(BOARD_TYPE "lichuang-dev") - elseif(CONFIG_BOARD_TYPE_LICHUANG_C3_DEV) +elseif(CONFIG_BOARD_TYPE_LICHUANG_C3_DEV) set(BOARD_TYPE "lichuang-c3-dev") elseif(CONFIG_BOARD_TYPE_MAGICLICK_2P4) set(BOARD_TYPE "magiclick-2p4") @@ -65,6 +65,8 @@ elseif(CONFIG_BOARD_TYPE_XMINI_C3) set(BOARD_TYPE "xmini-c3") elseif(CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3) set(BOARD_TYPE "esp32s3-korvo2-v3") +elseif(CONFIG_BOARD_TYPE_ESP_SPARKBOT) + set(BOARD_TYPE "esp-sparkbot") elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8) set(BOARD_TYPE "esp32-s3-touch-amoled-1.8") endif() diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index cba88f48..5ab1e8ba 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -62,6 +62,8 @@ choice BOARD_TYPE bool "虾哥 Mini C3" config BOARD_TYPE_ESP32S3_KORVO2_V3 bool "ESP32S3_KORVO2_V3开发板" + config BOARD_TYPE_ESP_SPARKBOT + bool "ESP-SparkBot开发板" config BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8 bool "Waveshare ESP32-S3-Touch-AMOLED-1.8" endchoice diff --git a/main/boards/esp-sparkbot/config.h b/main/boards/esp-sparkbot/config.h new file mode 100644 index 00000000..fa9cd3d2 --- /dev/null +++ b/main/boards/esp-sparkbot/config.h @@ -0,0 +1,47 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 16000 +#define AUDIO_OUTPUT_SAMPLE_RATE 16000 +#define AUDIO_DEFAULT_OUTPUT_VOLUME 80 + +#define AUDIO_INPUT_REFERENCE false + +#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_45 +#define AUDIO_I2S_GPIO_WS GPIO_NUM_41 +#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_39 +#define AUDIO_I2S_GPIO_DIN GPIO_NUM_40 +#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_42 + +#define AUDIO_CODEC_PA_PIN GPIO_NUM_46 +#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_4 +#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_5 +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR + +#define BUILTIN_LED_GPIO GPIO_NUM_NC +#define BOOT_BUTTON_GPIO GPIO_NUM_0 +#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_NC +#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_NC + +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 240 +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y true +#define DISPLAY_SWAP_XY false + +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 + +#define DISPLAY_DC_GPIO GPIO_NUM_43 +#define DISPLAY_CS_GPIO GPIO_NUM_44 +#define DISPLAY_CLK_GPIO GPIO_NUM_21 +#define DISPLAY_MOSI_GPIO GPIO_NUM_47 +#define DISPLAY_RST_GPIO GPIO_NUM_NC + +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_46 +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false + + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/esp-sparkbot/esp_sparkbot_board.cc b/main/boards/esp-sparkbot/esp_sparkbot_board.cc new file mode 100644 index 00000000..e225bf7c --- /dev/null +++ b/main/boards/esp-sparkbot/esp_sparkbot_board.cc @@ -0,0 +1,144 @@ +#include "wifi_board.h" +#include "audio_codecs/es8311_audio_codec.h" +#include "display/lcd_display.h" +#include "font_awesome_symbols.h" +#include "application.h" +#include "button.h" +#include "config.h" +#include "iot/thing_manager.h" + +#include +#include +#include +#include +#include + +#define TAG "esp_sparkbot" + +class SparkBotEs8311AudioCodec : public Es8311AudioCodec { +private: + +public: + SparkBotEs8311AudioCodec(void* i2c_master_handle, i2c_port_t i2c_port, int input_sample_rate, int output_sample_rate, + gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din, + gpio_num_t pa_pin, uint8_t es8311_addr, bool use_mclk = true) + : Es8311AudioCodec(i2c_master_handle, i2c_port, input_sample_rate, output_sample_rate, + mclk, bclk, ws, dout, din,pa_pin, es8311_addr, use_mclk = true) {} + + void EnableOutput(bool enable) override { + if (enable == output_enabled_) { + return; + } + if (enable) { + Es8311AudioCodec::EnableOutput(enable); + } else { + // Nothing todo because the display io and PA io conflict + } + } +}; + +class EspSparkBot : public WifiBoard { +private: + i2c_master_bus_handle_t i2c_bus_; + Button boot_button_; + Display* display_; + + void InitializeI2c() { + // Initialize I2C peripheral + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = I2C_NUM_0, + .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN, + .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + .intr_priority = 0, + .trans_queue_depth = 0, + .flags = { + .enable_internal_pullup = 1, + }, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_bus_)); + } + + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.mosi_io_num = DISPLAY_MOSI_GPIO; + buscfg.miso_io_num = GPIO_NUM_NC; + buscfg.sclk_io_num = DISPLAY_CLK_GPIO; + buscfg.quadwp_io_num = GPIO_NUM_NC; + buscfg.quadhd_io_num = GPIO_NUM_NC; + buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); + ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { + ResetWifiConfiguration(); + } + app.ToggleChatState(); + }); + } + + void InitializeDisplay() { + 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_GPIO; + io_config.dc_gpio_num = DISPLAY_DC_GPIO; + io_config.spi_mode = 0; + 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 = GPIO_NUM_NC; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + 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, false); + esp_lcd_panel_disp_on_off(panel, true); + display_ = new LcdDisplay(panel_io, panel, DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT, + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + } + + // 物联网初始化,添加对 AI 可见设备 + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + } + +public: + EspSparkBot() : boot_button_(BOOT_BUTTON_GPIO) { + InitializeI2c(); + InitializeSpi(); + InitializeDisplay(); + InitializeButtons(); + InitializeIot(); + } + + virtual AudioCodec* GetAudioCodec() override { + static SparkBotEs8311AudioCodec audio_codec(i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR); + return &audio_codec; + } + + virtual Display* GetDisplay() override { + return display_; + } +}; + +DECLARE_BOARD(EspSparkBot);