Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Как подружить esp32 s2 mini со звуком?

Вс дек 03, 2023 00:47:28

Добрый день, очень интересно, как работать с выводом звука на этой плате.
Хотелось сделать что то простое, например подключить микрофон и услышать звук из него в динамике.

Был написан вот такой код:
Код:
#include <Arduino.h>

#define ANALOG_IN_PIN 3  // Пин для подключения аналогового сигнала
#define ANALOG_OUT_PIN 18 // Пин для вывода аналогового сигнала

void setup() {
  pinMode(ANALOG_IN_PIN, INPUT);
  pinMode(ANALOG_OUT_PIN, OUTPUT);
}

void loop() {
  // Считываем аналоговый сигнал с пина 3
  int analogValue = analogRead(ANALOG_IN_PIN);

  // Выводим считанное значение обратно на пин 18
  analogWrite(ANALOG_OUT_PIN, analogValue);
}


Однако вместо голоса из микрофона я почему то получаю какие то цифровые звуки, как в модеме, когда говорю в микрофон.

АЦП у этой платы 12 бит.
Если подключить микрофон к 3 пину, в мониторе порта видно значения от 0 до более чем 8000
ЦАП у этой платы 8 бит
И если вгрузить какие то мелодии то динамик пиликает.
Однако если воспроизвести звук с микрофона то в динамике звуки модема.

Подскажите пожалуйста, кто знает, как правильно общаться со звуком на таких платах?
Мне нужно получается как то цап подключить в коде?
почему динамик издаёт непонятные звуки, а не голос?
в любом случае голос должен звучать, хоть и в не самом хорошем качестве.
подскажите пожалуйста, как правильно написать код, что подключить чтобы получить хоть какой то адекватный голос с микрофона из динамиков?
как вообще работает процесс воспроизведения звука на подобных платах.
Кажется должно быть всё просто на пин подан сигнал, с другого пина снят, однако на деле это оказался какой то тёмный лес и даже не знаю, как правильно к этому подступиться.

плата esp32 s2 mini фиолетевенькая

Re: Как подружить esp32 s2 mini со звуком?

Вс дек 03, 2023 03:00:27

Насколько я помню, микрофону нужно фантомное питание где-то хотябы 0.7 вольт, я что-то подобное делал год назад. Суть в том, что иначе микрофон будет подавать только верхнюю часть волны, ну и вряд ли это "читабильно". Ах да, и еще усилить же надо, потому что с микрофона приходят милливольты, если нет предусилителя хотябы. Предусилитель можно худо-бедно сообразить на 1 транзисторе.

Ну и преобразовывать придется по пути из АЦП в ЦАП, потому что раз 8 бит максимум, то 8 бит максимум. Ну или услилитель класса D мутить с ЦАП, тогда получится все 12 бит выдать, приходящие с микрофона.

Добавлено after 28 minutes 54 seconds:
просто еще раз, может непонятно с ходу. звук - это некий график функции, который постоянно перебегает через ноль. Поэтому микрофону генерит переменку относительно нуля. Если подключить его одним концом к земле, а вторым к пину, то у вас отрицательная часть звуковой волны исчезает. Поэтому нужно дать микрофону на его минус не землю, а какую-то низкую постоянку (вот честно не помню реально за минус или на плюс..., погуглите как подключить микрофон. плюс они в основном двух типов и чем-то отличаются, я только с одним работал), чтобы у контроллера на ноге и положительная и отрицательная часть звуковой волны были выше нуля. Тогда уже будет читаться.

Далее. Допустим мы пустили это на пин. Что получаем? Микрофон очень слаб сам по себе. Колебания там милливольты, поэтому там из 12 бит будет использована 2-4 бита. Короче звук слишком тихий. Поэтому нужно либо его усиливать предварительно аналоговой схемой, для теста хоть на одном транзисторе. Либо пин настраивать аналоговый при инициализации на ожидаемый интервал вольтажа. Это тот, что подали на микрофон, плюс минус ожидаемая его амплитуда, например 0.1 вольта для начала. Вроде на некоторых контроллерах есть такая штука для программной регулировки интервала АЦП, на атмеге я что-то подобное делал давно. Про есп не скажу, лежат пылятся пока что.

И вот когда это все получили на АЦП, там говорите 12 бит. 12 бит это 4096, откуда там до 8000 это отдельный вопрос...
Так вот 12 бит чтобы запихнуть в 8 бит, нужно по сути поделить каждое значение на 2*2*2*2 = 16. Тогда сигнал будет готов к выводу на 8 бит. Для тестов берете керамический конденсатор и через него подключаете пин вывода с ЦАП на динамик или колонку. Если конденсатора не будет, то постоянка (а если все правильно, то средний сигнал с порта будет около 1.6 вольта) будет идти через динамик и ноге контроллера будет тяжко, звук будет искажаться.

Ну это на пальцах, я не знаю каков Ваш уровень проникновения в тему.
Касаемо уже нормального звука, на ESP32 точно должен быть уже готовые пины для I2S протокола (это не I2C если что, и не опечатка). Это протокол для передачи звука между микросхемами, потому что даже 12 бит это мало чтобы выводить качественный звук. И типа контроллер умеет отдать звук "без потерь" по этому протоколу какой-нибудь микросхеме ЦАП, которая это поддерживает. Они в основном дорогие (хотя иногда в звуковой карте старой можно найти подходящий), но вот для тестов на чипе PCM5102 с алика запросто можно взять. Он примет нормальный звук с контроллера, то есть по сути можете плеер сделать, если научитесь Mp3 декодировать.
https://aliexpress.ru/item/1005002898278583.html - вот такой я себе заказываю как раз. Как работать с I2S наверное мануалы можно наяндексить в сети и не один. И я уверен, что в библиотеках для ESP это есть в уже съедобном виде.

Re: Как подружить esp32 s2 mini со звуком?

Вс дек 03, 2023 20:52:45

Огромное спасибо за развёрнутый ответ!
Действительно микрофон должен быть не подключен к минусу, а быть между плюсом и минусом для полного периода волны!
Сейчас у меня полупериод.
Усилитель используется вот такой на одном транзисторе.
https://cxem.net/sound/soundpred/soundpred5.gif
В принципе, если к минусу и плюсу этого микрофона напрямую подключить динамик, который я использую, голос слышен довольно адекватно.
Если его подключить к пину контролера то в плоттере порта заметна чёткая полуволна повторяющая голос.

Вопрос только, как эту волну пропустить через контролер esp32 и вывести с другого пина, чтобы научиться работать со звуком на этой плате.


На выходе контролера усиление в несколько раз выше и динамик орёт без всяких усилителей класса Д , он спокойно пропиликивает миди мелодии довольно громко.
Однако, когда я отправляю на динамик сигнал с микрофона слышу только рандомные невнятные звуки как у модема.
Вот забавное видео про звук и esp32 только вот непонятное и у него там проект мудрёный
https://www.youtube.com/watch?v=6PGrsZmYAJ0

Конечно, дополнительная плата ЦАП это прекрасный вариант.
Вот только хочется получить сигнал именно со встроенного в чип ESP32 ЦАП , для того чтобы понять, как это работает и научиться с ним взаимодействовать.
Возможно нужно использовать какую то хитрую библиотеку для работы с этим чипом.
Что то может такое ESP-IDF Programming Guide , однако понятной информации об этом не очень много.

Как то с этим даком адекватно общаются, вот даже радио без доп ЦАПа на встроенном сделали.
https://www.youtube.com/watch?si=J3SpHN ... vljuchenko

Да,
И тут подумалось вот пин должен быть как бы средним выводом между + и - и давать среднее значение.
А как тогда вся техника работает? Там же общий - обычно и два сигнальных, но там же не полупериод.
Ну в общем это и не так важно, мне бы хоть какой аудиосигнал через встроенный цап получить.
К сожалению, это оказалось сделать не так просто, как казалось вначале.

Re: Как подружить esp32 s2 mini со звуком?

Пн дек 04, 2023 05:23:46

Середину поднимаете просто подачей постоянного напряжения 1-2 вольта на микрофон, в яндексе яндексить что-то типа "как подать фантомное питание на микрофон". Или просто схема микрофона с предусилителем, там из нее кусок можно "выдрать". Там нужно вроде совсем мало, даже с делителя напряжения из пары резисторов можно соорудить эту среднюю точку. Тогда волна поднимется и целиком попадет в АЦП.

А динамик орёт потому что у Вас АЦП Вы сказали 12 бит, а ЦАП 8 бит. Поэтому с АЦП Вы получаете значения от 0 до 4096, а на ЦАП нужно подавать от 0 до 256, т.е. поделенное на 16. Это еще не вдаваясь в тип целого числа, со знаком он там или без или еще как. Например, вы шепнули в микрофон и получили мерзкую полуволну с максимальным значением на АЦП 128. Это около 3% от всей возможной амплитуды, то есть довольно тихо. Теперь даете напрямую это число 128 на ЦАП, а для него это аж 50% амплитуды. Естественно при питании 3.6 вольта он как даст Вам 1.8 вольта в пике... а если Вы исследуете например амплитуду сигнала на полной громкости с компа или ноутбука, в которые Вы спокойно вставляете наушники и можете в них оглохнуть, там всего 1 вольт от пика до пика. А у Вас 3.6 от пика до пика, т.к. это полуволна.

Попробуйте чтоли
1. Всетаки в своей программе значение из АЦП поделить на 16 и только после этого отправлять на ЦАП (ну или хотябы на 4, если не собираетесь орать в микрофон)
2. Ногу контроллера, куда подключен микрофон, подтянуть к плюсу питания контроллера через резистор 10кОм, ну и одновременно стянуть к земле тоже таким же резистором. То есть на ноге при неработающем микрофоне будет где-то 1.8 вольт. При условии, что между микрофоном (или усилителем микрофона) и ногой есть разделительный конденсатор, все должно отработать как надо.

Re: Как подружить esp32 s2 mini со звуком?

Ср дек 06, 2023 14:39:58

Кристиночкакиса писал(а):Вот только хочется получить сигнал именно со встроенного в чип ESP32 ЦАП , для того чтобы понять, как это работает и научиться с ним взаимодействовать.

для начала надо научиться понимать, что такое цап и как он устроен
для этого я делаю целую плату для лпт порта с цапом на резисторах

Изображение

цап на есп32 есть в ютубе


Re: Как подружить esp32 s2 mini со звуком?

Пт янв 05, 2024 01:06:57

Освойте протокол i2s и используйте любой более-менее качественный кодер/декодер
например https://aliexpress.ru/item/100500610872 ... 5785377040
Ответить