From 89cbb196e6d767771092d1c8f24756231094accd Mon Sep 17 00:00:00 2001 From: Shiven Mian Date: Sat, 17 Feb 2024 14:11:12 -0800 Subject: [PATCH] feat: added playback .ino code for esp32 atom echo --- 01OS/01OS/clients/esp32/__init__.py | 0 01OS/01OS/clients/esp32/playback.ino | 95 ++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 01OS/01OS/clients/esp32/__init__.py create mode 100644 01OS/01OS/clients/esp32/playback.ino diff --git a/01OS/01OS/clients/esp32/__init__.py b/01OS/01OS/clients/esp32/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/01OS/01OS/clients/esp32/playback.ino b/01OS/01OS/clients/esp32/playback.ino new file mode 100644 index 0000000..61c800c --- /dev/null +++ b/01OS/01OS/clients/esp32/playback.ino @@ -0,0 +1,95 @@ +/*Press button to record,released button to playback*/ + +#include +#include + +#define CONFIG_I2S_BCK_PIN 19 +#define CONFIG_I2S_LRCK_PIN 33 +#define CONFIG_I2S_DATA_PIN 22 +#define CONFIG_I2S_DATA_IN_PIN 23 + +#define SPEAKER_I2S_NUMBER I2S_NUM_0 + +#define MODE_MIC 0 +#define MODE_SPK 1 +#define DATA_SIZE 1024 + +uint8_t microphonedata0[1024 * 70]; +int data_offset = 0; + +void InitI2SSpeakerOrMic(int mode) { + esp_err_t err = ESP_OK; + + i2s_driver_uninstall(SPEAKER_I2S_NUMBER); + i2s_config_t i2s_config = { + .mode = (i2s_mode_t)(I2S_MODE_MASTER), + .sample_rate = 16000, + .bits_per_sample = + I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB + .channel_format = I2S_CHANNEL_FMT_ALL_RIGHT, +#if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 1, 0) + .communication_format = + I2S_COMM_FORMAT_STAND_I2S, // Set the format of the communication. +#else // 设置通讯格式 + .communication_format = I2S_COMM_FORMAT_I2S, +#endif + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, + .dma_buf_count = 6, + .dma_buf_len = 60, + }; + if (mode == MODE_MIC) { + i2s_config.mode = + (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM); + } else { + i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); + i2s_config.use_apll = false; + i2s_config.tx_desc_auto_clear = true; + } + + err += i2s_driver_install(SPEAKER_I2S_NUMBER, &i2s_config, 0, NULL); + i2s_pin_config_t tx_pin_config; + +#if (ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0)) + tx_pin_config.mck_io_num = I2S_PIN_NO_CHANGE; +#endif + tx_pin_config.bck_io_num = CONFIG_I2S_BCK_PIN; + tx_pin_config.ws_io_num = CONFIG_I2S_LRCK_PIN; + tx_pin_config.data_out_num = CONFIG_I2S_DATA_PIN; + tx_pin_config.data_in_num = CONFIG_I2S_DATA_IN_PIN; + + // Serial.println("Init i2s_set_pin"); + err += i2s_set_pin(SPEAKER_I2S_NUMBER, &tx_pin_config); + // Serial.println("Init i2s_set_clk"); + err += i2s_set_clk(SPEAKER_I2S_NUMBER, 16000, I2S_BITS_PER_SAMPLE_16BIT, + I2S_CHANNEL_MONO); +} + +void setup() { + M5.begin(true, false, true); + M5.dis.drawpix(0, CRGB(128, 128, 0)); + delay(2000); +} + +void loop() { + if (M5.Btn.isPressed()) { + data_offset = 0; + InitI2SSpeakerOrMic(MODE_MIC); + M5.dis.drawpix(0, CRGB(128, 128, 0)); + size_t byte_read; + + while (1) { + i2s_read(SPEAKER_I2S_NUMBER, + (char *)(microphonedata0 + data_offset), DATA_SIZE, + &byte_read, (100 / portTICK_RATE_MS)); + data_offset += 1024; + M5.update(); + if (M5.Btn.isReleased() || data_offset >= 71679) break; + // delay(60); + } + size_t bytes_written; + InitI2SSpeakerOrMic(MODE_SPK); + i2s_write(SPEAKER_I2S_NUMBER, microphonedata0, data_offset, + &bytes_written, portMAX_DELAY); + } + M5.update(); +} \ No newline at end of file