Так называемое шумовое загрязнение становится все более актуальной проблемой в современном обществе в связи со все возрастающей плотностью населения. Обычное человеческое ухо способно воспринимать звуки с уровнем от 0 до 140 дБ. Громкость (уровень) звука обычно измеряют в децибелах (дБ). Современной промышленостью изготавливаются разнообразные измерители громкости звука, но они в большинстве случаев достаточно дороги. Поэтому в данной статье мы рассмотрим создание простого измерителя уровня звука (шума) на основе платы Arduino и обычного электретного конденсаторного микрофона. Измеряемый уровень звука мы будем показывать в децибелах (дБ).
В схеме нашего измерителя уровня звука мы также будем использовать усилитель, с выхода которого усиленный сигнал будет подаваться в плату Arduino, в которой мы будем использовать регрессионный метод для расчета уровня звука в децибелах. Чтобы проверить корректность работы нашего измерителя звука мы будем использовать android приложение, которое называется “Sound Meter”. Отметим, что целью нашего проекта не является абсолютно точное измерение громкости звука (мы ведь используем самые дешевые компоненты в нашем проекте), а получение значений, максимально близких к истинным.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Конденсаторный микрофон (купить на AliExpress).
- Микросхема LM386 (купить на AliExpress).
- Резисторы (купить на AliExpress) и конденсаторы.
Схема проекта
Схема измерителя уровня звука на основе платы Arduino и микрофона представлена на следующем рисунке.
В схеме мы используем усилитель звуковых сигналов на основе микросхемы LM386 чтобы усиливать сигнал с выхода конденсаторного микрофона. С выхода усилителя мы подаем сигнал на аналоговый контакт платы Arduino.
Коэффициент усиления используемого нами операционного усилителя LM386 может составлять от 20 до 200 в зависимости от номинала конденсатора или резистора, подключенного к его контактам 1 и 8. Если их не использовать совсем, то коэффициент усиления будет составлять минимальную величину – 20. Мы в нашем проекте использовали максимальный коэффициент усиления данного усилителя, поэтому мы включили конденсатор емкостью 10 мкФ между контактами 1 и 8 – учтите, что эти контакты чувствительны к полярности, поэтому отрицательный вывод конденсатора должен быть подключен к контакту 8 усилителя. Вся схема усилителя запитывается от контакта 5V платы Arduino.
Конденсатор C2 используется для фильтрации шумов, поступающих с микрофона. Когда микрофон улавливает какие либо звуки, на его выходе появляется сигнал переменного тока. Но в составе этого сигнала переменного тока может присутствовать шум с некоторым постоянным уровнем (постоянная составляющая сигнала), этот шум и отфильтровывается с помощью данного конденсатора. Аналогично этому конденсатор C3 на выходе усилителя используется для фильтрации постоянного уровня шумов, которые могли появиться в процесс усиления сигнала (добавиться к нему в процессе усиления).
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Использование регрессионного метода для расчета уровня звука в децибелах
Когда аппаратная часть нашего проекта будет готова, мы можем подключить плату Arduino к компьютеру и загрузить в нее код примера “Analog Read Serial” из Arduino IDE чтобы проверить действительно ли мы получаем корректные значения АЦП (аналого-цифрового преобразования) с нашего микрофона. Но нам эти значения необходимо преобразовать в децибелы (дБ).
В отличие, к примеру, от задач измерения температуры и влажности, измерение уровня звука в децибелах не является линейной задачей поскольку значения уровня звука в децибелах имеют нелинейную зависимость от имеющихся у нас значений АЦП с выхода аналогового контакта Arduino. Существует несколько способов решения данной задачи, но мы выбрали один из самых простых.
Поскольку мы не преследуем цели получения максимальной точности результатов мы решили использовать метод непосредственной калибровки значений АЦП с помощью значений децибелов. Для этого в идеале необходимо иметь профессиональный измеритель уровня шума (SPL meter), но вряд ли у кого из начинающих радиолюбителей он есть, поэтому мы будем использовать для этой цели обычное android приложение под названием “Sound meter”, которое можно бесплатно скачать из play store. Существует множество других аналогичных приложений – вы можете использовать любое из них. Все эти приложения имеют примерно одинаковый принцип действия – они используют встроенный в смартфон микрофон для измерения уровня шума, который они затем отображают на экране смартфона. Они не отличаются высоким уровнем точности, но для решения нашей задачи они вполне подойдут.
Скачайте приложение “Sound meter”, после его установки и запуска вы на экране смартфона увидите примерно следующую картину:
Как мы уже говорили, зависимость между имеющимися у нас значениями с выхода АЦП и требуемыми значениями уровня звука в децибелах нелинейная, поэтому нам необходимо сравнить эти значения на различных интервалах. Запишите несколько значений с выхода АЦП и соответствующие им значения в децибелах с вашего смартфона. Мы для примера взяли/сравнили 10 значений и у нас получились цифры, приведенные в следующей таблице (у вас могут получиться немного другие цифры).
Откроем страницу Excel и запишем туда эти значения. В Excel нам необходимо найти значения коэффициентов регрессии для записанных значений. Для облегчения этой задачи давайте сначала построим графики этих значений.
Как вы можете видеть из представленных графиков, значения в дБ не имеют линейной зависимости от значений АЦП. Это означает что вы не можете использовать простой коэффициент, чтобы с его помощью пересчитать значения АЦП в значения в дБ. В этом случае мы должны использовать метод линейной регрессии. Вкратце суть этого метода состоит в том, чтобы аппроксимировать синюю линию на приведенном графике максимально близкой к ней прямой линией и получить уравнение этой прямой линии. Это позволит нам достаточно просто находить для каждого значения АЦП эквивалентное ему значение в децибелах.
В Excel у нас есть плагин для анализа данных, который может автоматически рассчитать нам необходимое уравнение регрессии. Если вы не знаете как это делать, то вы легко можете найти эту информацию в сети интернет – это нецелесообразно включать в текст данной статьи поскольку этой информации в сети и так слишком много. Когда вы рассчитаете уравнение регрессии, Excel нам выдаст ряд данных, показанных на следующих рисунках. Нас будут интересовать данные, обведенные красной линией на представленных рисунках.
На основании этих чисел мы можем записать следующее уравнение:
ADC = (11.003* dB) – 83.2073
В этом уравнении ADC обозначает данные АЦП.
Из этого уравнения мы можем получить нужное нам выражение для расчета децибел на основании данных АЦП:
dB = (ADC+83.2073) / 11.003
У вас уравнение может немного отличаться от нашего если вы будете использовать другие калибровочные данные, отличные от наших. Но общий принцип нахождения уравнения регрессии останется неизменным.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В программе мы будем считывать значения АЦП с контакта A0 и преобразовывать их в децибелы с помощью уравнения, которое мы получили в предыдущем пункте статьи. Это значение децибел, как мы уже говорили, не будет абсолютно точным, но оно будет достаточно близким к своему истинному значению.
1 2 |
adc= analogRead(MIC); //Read the ADC value from amplifer dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values |
Для проверки правильности работы программы мы также добавили светодиод, подключенный к цифровому контакту 3 платы Arduino. Этот светодиод будет загораться на 1 секунду если плата Arduino будет обнаруживать звук громкостью более 60 дБ.
1 2 3 4 5 6 |
if (dB>60) { digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(3, LOW); } |
Тестирование работы проекта
После того как аппаратная часть проекта будет готова и программа будет загружена в плату Arduino, вы в окне монитора последовательной связи сможете наблюдать измеренные значения уровня громкости звука в децибелах. Эти значения вы можете проверить с помощью приложения на android.
Более подробно указанные процессы вы можете посмотреть на видео, приведенном в конце статьи. Данный проект вы, к примеру, можете использовать для измерения уровня громкости шума в комнате, в которой вы работаете.
Но в некоторых условиях данный проект будет работать не очень удовлетворительно ввиду просачивания значительного уровня шумов на выход рассмотренного усилителя звуковых частот. Улучшить проект можно с помощью дополнительных фильтров, который мы рассмотрим далее в статье.
Усилитель с блоком фильтрации
Для улучшения работы проекта в рассмотренную схему усилителя звуковых частот на микросхеме LM358 целесообразно добавить фильтры нижних (ФНЧ) и верхних частот (ФВЧ) как показано на следующем рисунке – это позволит существенно уменьшить уровень шумов.
ФВЧ в представленной схеме состоит из резистора R5 и конденсатора C2, а ФНЧ — из резистора R2 и конденсатора C1. Представленные фильтры ориентированы на прохождение через них сигналов с частотами от 8 кГц до 15 кГц. ФНЧ подавляет сигналы с частотами, меньшими 8 кГц, а ФВЧ подавляет сигналы с частотами, большими 15 кГц. Этот частотный диапазон работы фильтров был выбран потому что согласно даташиту конденсаторный микрофон работает только в диапазоне от 10 до 15 кГц.
Если вы хотите изменить частоты фильтров, то в этом случае вы можете использовать следующую формулу для расчета номиналов резисторов и конденсаторов в фильтрах для необходимого вам диапазона частот:
Frequency (F) = 1/(2πRC)
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const int MIC = 0; // выход усилителя сигнала с микрофона подключен к контакту A0 int adc; int dB, PdB; //в этих переменных мы будем хранить рассчитанные значения децибел void setup() { Serial.begin(9600); //инициализация последовательной связи – мы будем наблюдать рассчитанные значения дБ в окне монитора последовательной связи pinMode(3, OUTPUT); } void loop(){ PdB = dB; //сохраняем предыдущее значение дБ adc= analogRead(MIC); //считываем значение АЦП с выхода усилителя //Serial.println (adc);//выводим значения АЦП dB = (adc+83.2073) / 11.003; // преобразуем значения АЦП в дБ используя полученные значения из уравнения регрессии if (PdB!=dB) Serial.println (dB); if (dB>60) { digitalWrite(3, HIGH); // включаем светодиод (HIGH is the voltage level) delay(2000); // ждем секунду digitalWrite(3, LOW); } //delay(100); } |
2 ответа к “Измерение уровня звука (шума) в децибелах с помощью Arduino и микрофона”
Здравствуйте! Собрал схему с фильтрами (2-я схема). Выдает в терминал одно и тоже значение. Но уровень шума не реагирует. Собрал вроде все верно. С ардуино все понятно там вопросов нет. А как проверить что не так с усилителем?
Добрый день, Сергей. К сожалению, не могу подсказать — в последнее время увлекаюсь только микроконтроллерами, в основном, в обычной дискретной электронике, к сожалению, пока слабовато себя чувствую — давно не занимался подобными проектами