From e486d8e91e45254119263a4c673173dfbe2d46be Mon Sep 17 00:00:00 2001 From: MOV <15621173+MoveCall@users.noreply.github.com> Date: Wed, 26 Mar 2025 02:20:30 +0800 Subject: [PATCH] Add feature cuican (#407) * fix:Modify the README and add Moji images * fix: Moji LCD initialization configuration. * fix: DISPLAY_MIRROR_X false >> true * fix: Moji GPIO conflict * fix: Moji GPIO conflict * add-feature-cuican * update cuican image * update config.h --- README.md | 4 + README_en.md | 4 + README_ja.md | 4 + docs/v1/movecall-cuican-esp32s3.jpg | Bin 0 -> 50781 bytes main/CMakeLists.txt | 2 + main/Kconfig.projbuild | 2 + main/boards/movecall-cuican-esp32s3/README.md | 44 ++++++ main/boards/movecall-cuican-esp32s3/config.h | 45 ++++++ .../movecall-cuican-esp32s3/config.json | 9 ++ .../movecall_cuican_esp32s3.cc | 140 ++++++++++++++++++ 10 files changed, 254 insertions(+) create mode 100755 docs/v1/movecall-cuican-esp32s3.jpg create mode 100644 main/boards/movecall-cuican-esp32s3/README.md create mode 100644 main/boards/movecall-cuican-esp32s3/config.h create mode 100644 main/boards/movecall-cuican-esp32s3/config.json create mode 100644 main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc diff --git a/README.md b/README.md index 0045eef2..a66ac1c6 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ - LILYGO T-Circle-S3 - 虾哥 Mini C3 - Moji 小智AI衍生版 +- 璀璨·AI吊坠 - 无名科技Nologo-星智-1.54TFT - 无名科技Nologo-星智-0.96TFT - SenseCAP Watcher @@ -91,6 +92,9 @@ + + + diff --git a/README_en.md b/README_en.md index 378f696c..ad5f80e4 100644 --- a/README_en.md +++ b/README_en.md @@ -60,6 +60,7 @@ Breadboard demonstration: - LILYGO T-Circle-S3 - XiaGe Mini C3 - Moji XiaoZhi AI Derivative Version +- CuiCan AI pendant - SenseCAP Watcher
@@ -93,6 +94,9 @@ Breadboard demonstration: + + + diff --git a/README_ja.md b/README_ja.md index f8c3b327..b190a541 100644 --- a/README_ja.md +++ b/README_ja.md @@ -60,6 +60,7 @@ Feishu ドキュメントチュートリアルをご覧ください: - LILYGO T-Circle-S3 - XiaGe Mini C3 - Moji シャオジー AI 派生版 +- Cuican AI ペンダント - SenseCAP Watcher
@@ -90,6 +91,9 @@ Feishu ドキュメントチュートリアルをご覧ください: + + + diff --git a/docs/v1/movecall-cuican-esp32s3.jpg b/docs/v1/movecall-cuican-esp32s3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ae70cfdc180793239d4cc3bf991d726c54dfa25e GIT binary patch literal 50781 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ⅆz`tluT|)DnsyJ-^0X%-a<_O_Sy#XBHj$R{$X>C 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≪KCOI&^-Y$iSx#^ZqTZaD;~2$0c)%nm#UCe8 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 Flash size -> 8 MB +``` + +### 分区表配置: + +``` +Partition Table -> Custom partition CSV file -> partitions_8M.csv +``` + +### 开发板选择: + +``` +Xiaozhi Assistant -> Board Type -> Movecall CuiCan 璀璨·AI吊坠 +``` + +### 启用编译优化: + +``` +Component config → Compiler options → Optimization Level → Optimize for size (-Os) +``` + +### 编译: + +```bash +idf.py build +``` \ No newline at end of file diff --git a/main/boards/movecall-cuican-esp32s3/config.h b/main/boards/movecall-cuican-esp32s3/config.h new file mode 100644 index 00000000..156121dc --- /dev/null +++ b/main/boards/movecall-cuican-esp32s3/config.h @@ -0,0 +1,45 @@ +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +// Movecall CuiCan configuration + +#include + +#define AUDIO_INPUT_SAMPLE_RATE 24000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 + +#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_17 +#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_6 +#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_7 +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR + +#define BUILTIN_LED_GPIO GPIO_NUM_21 +#define BOOT_BUTTON_GPIO GPIO_NUM_0 + +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 240 +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y false +#define DISPLAY_SWAP_XY false + +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 + +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_16 +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT false + +#define DISPLAY_SPI_SCLK_PIN GPIO_NUM_12 +#define DISPLAY_SPI_MOSI_PIN GPIO_NUM_10 +#define DISPLAY_SPI_CS_PIN GPIO_NUM_13 +#define DISPLAY_SPI_DC_PIN GPIO_NUM_14 +#define DISPLAY_SPI_RESET_PIN GPIO_NUM_11 + +#define DISPLAY_SPI_SCLK_HZ (40 * 1000 * 1000) + +#endif // _BOARD_CONFIG_H_ diff --git a/main/boards/movecall-cuican-esp32s3/config.json b/main/boards/movecall-cuican-esp32s3/config.json new file mode 100644 index 00000000..91ce01c7 --- /dev/null +++ b/main/boards/movecall-cuican-esp32s3/config.json @@ -0,0 +1,9 @@ +{ + "target": "esp32s3", + "builds": [ + { + "name": "movecall-cuican-esp32s3", + "sdkconfig_append": [] + } + ] +} \ No newline at end of file diff --git a/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc b/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc new file mode 100644 index 00000000..81078129 --- /dev/null +++ b/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc @@ -0,0 +1,140 @@ +#include "wifi_board.h" +#include "audio_codecs/es8311_audio_codec.h" +#include "display/lcd_display.h" +#include "application.h" +#include "button.h" +#include "config.h" +#include "iot/thing_manager.h" +#include "led/single_led.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "driver/gpio.h" +#include "driver/spi_master.h" + +#define TAG "MovecallCuicanESP32S3" + +LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_awesome_16_4); + +class MovecallCuicanESP32S3 : public WifiBoard { +private: + i2c_master_bus_handle_t codec_i2c_bus_; + Button boot_button_; + Display* display_; + + void InitializeCodecI2c() { + // 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, &codec_i2c_bus_)); + } + + // SPI初始化 + void InitializeSpi() { + ESP_LOGI(TAG, "Initialize SPI bus"); + spi_bus_config_t buscfg = GC9A01_PANEL_BUS_SPI_CONFIG(DISPLAY_SPI_SCLK_PIN, DISPLAY_SPI_MOSI_PIN, + DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t)); + ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + // GC9A01初始化 + void InitializeGc9a01Display() { + ESP_LOGI(TAG, "Init GC9A01 display"); + + ESP_LOGI(TAG, "Install panel IO"); + esp_lcd_panel_io_handle_t io_handle = NULL; + esp_lcd_panel_io_spi_config_t io_config = GC9A01_PANEL_IO_SPI_CONFIG(DISPLAY_SPI_CS_PIN, DISPLAY_SPI_DC_PIN, NULL, NULL); + io_config.pclk_hz = DISPLAY_SPI_SCLK_HZ; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI3_HOST, &io_config, &io_handle)); + + ESP_LOGI(TAG, "Install GC9A01 panel driver"); + esp_lcd_panel_handle_t panel_handle = NULL; + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = DISPLAY_SPI_RESET_PIN; // Set to -1 if not use + panel_config.rgb_endian = LCD_RGB_ENDIAN_BGR; //LCD_RGB_ENDIAN_RGB; + panel_config.bits_per_pixel = 16; // Implemented by LCD command `3Ah` (16/18) + + ESP_ERROR_CHECK(esp_lcd_new_panel_gc9a01(io_handle, &panel_config, &panel_handle)); + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, true)); + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle, true, false)); + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); + + display_ = new SpiLcdDisplay(io_handle, panel_handle, + 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 = font_emoji_64_init(), + }); + } + + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { + ResetWifiConfiguration(); + } + app.ToggleChatState(); + }); + } + + // 物联网初始化,添加对 AI 可见设备 + void InitializeIot() { + auto& thing_manager = iot::ThingManager::GetInstance(); + thing_manager.AddThing(iot::CreateThing("Speaker")); + thing_manager.AddThing(iot::CreateThing("Screen")); + } + +public: + MovecallCuicanESP32S3() : boot_button_(BOOT_BUTTON_GPIO) { + InitializeCodecI2c(); + InitializeSpi(); + InitializeGc9a01Display(); + InitializeButtons(); + InitializeIot(); + GetBacklight()->RestoreBrightness(); + } + + virtual Led* GetLed() override { + static SingleLed led_strip(BUILTIN_LED_GPIO); + return &led_strip; + } + + virtual Display* GetDisplay() override { + return display_; + } + + virtual Backlight* GetBacklight() override { + static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); + return &backlight; + } + + virtual AudioCodec* GetAudioCodec() override { + static Es8311AudioCodec audio_codec(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; + } +}; + +DECLARE_BOARD(MovecallCuicanESP32S3);