Датчики звука KY-037 и ему подобные (Статья)

Ответить
Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Датчики звука KY-037 и ему подобные (Статья)

#1

Сообщение Dryundel » 16.02.2022{, 19:27}

Датчики звука KY-037 и прочие

Часть 1
.
Датчик звука.jpg
.
Датчик звука как и многие недорогие модули света, ИК, магнитного поля и т.д , зачастую выполнены на компараторе напряжений LM393. С помощью этих датчиков измеряют интенсивность параметра. Все эти модули имеют аналоговый выход, напряжение на котором изменяется от 0 до 5(3,3) V в зависимости от громкости, яркости и т.д. Однако Звуковой датчик, в отличии от остальных имеет некоторые особенности. Если на выходе светового датчика есть прямая зависимость от яркости (чем ярче, тем выше напряжение), то например у KY-037 на аналоговом выходе мы получаем "шум", амплитуда которого зависит от громкости.
.
Шум.jpg
Шум.jpg (17.45 КБ) 1097 просмотров
.
Работать с таким сигналом не всегда удобно. Конечно если требуется просто включить свет по хлопку, ничего особо выдумывать не надо. А вот хоть как то измерить уровень звука и включить что то по достижении определенного уровня, для новичка, как оказалось, не так то просто. Есть у модуля и цифровой (дискретный) выход, воспользоваться которым можно так же, разве что для хлопка или другого громкого звука.

Разберемся как же правильно настроить датчик.
На модуле присутствует подстроечный резистор, которым выставляется уровень покоя. Лучше всего выставить на нем напряжение близкое к половине напряжения питания. Можно конечно и с помощью тестера, но мы поступим мудрее.
Подключаем модуль к аналоговому пину контроллера и выводим данные с этого входа на монитор порта или в плоттер. Разрешение АЦП у Arduino UNO, NANO 10 бит от 0 до 1023. Значит крутим подстроечник пока не настроим примерно 511 при тишине. Теперь при усилении звука шум амплитуда шума тоже увеличится, а максимальные и минимальные значения будут отличаться от 511 примерно на одинаковую величину, в плюс и в минус. Осталось только их измерить.
.
1.jpg
1.jpg (5.42 КБ) 1097 просмотров
2.jpg
2.jpg (13.63 КБ) 1097 просмотров
.
Для измерения уровней воспользуемся блоком Экстремумы, а для визуализации возьмем блок Plotter. Загрузим вот такой проект и откроем плоттер. Не забываем про кнопку сброса.
.
3.jpg
3.jpg (16.87 КБ) 1085 просмотров
.
Сымитируем фон тишины (обычный разговор, шум улицы), короче то, на что датчик не должен реагировать. После чего хлопнем в ладоши, крикнем, стукнем и тем самым выясним какой порог срабатывания необходимо установить.
Как видно из графика, плоттер показывает не все изменения. Суть в том, что настроен он на вывод каждые 100 мс и пропускает некоторые моменты. Однако на блоке Экстремумы, данные сохраняются и уровни видно четко.
.
KY-037_1.jpg
.
То же самое можно сделать в цифровом виде на мониторе порта.
Циферки они хоть и не так наглядны, за то более точны.
.
4.jpg
5.jpg
.
Теперь на основании этих данных можно легко, без экспериментов и танцев с бубнами сделать хлопковый выключатель.
Для надежности срабатывания используем оба пиковых уровня - верхний и нижний.
Однако во время хлопка, может пройти несколько импульсов, да еще с обоих компараторов и произойдет несколько сработок включения выключения ТТ-триггера.
Отфильтруем лишние импульсы таймером на отключение в 1 секунду.
.
7.jpg
Люстра.flp
(118.74 КБ) 43 скачивания
.
На этом закончу первую часть.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Датчики звука KY-037 и ему подобные (Статья)

#2

Сообщение Dryundel » 16.02.2022{, 19:27}

.
Часть 2

Цифровой (дискретный) выход.

Не все датчики звука оборудованы таким выходом. При наличии им так же можно воспользоваться. Устроен цифровой выход так, что на нем появляется логическая единица, когда напряжение на аналоговом выходе достигает половины опорного (напряжения питания датчика). Как правило, такой выход оснащен светодиодом для индикации. Таким образом, при использовании аналогового выхода, для настройки модуля, можно воспользоваться дискретным выходом, выставив такое положение подстроечного резистора, при котором, светодиод еле заметно моргает в условиях тишины.
Можно использовать дискретный выход и для управления чем либо, снизив напряжение покоя на некоторый необходимый уровень. Однако следует учитывать, что стабильной логической единицы, на таком выходе не будет никогда и применить его, для включения чего либо, можно с некоторыми нюансами.

Вариант использования цифрового выхода.
ВАЖНО! Не используйте при таком варианте защиту входа от дребезга. Это не позволит "слышать" датчик. Как говорилось раньше, на дискретном выходе нет стабильной логической единицы, а есть лишь пачка очень коротких импульсов. Debounce отфильтрует их и сработки не произойдет. Это основная ошибка использования дискретного выхода.
.
10.jpg
.
Таймер задержки отключения на несколько секунд предотвратит множественные срабатывания SR (RS) триггера. Такой программный фильтр с успехом можно заменить на аппаратный, снабдив пин подключения конденсатором небольшой емкости.

Еще один важный момент. Если ваш проект довольно большой и перегружен, то контроллер так-же может не "услышать" короткий сигнал от дискретного выхода, например при хлопке. В этом случае для гарантии следует использовать пины с прерыванием.

Уровень сигнала.

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

Поступим следующим образом. Создадим две переменные MAX и MIN.
В случае если сигнал больше чем MAX, записываем сигнал в MAX. Аналогично поступаем и с MIN. Получился аналог блока "Экстремумы". Теперь надо с запаздыванием возвращать MAX и MIN к значению покоя (тишины). Для 10 бит это 511. Для этого в каждом цикле при условии что MAX больше 511, отнимаем от MAX единицу. Аналогично с MIN. Находим текущую разницу MAX и MIN, это и будет значение амплитуды с очень коротким запаздыванием. Выводим значение сигнала и амплитуды в плоттер.
.
12.jpg
Амплитуда.flp
(795.41 КБ) 46 скачиваний
.
Вариант упрощенный, поэтому нормально будет работать на медленных контроллерах (16 МГц). На более быстрых значение амплитуды будет занижено.
Теперь у нас есть нормальный сигнал амплитуды начинающийся условно с нуля с которым можно комфортно работать.
.
11.jpg
.


Редактируется...

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Датчики звука KY-037 и прочие

#3

Сообщение Dryundel » 16.02.2022{, 22:33}

Продолжение

Ответить

Вернуться в «Обучающие примеры работы в FLProg»