Детектор звуков

Привет! Сегодня мы будем собирать акустический датчик.

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

Преобразовать звук в электрический сигнал можно двумя способами: с помощью пьезодинамика или микрофона. На выходе у них напряжение. У пьезодинамика, в состоянии покоя выход = 0В, а у микрофона, обычно, около 2В, в зависимости от подтягивающего резистора.

Пьезодинамик подойдёт не всякий. Простая «пластинка с двумя проводками» имеет маленькую чувствительность, хотя если её запихнуть в резонатор, то, наверное, станет лучше. Идеально подходят пьезодинамики марки 3П-22. Это такая кругляшка 3 см в диаметре, с отверстием в центре. Выглядит так:

Такие стоят в совковых часах с будильником, и ещё много где.

Загнать полученный сигнал в МК можно при помощи усилителей и АЦП – тогда мы получим полную информацию о форме сигнала. Но для наших целей такой подход избыточен – поступим проще – пропустим сигнал через компаратор:

При подключении пьезоизлучателя нужно повесить шунтирующий резистор (R3 на схеме), чтобы через него стекал заряд. Иначе, из-за огромного входного сопротивления компаратора, напряжение на пьезоизлучателе будет спадать дико медленно, и никаких импульсов нам не видать. Номинал в 24кОм я подобрал экспериментально. Можно снизить до 10к, но тогда упадёт чувствительность. Если взять больше, то чувствительность повысится, но напряжение будет спадать медленно, что приведёт к ошибкам.

Порог срабатывания компаратора настраивается с помощью подстроечного резистора. Ради экономии, я не стал ставить многооборотный подстроечник, а поступил хитрее. Верхний резистор (R1=47к) ограничивает диапазон напряжений – больше 0.104V ты из этой штуки не выжмешь. А подстроечным резистором, номиналом 1к, можно регулировать порог от 0 до 104 мВ. Это, если питаемся от 5V, иначе нужно пересчитать резисторы. Хотя, такого диапазона для работы с пьезоизлучателем более чем достаточно, поэтому можно использовать такие-же номиналы и при питании от 3V.

При подключении микрофона я использовал многооборотный подстроечник.

Кстати, активный уровень у нашей схемы – низкий. Если кому не нравится – меняют местами пороговое напряжение и входной сигнал.

С выбором МК я не стал заморачиваться и взял ATTiny13. Килобайта памяти нам вполне хватит. А компаратор можно использовать встроенный. «+» вход у него – AIN0 (PB0), а «-» AIN1 (PB1).

Питать устройство можно разными способами. Зависит от того, куда его планируется запихнуть. Мой девайс управлял светильником, и питался от маленького трансформатора (достал из китайского БП).

Картинка покрупней

В верхней части схемы – блок питания. Переменное напряжение с трансформатора выпрямляется диодным мостом и сглаживается конденсатором. Второй конденсатор (С4) служит для подавления ВЧ помех. Затем напряжение понижается до 5В (LM7805).

Компаратор я использовал встроенный, хотя большинство дешевых компараторов обгоняют его по характеристикам. Зато я избавился от лишней мелкосхемы, сильно упростив разводку.

Светодиод нужен для отладки. Во-первых, с его помощью можно оценить реальную частоту МК, ведь при тактировании от внутренней RC цепочки, она бывает далека от номинала. Во-вторых, он пригодится, при определении напряжения смещения компаратора. В-третьих, им можно мигать при отладке, не дёргая лишний раз нагрузку. Или мигать при получении импульса, чтобы оценить чувствительность устройства.

В нижней части расположен силовой модуль. Это симистор и оптическая развязка. DI HALT уже писал про то, как устроен симистор, и как его заюзать поэтому не буду повторяться.

Печатку нарисовал в SprintLayout и изготовил ЛУТ’ом:

Крупнее

Трансформатор и пьезодинамик подключаются к разъёмам, и запихиваются куда удобно. Причем, пьезодинамик не стоит запирать в корпусе устройства – лучше, чтобы он выглядывал наружу.

Теперь начинается самое главное – прошивка!
Сразу оговорюсь, что буду описывать алгоритм, который реагирует на 3 хлопка, потому-что команда из двух хлопков даёт многовато «ложных срабатываний».

От МК нам понадобятся две вещи: компаратор с его прерыванием и 16и разрядный таймер. Такого жирного таймера в Tiny13 нету, поэтому сделаем его сами. Компаратор настроим на прерывание по «Falling output edge», т.е. бит ACIS1 в единичку. У таймера поставим предделитель = 64. Т.е. полный период = 0.873 секунды с копейками.

Во главе угла стоит переменная state. Если, к моменту переполнения таймера она равна 3, то можно переключать свет. Изначально она = 0, после каждого переполнения таймера она опять сбрасывается в ноль.

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

А на компаратор, от каждого хлопка, прилетает куча импульсов. Если поделить всё время работы таймера на периоды, то получится что-то вроде этого:

Теперь, попробуем разобраться, с тем, что-же тут происходит:

  • Устройство ловит первый хлопок, начинается период p1 (pulse 1). Он будет продолжаться до p_len. В этот момент запускается таймер, а state становится = 1.
  • Пока state = 1, проверяем, не попал-ли очередной импульс между p_len и p2e_begin. Если попал, то он в периоде Q1 (quietness 1), а в нём должна быть тишина. Значит это не команда, а шум – записываем в state 0xFF (Типа, ошибка).
  • Если state = 1, и импульс попал между p2e_begin и p2e_end, то есть в период p2e (pulse 2 expectation – «Ожидание второго хлопка»), то мы проделываем такую штуку: записываем текущее значение таймера в переменную Temp_pulse_begin, и пишем в state 2. Усё! Второй хлопок ловится.
  • Если state = 2, то, как и в первый раз, проверяем – не попал-ли импульс в период Q2. Только сравниваем не с p2_end, а с Temp_pulse_begin + p_len. Если попал – пишем в state 0xFF.
  • Если state = 2, и импульс попал в p3e, то делаем, как в п.3 – записываем время в Temp_pulse_begin, а в state пишем 3.
  • Если state = 3, и импульс объявился после Temp_pulse_begin + p_len, т.е. в периоде Q3, то пишем в state 0xFF.

Вот так. Получается, что система сработает только, если три хлопка попадут в периоды p1, p2 и p3, а во всех периодах Q будет тишина.

На наше счастье, пьезодинамик обладает избирательной чувствительностью – реагирует только на резкие звуки. Т.е. на музыку из колонок, мяуканье кота и т.п., он не обратит внимания, а вот на хлопок в ладоши отзовётся радостным всплеском напряжения на выходе. Он, кстати, очень хорошо реагирует на вибрации. Если постучать пальцем по моему светильнику (или поверхности, на которой он крепится), то он включится, также как от хлопков в ладоши.

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

Не важно, что ты решил использовать – пьезодинамик или микрофон. Программная часть от этого почти не меняется. Хотя, возможно, придётся изменить длительности периодов.

Не гарантирую, что устройство будет работать без ошибок, но о том как свести их число к минимуму сейчас расскажу.

Ошибки бывают двух типов – «ложное срабатывание» и «пропуск команды». В первом случае устройство принимает шум за команду, а во втором – команду за шум.

Как лечить «ложные срабатывания»:

  • Нужно убрать «лишнюю» чувствительность, отрегулировав подстроечник так, чтобы через компаратор не проходили тихие шумы.
  • Отделить устройство от той поверхности, на которой оно крепится. Например, прокладкой из поролона. Тогда оно перестанет реагировать на вибрации.
  • Можно увеличить длительность Q-периодов (пропорционально уменьшив p2e и p3e), хотя такой метод может стать причиной «пропусков команды».
  • Увеличить длительность последнего «тихого» периода (Q3) можно, увеличив полный период таймера. Тут главное – не перестараться 🙂

Борьба с «пропусками команды»:

  • Возможно, что чувствительность системы слишком высока, и в периоды Q попадает всякий шум. Тогда чувствительность нужно снизить.
  • А может быть наоборот – чувствительность низкая, и хлопки «пропадают»
  • Может быть неправильно подобраны длительности периодов. В таком случае можно записать хлопки через микрофон на комп, и в аудио-редакторе измерить паузы между ними. Потом изменить длительности и перепрошить МК.

Пример борьбы с ложными срабатываниями
Устройство установлено в комнате и управляет большим светом. Чтобы снизить вероятность ложного срабатывания в таком приложении можно внести несколько конструктивных изменений.

Раз управление устройством ведётся на небольшом расстоянии (допустим, комната 3х4 метра), большая чувствительность не нужна. Уменьшение чувствительности устройства позволит сократить количество ложных срабатываний. Устройство можно смонтировать так, чтобы звук из-за пределов комнаты звук не мог попасть к нему напрямую. Отражённый звук имеет намного меньшую энергию, а значит шумы, пришедшие из-за пределов помещения, будут подавляться.
Для подавления вибраций, можно отделить устройство прослойкой из поролона. Но это повлияет и на чувствительность устройства (обычно, в таких случаях чувствительность уменьшается). Устройство управляет освещением, значит, на него можно установить фотодиод. Если нагрузка (лампа) отключена, а внешнего освещения и так достаточно, то можно не воспринимать команду включения. Это позволит избавиться от ложных срабатываний в светлое время суток, а именно тогда бывает больше всего внешних шумов.

Видео демонстрация работы устройства

P.S.
Смотрим схему – у нас ведь пьезоПИЩАЛКА подключена прямо к МК!! Значит ей можно пьезоПИЩАТЬ!!!! Например, для того, чтобы оповестить о срабатывании системы, если мы управляем не светильником, а чем-то «менее заметным».

Архив с проектом – исходники (mikroPasсal ASM), разводка платы

5 1 голос

Оцените статью!

guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии