add iot speaker for boards

This commit is contained in:
Terrence
2024-12-07 06:19:59 +08:00
parent d31901e9e5
commit 051a0ba483
6 changed files with 58 additions and 14 deletions

View File

@@ -137,7 +137,7 @@ NoAudioCodec::NoAudioCodec(int input_sample_rate, int output_sample_rate, gpio_n
output_sample_rate_ = output_sample_rate; output_sample_rate_ = output_sample_rate;
// Create a new channel for speaker // Create a new channel for speaker
i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_1, I2S_ROLE_MASTER); i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)1, I2S_ROLE_MASTER);
tx_chan_cfg.dma_desc_num = 6; tx_chan_cfg.dma_desc_num = 6;
tx_chan_cfg.dma_frame_num = 240; tx_chan_cfg.dma_frame_num = 240;
tx_chan_cfg.auto_clear_after_cb = true; tx_chan_cfg.auto_clear_after_cb = true;
@@ -147,7 +147,12 @@ NoAudioCodec::NoAudioCodec(int input_sample_rate, int output_sample_rate, gpio_n
i2s_std_config_t tx_std_cfg = { i2s_std_config_t tx_std_cfg = {
.clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG((uint32_t)output_sample_rate_), .clk_cfg = {
.sample_rate_hz = (uint32_t)output_sample_rate_,
.clk_src = I2S_CLK_SRC_DEFAULT,
.ext_clk_freq_hz = 0,
.mclk_multiple = I2S_MCLK_MULTIPLE_256
},
.slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_MONO), .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_MONO),
.gpio_cfg = { .gpio_cfg = {
.mclk = I2S_GPIO_UNUSED, .mclk = I2S_GPIO_UNUSED,
@@ -163,9 +168,9 @@ NoAudioCodec::NoAudioCodec(int input_sample_rate, int output_sample_rate, gpio_n
}, },
}; };
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &tx_std_cfg)); ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &tx_std_cfg));
#if SOC_I2S_SUPPORTS_PDM_RX
// Create a new channel for MIC in PDM mode // Create a new channel for MIC in PDM mode
i2s_chan_config_t rx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER); i2s_chan_config_t rx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG((i2s_port_t)0, I2S_ROLE_MASTER);
ESP_ERROR_CHECK(i2s_new_channel(&rx_chan_cfg, NULL, &rx_handle_)); ESP_ERROR_CHECK(i2s_new_channel(&rx_chan_cfg, NULL, &rx_handle_));
i2s_pdm_rx_config_t pdm_rx_cfg = { i2s_pdm_rx_config_t pdm_rx_cfg = {
.clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG((uint32_t)input_sample_rate_), .clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG((uint32_t)input_sample_rate_),
@@ -181,6 +186,9 @@ NoAudioCodec::NoAudioCodec(int input_sample_rate, int output_sample_rate, gpio_n
}, },
}; };
ESP_ERROR_CHECK(i2s_channel_init_pdm_rx_mode(rx_handle_, &pdm_rx_cfg)); ESP_ERROR_CHECK(i2s_channel_init_pdm_rx_mode(rx_handle_, &pdm_rx_cfg));
#else
ESP_LOGE(TAG, "PDM is not supported");
#endif
ESP_LOGI(TAG, "Simplex channels created"); ESP_LOGI(TAG, "Simplex channels created");
} }

View File

@@ -5,6 +5,7 @@
#include "button.h" #include "button.h"
#include "led.h" #include "led.h"
#include "config.h" #include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h> #include <esp_log.h>
#include <driver/i2c_master.h> #include <driver/i2c_master.h>
@@ -39,10 +40,17 @@ private:
}); });
} }
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public: public:
EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) { EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c(); InitializeI2c();
InitializeButtons(); InitializeButtons();
InitializeIot();
} }
virtual Led* GetBuiltinLed() override { virtual Led* GetBuiltinLed() override {

View File

@@ -5,13 +5,14 @@
#include "button.h" #include "button.h"
#include "led.h" #include "led.h"
#include "config.h" #include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h> #include <esp_log.h>
#include <esp_spiffs.h> #include <esp_spiffs.h>
#include <driver/gpio.h> #include <driver/gpio.h>
#include <driver/i2c_master.h> #include <driver/i2c_master.h>
static const char *TAG = "KevinBoxBoard"; #define TAG "KevinBoxBoard"
class KevinBoxBoard : public Ml307Board { class KevinBoxBoard : public Ml307Board {
private: private:
@@ -95,8 +96,7 @@ private:
}); });
volume_up_button_.OnLongPress([this]() { volume_up_button_.OnLongPress([this]() {
auto codec = GetAudioCodec(); GetAudioCodec()->SetOutputVolume(100);
codec->SetOutputVolume(100);
GetDisplay()->ShowNotification("最大音量"); GetDisplay()->ShowNotification("最大音量");
}); });
@@ -111,12 +111,17 @@ private:
}); });
volume_down_button_.OnLongPress([this]() { volume_down_button_.OnLongPress([this]() {
auto codec = GetAudioCodec(); GetAudioCodec()->SetOutputVolume(0);
codec->SetOutputVolume(0);
GetDisplay()->ShowNotification("已静音"); GetDisplay()->ShowNotification("已静音");
}); });
} }
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public: public:
KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096), KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096),
boot_button_(BOOT_BUTTON_GPIO), boot_button_(BOOT_BUTTON_GPIO),
@@ -128,6 +133,7 @@ public:
Enable4GModule(); Enable4GModule();
InitializeButtons(); InitializeButtons();
InitializeIot();
} }
virtual Led* GetBuiltinLed() override { virtual Led* GetBuiltinLed() override {

View File

@@ -6,6 +6,7 @@
#include "led.h" #include "led.h"
#include "config.h" #include "config.h"
#include "axp2101.h" #include "axp2101.h"
#include "iot/thing_manager.h"
#include <esp_log.h> #include <esp_log.h>
#include <esp_spiffs.h> #include <esp_spiffs.h>
@@ -13,7 +14,7 @@
#include <driver/i2c_master.h> #include <driver/i2c_master.h>
#include <esp_timer.h> #include <esp_timer.h>
static const char *TAG = "KevinBoxBoard"; #define TAG "KevinBoxBoard"
class KevinBoxBoard : public Ml307Board { class KevinBoxBoard : public Ml307Board {
private: private:
@@ -136,8 +137,7 @@ private:
}); });
volume_up_button_.OnLongPress([this]() { volume_up_button_.OnLongPress([this]() {
auto codec = GetAudioCodec(); GetAudioCodec()->SetOutputVolume(100);
codec->SetOutputVolume(100);
GetDisplay()->ShowNotification("最大音量"); GetDisplay()->ShowNotification("最大音量");
}); });
@@ -152,12 +152,17 @@ private:
}); });
volume_down_button_.OnLongPress([this]() { volume_down_button_.OnLongPress([this]() {
auto codec = GetAudioCodec(); GetAudioCodec()->SetOutputVolume(0);
codec->SetOutputVolume(0);
GetDisplay()->ShowNotification("已静音"); GetDisplay()->ShowNotification("已静音");
}); });
} }
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public: public:
KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096), KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, 4096),
boot_button_(BOOT_BUTTON_GPIO), boot_button_(BOOT_BUTTON_GPIO),
@@ -172,6 +177,7 @@ public:
InitializeButtons(); InitializeButtons();
InitializePowerSaveTimer(); InitializePowerSaveTimer();
InitializeIot();
} }
virtual Led* GetBuiltinLed() override { virtual Led* GetBuiltinLed() override {

View File

@@ -4,6 +4,7 @@
#include "button.h" #include "button.h"
#include "led.h" #include "led.h"
#include "config.h" #include "config.h"
#include "iot/thing_manager.h"
#include <wifi_station.h> #include <wifi_station.h>
#include <esp_log.h> #include <esp_log.h>
@@ -48,10 +49,17 @@ private:
}); });
} }
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public: public:
KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) { KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c(); InitializeCodecI2c();
InitializeButtons(); InitializeButtons();
InitializeIot();
} }
virtual Led* GetBuiltinLed() override { virtual Led* GetBuiltinLed() override {

View File

@@ -6,6 +6,7 @@
#include "led.h" #include "led.h"
#include "config.h" #include "config.h"
#include "i2c_device.h" #include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h> #include <esp_log.h>
#include <esp_lcd_panel_vendor.h> #include <esp_lcd_panel_vendor.h>
@@ -119,12 +120,19 @@ private:
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); 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: public:
LichuangDevBoard() : boot_button_(BOOT_BUTTON_GPIO) { LichuangDevBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c(); InitializeI2c();
InitializeSpi(); InitializeSpi();
InitializeSt7789Display(); InitializeSt7789Display();
InitializeButtons(); InitializeButtons();
InitializeIot();
} }
virtual Led* GetBuiltinLed() override { virtual Led* GetBuiltinLed() override {