Использование микрофона с Arduino

18

РЕДАКТИРОВАТЬ : Я занимался этой проблемой в течение достаточно долгого времени. Оказывается, это гораздо более сложный проект, чем я думал, а не что-то для начинающих. Это требует дорогостоящего оборудования (микрофон и усилитель) и некоторого сложного анализа звука на микроконтроллере. Даже полноценный микрофон с усиленной схемой не дает желаемых результатов (согласно комментариям к этому продукту)


Я совершенно новичок в Arduino (но я знаком с программированием). Чтобы построить измеритель уровня громкости , я хочу подключить микрофон к аналоговому 0-му контакту Arduino и отображать значение через последовательное соединение.

Я погуглил и нашел эту схему:

Простой предварительный усилитель звука

... и я попытался построить его с таким результатом:

(Сейчас я использую схему, предложенную Оли Глейзером в своем ответе)

Значения на последовательном мониторе не меняются в зависимости от громкости музыки.

Какой самый простой способ измерить громкость на аналоговом входе Arduino?

Кроме того, у меня есть TDA2822M , но я не знаю, полезно ли это для этого проекта. Надпись на микрофоне гласит: XF-18D .

Изменить: мой код Arduino:

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

Серийный выход: 1023 1022 1022 1022 1022 1023 1022 и т. Д.

Как я могу проверить, работает ли микрофон вообще? Это направленное?

Изменить: я сейчас использую транзистор S9014. АЦП и последовательное соединение работают (я проверил их с помощью потенциометра).

Серийный выход сейчас составляет около 57.

Также у меня нет мультиметра или осциллографа. У меня сейчас мультиметр.

Тост
источник
Вы проверили с помощью области, что вы можете видеть звуковую форму на выходе вашей схемы?
HikeOnPast
Ого, почему штырьки 3V3 и 5V закорочены на схеме? Это может быть проблемой.
Коннор Вольф
Нет, я просто не нарисовал схему правильно.
Тост

Ответы:

14

Самый простой способ - просто подать сигнал и сэмпл с помощью АЦП. Сохраните результаты в буфере, а затем отобразите их по желанию (в вашем случае отправьте на ПК через RS232).
Если вы хотите получить среднеквадратичное значение сигнала, вам нужно будет рассчитать его в какой-то момент, перед отправкой на ПК или после.

Ваша схема усиления, как показано на рисунке, не идеальна, но должна работать разумно для базового измерителя VU. РЕДАКТИРОВАТЬ - Я только что заметил C2, удалите это, так как он заблокирует смещение постоянного тока от транзистора, и сигнал будет качаться ниже уровня земли.

РЕДАКТИРОВАТЬ - вот лучшая схема для усилительного транзистора:

Электретный усилитель

Это не должно беспокоиться об используемом транзисторе, выходное смещение должно быть около 2,5 В.
Точные значения для входного делителя (R3 и R4) не слишком важны, это соотношение 1: 4, что более важно. Таким образом, вы можете использовать, например, 400 КБ и 100 КБ или 40 КБ и 10 КБ и т. Д. (Старайтесь не идти выше или ниже этих соответствующих значений). C2 должен быть> 10 мкФ. C1 должен быть> 1 мкФ (заменяет C1 в вашей схеме),
хотя R1 и R2 должны быть этими значениями.
Все, что вам нужно, это электрет с резистором смещения (R1 в вашей схеме)

Одной из проблем является то, что линии Arduino 3,3 В и 5 В, кажется, связаны друг с другом - я предполагаю, что это схематическая ошибка, но если это имеет место в реальной схеме, она не будет работать и может что-то повредить.
Чтобы точно определить проблему (проблемы), это поможет увидеть ваш код и то, что вы видите на стороне ПК. И какой транзистор вы используете?

Если у вас есть осциллограф, то вы можете проверить, правильно ли работает ваш микрофон / транзистор. Если нет, то мультиметр можно использовать для выполнения некоторых более базовых тестов (например, подтвердить наличие + 5 В, подтвердить, что база транзистора находится на уровне ~ 0,6 В, тестовый коллектор, чтобы убедиться, что он не подключен к + 5 В или заземлению без сигнала)

Также вам необходимо убедиться, что RS232 работает правильно, поэтому было бы неплохо написать простой код для отправки тестовых значений.

Если вы можете предоставить запрошенную информацию и сообщить нам, какими инструментами вы располагаете, вам может быть оказана более конкретная помощь.

РЕДАКТИРОВАТЬ - если вы производите выборку очень медленно, вам понадобится схема обнаружения пиков, например:

Обнаружение пиков

Вы бы поместили эту схему между транзистором и выводом Arduino (минус C2)

Диод может быть практически любым диодом. Значения пробок и резисторов являются ориентировочными, их можно немного изменить. Их значения определяют, сколько времени займет изменение напряжения в зависимости от уровня сигнала. Вы можете рассчитать это, используя постоянную RC (т. Е. R * C - в приведенном выше примере постоянная RC равна 1e-6 * 10e3 = 10 мс. Напряжению потребуется около 2,3 постоянной времени, чтобы упасть на 90% от ее первоначального значения, поэтому в приведенном выше примере, если напряжение начинается с 1 В и вы удаляете сигнал, оно упадет до 0,1 В примерно через 23 мс.

РЕДАКТИРОВАТЬ - хорошо, думаю, я нашел серьезную проблему. Ваш транзистор S9012 является транзистором PNP (как и S9015), для этой схемы вам нужен NPN-транзистор. S9014 представляет собой транзистор NPN, так что вам придется использовать этот.

Конденсаторы с маркировкой «104» почти наверняка представляют собой керамические конденсаторы 0,1 мкФ. Значение (в pF) - это первые 2 числа, за которыми следует число нулей, установленных последним числом. Таким образом, для 104 значение равно 10 + 4 нуля или 100 000 пФ. 100 000 пФ это 100 нФ или 0,1 мкФ.

РЕДАКТИРОВАТЬ - Отсутствие оптического прицела или мультиметра очень усложняет жизнь (вы должны как можно
быстрее освоить один или оба). Однако существуют некоторые базовые осциллографы звуковой карты ПК, которые можно использовать для проверки вашей электретной / транзисторной цепи. Visual Analyzer - хороший пример:

Визуальный анализатор

Если вы замените C2 (не обязательно, но это хорошая идея), вы сможете напрямую подавать сигнал на ПК и наблюдать в программном обеспечении, чтобы убедиться, что микрофон и усилитель работают правильно. Если на вашем компьютере используется линия, но вход для микрофона обычно подходит для напряжения до 2 В IIRC. Вы также можете напрямую проверить электрет - просто удалите бит транзистора и сохраните R1 и C1, возьмите сигнал с другой стороны C1.
Обратите внимание, что этот метод не будет проверять уровни постоянного тока, только то, что вас интересует (только из-за ограничителя постоянного тока на входе звуковой карты), но сигнал переменного (аудио) сигнала.

Если вы попробуете это, опубликуйте скриншоты, чтобы мы могли понять, что происходит.

Оли Глейзер
источник
3,3 В и 5 В не связаны между собой. Это первый раз, когда я использую это программное обеспечение - извините. Я поставлю свой код в вопросе, но нет ничего, что могло бы пойти не так, как надо. Кроме того, сегодня я сделал проект, который использует фоторезистор и отображает значение на шести светодиодах, как будто я хочу, чтобы мой измеритель громкости был похож, и я проверил последовательное соединение с этим. У меня нет ни осциллографа, ни мультиметра. Транзистор имеет заголовок «S9012 H 331», а также «S9014 C 331» и S9015.
Тост
@Toast - см. Правку о C2, удалите это и подключитесь напрямую.
Оли Глейзер
Я удалил С2 и добавил детали, как Кристоффон описал это в своем ответе. Все те же результаты.
Тост
1
Если у вас есть потенциометр или источник переменного напряжения, вы можете подать вход 0-5 В на вход АЦП для проверки вашего кода, независимо от вашей входной цепи. Вы пытаетесь отладить две вещи одновременно - изолировать схему и проверить ее поведение с помощью осциллографа и / или изолировать ваш код и предоставить предсказуемый, но переменный ввод для проверки вашего кода.
HikeOnPast
1
@OliGlaser Меня смущает схема. "Электрет" это микрофон? Куда идет другой провод микрофона, GND или VCC? Я подключаю 5 или 3,3 В к этой цепи? Не могли бы вы как-нибудь удалить EDITблоки и отредактировать их так, чтобы их можно было понять, не читая ветку комментариев? Я также новичок, и я не понимаю, как проблема была решена и могу ли я использовать схему, которую вы опубликовали, как есть.
Томаш Зато - Восстановить Монику
4

Предполагая, что ваша схема работает, аудиосигнал находится в диапазоне кГц, в то время как Arduino имеет АЦП, подходящий для уровней постоянного тока. Компонент постоянного тока в вашем сигнале равен нулю, то есть он плавает при фиксированном напряжении. Это то постоянное напряжение, которое читает ваш АЦП.

Чтобы исправить это, вы должны подключить диод последовательно с выходом, подключенным к АЦП, конденсатору и резистору.

Колпачок будет заряжаться до пикового значения, получаемого в то время, как резистор разряжает колпачок, когда сигнал стихает.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

Изменить: Вход АЦП фактически плавающий, поскольку он не имеет смещения вообще из-за последовательного конденсатора. Если вы собираетесь попробовать мое решение, удалите C2.

Kristoffon
источник
Хорошо, я добавил это к схеме, и сигнал на последовательном мониторе теперь 458 (но все еще не изменяется, когда есть шум).
Тост
Я заменил транзистор с «S9012 H 331» на «S9014 C 331», и его значение равно 56.
Тост
1
АЦП Arduino способен достаточно быстро сэмплировать звук. Я не использую их, но я думаю, что с библиотечными функциями возможно 10 кбит / с (так что пропускная способность до 5 кГц), что хорошо для lo-fi вещей (я уверен, что настоящая ATMega может сэмплировать быстрее, если используется нормально)
Оли Глейзер
@Toast - как быстро ты пробуешь? Если это очень медленно, то пиковый детектор - хорошая идея. Вы можете сделать это в программном обеспечении, хотя.
Оли Глейзер
2
@Kristoffon - Не с Arduino no, но я использовал похожие 8-битные микро (например, PIC16F, 18F и т. Д.) Для сэмплирования и воспроизведения звука много раз. 10ksps легко выполнимо. Чтобы процитировать этот документ АЦП AVR :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Оли Глейзер
4

Ваши показания 1022, 1023 в основном полномасштабные на АЦП Arduino. Предполагая, что вы установили исправный последовательный конденсатор, как показано на диаграмме, этот уровень не может быть получен из схемы микрофона, которую вы построили, так как он может соединять только изменяющиеся напряжения (например, переменный ток).

В результате, я подозреваю, что вы читаете ток утечки внутри самой ATMEGA - вы, вероятно, получите тот же результат на любом из других (не связанных) аналоговых выводов.

Попробуйте сделать очень «легкий» делитель напряжения с некоторыми высокоценных резисторов (между 10K и 100K) и использовать это для смещения аналогового входа на половину опорного напряжения (можно также использовать потенциометр, который дает вам дополнительные возможности тестирования). Тогда ваше чтение без ввода должно быть около 512.

После того, как вы правильно настроите вход АЦП, вы можете начать работать, пытаясь выяснить, есть ли у вас изменения. Возможно, вы частично занижаете полосу пропускания, что означает, что вы получите псевдоним высокочастотных компонентов, но если все, что вы пытаетесь сделать, это оценить общий объем, что не должно быть слишком большой проблемой.

Крис Страттон
источник
Это звучит правильно, я думаю, это перегружено. OP Вы когда-нибудь думали о подключении небольшого динамика для отладки этой аналоговой линии во время чтения. Когда я сделал вюметр, я взял линии из разъема для наушников, в основном прямо в AnalogRead, и наметил результат.
Hellonearthis