• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Оцифровки звука через I2S

directumov

New member
Добрый день, помогите разобраться с встроенным пример в среде ардуино для esp32. Задача стоит такая нужно отцифровывать звуковой сигнал с двух микрофонов через интерфейс I2S , нужен именно он так как скорость оцифровки до 80 000 в секунду. Название примера HiFreq_ADC в этом примере происходит оцифровка звука с одного источника сигнала (микрофона), а надо с двух микрофонов. Хотя в настройках i2s_config указано что сбор данных происходит по левому и правому каналу (I2S_CHANNEL_FMT_RIGHT_LEFT), а микрофон подключен только один к этому ADC_INPUT ADC1_CHANNEL_4 //pin 32. Микрофон использую Max9814. Гтовый пример скетча ниже:

/*
* This is an example to read analog data at high frequency using the I2S peripheral
* Run a wire between pins 27 & 32
* The readings from the device will be 12bit (0-4096)
*/
#include <driver/i2s.h>

#define I2S_SAMPLE_RATE 78125
#define ADC_INPUT ADC1_CHANNEL_4 //pin 32
#define OUTPUT_PIN 27
#define OUTPUT_VALUE 3800
#define READ_DELAY 9000 //microseconds

uint16_t adc_reading;

void i2sInit()
{
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN),
.sample_rate = I2S_SAMPLE_RATE, // The format of the signal using ADC_BUILT_IN
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S_MSB,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = 8,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0
};
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_set_adc_mode(ADC_UNIT_1, ADC_INPUT);
i2s_adc_enable(I2S_NUM_0);
}

void reader(void *pvParameters) {
uint32_t read_counter = 0;
uint64_t read_sum = 0;
// 4 старших бита - это канал, и данные инвертируются
uint16_t offset = (int)ADC_INPUT * 0x1000 + 0xFFF;
size_t bytes_read;
while(1){
uint16_t buffer[2] = {0};//2
i2s_read(I2S_NUM_0, &buffer, sizeof(buffer), &bytes_read, 15);// 15 - время ожидания, если в течении его данные не получены то вернет 0.
// Serial.printf("%d %d\n", offset - buffer[0], offset - buffer[1]);

if (bytes_read == sizeof(buffer)) {
read_sum += offset - buffer[0];
read_sum += offset - buffer[1];
read_counter++;
} else {
Serial.println("buffer empty");
}
if (read_counter == I2S_SAMPLE_RATE) {
adc_reading = read_sum / I2S_SAMPLE_RATE / 2;
Serial.printf("среднее значение: %d millis: ", adc_reading);
Serial.print("милисекунды "); Serial.println(millis());
Serial.print("buffer[0] "); Serial.println(buffer[0]);

read_counter = 0;
read_sum = 0;
i2s_adc_disable(I2S_NUM_0);
delay(READ_DELAY);// тут надо считать буфер , на это уйдет время, одновременно ADC и чтение буфера невозможно
i2s_adc_enable(I2S_NUM_0);
}
}
}

void setup() {
Serial.begin(115200);
// Put a signal out on pin
uint32_t freq = ledcSetup(0, I2S_SAMPLE_RATE, 10);//ledcSetup(channel, freq, resolution_bits) - настройки, указываются канал, частота и разрешение
Serial.printf("Output frequency: %d\n", freq);
ledcWrite(0, OUTPUT_VALUE/4); //(channel, dutycycle) - указываются канал и коэффициент заполнения ШИМ-сигнала
ledcAttachPin(OUTPUT_PIN, 0);//(GPIO, channel) - указываются порт и канал I2S_NUM_0
// Запуск (инициализация) I2S
i2sInit();
// Создайте задачу, которая будет считывать данные
xTaskCreatePinnedToCore(reader, "ADC_reader", 2048/*стек 2048*/, NULL,0/* приоритет*/, NULL, 0/*ядро осн=1*/); // запук задачи на 1 ядре(основном), стек 2048, приоритет первая 1, 0-наивысший
}

void loop() {
delay(1020);
Serial.printf("ADC reading: %d\n", adc_reading);
delay(READ_DELAY);
}




Как подключить второй микрофон для приема сигнала одновременно с двух микрофонов?
 

enjoynering

Well-known member
Я одного не могу понять, зачем вы берёте аналоговый микрофон, потом пытаетесь все это оцифровать с помощью кривого и шумного ADC ESP32. Когда за $2 можно купить микрофон с выходом I2S и сразу гнать цифровой поток без шумов от кривой разводки платы и тд.
 

directumov

New member
Я одного не могу понять, зачем вы берёте аналоговый микрофон, потом пытаетесь все это оцифровать с помощью кривого и шумного ADC ESP32. Когда за $2 можно купить микрофон с выходом I2S и сразу гнать цифровой поток без шумов от кривой разводки платы и тд.
Ну да зёрнышко истины в этом есть.
 

Mumrik75

New member
себе брал INMP441 за $2.5 с доставкой
Такой же заказал, но ещё не подключал.. Нынче пара микрофонов за те же 2,5$ c доставкой.

Ткните пожалуйста носом в скетчи, если кто делал на основе INMP441 :
1) оценка уровня громкости звука... = получить уровень Громкости звука в % или единицах.. (закрытых наушниках, бывает ГРОМКО говорю - хочу индикацию себе сделать "не ори")
2) прослушивание звука микрофона в удалённом помещении через инет на другую ESP32 (или на сайт) = Микрофон в корпус часом встроить.. Пожилого человека хочу подстраховать.
 
Сверху Снизу