Pull to refresh

Голосовое управление: цифровая обработка сигналов на 8-битном AVR при помощи жесткого ассемблера

Reading time5 min
Views31K
Итак, пришло время рассказать кое-что поинтереснее простых поделок на АВРках. В этой статье я расскажу, как собрать на АВР устройство, выполняющее достаточно серьезную обработку аудио-сигнала с целью распознания голосовых команд.

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

image

image

image

Устройство собрано в железе и полностью функционирует. Вероятность распознавания, разумеется, весьма низка, но, для подобного девайса это уже большое достижение – напомню, его ядром является 8-битный микроконтроллер ATMega88, с частотой 20 МГц и без каких-либо DSP-инструкций. Девайс распознает две команды (количество команд можно расширить до десятка, ресурсы позволяют), одна из которых включает силовую нагрузку, другая – выключает ее. Помимо этого, можно включать-выключать нагрузку с любого ик-пульта. Устройство способно коммутировать до 250В/8А.
По большей части, я разработал его из академического интереса, чтобы проверить, возможно ли реализовать подобные DSP-алгоритмы на дешевом и маломощном микроконтроллере общего назначения. Результат получился вполне удовлетворительным, и устройство работает у меня дома в режиме 24/7.
Если говорить о целесообразности использования маломощных микроконтроллеров – скажу коротко: в принципе, лучше не надо)
Для подобной задачи куда больше подойдет какой-нибудь младший чип из линейки dsPIC, с шестнадцатибитными DSP-инструкциями, которые сейчас столь же дешевы сколь и АВРки и бывают с таким же маленьким количеством ног. Либо что-нибудь от TI из линейки MSP430F2xxx
Но, если вам также как и мне интересно, что можно выжать из AVR – для вас эта статья.

Схемотехника



Начнем с разработки электрической схемы и попробуем понять, что нам от нее нужно.
А нужно следующее:
1) Питание от 220в. В принципе, можно запитать ее хоть от батареек, но, имея под рукой 220 вольт ИМХО более логичное решение взять питание оттуда.
2) Коммутация нагрузки в 220в/5А при управлении от 5В. Амперы я взял навскидку, 5А уже достаточно чтобы запитать какой-нибудь хилый чайник с киловаттным потреблением. Или с десяток лампочек накаливания в 100 ватт)
3) Желательно дополнительный орган управления, на случай если голос подведет, или не хочется шуметь.
4) Захват звука с выбранными параметрам. О параметрах чуть позже.

Первый пункт тривиален – можно ставить любой известный вам блок питания, т.к. потребление схемы очень низкое. Но т.к. она включена в режиме 24/7, я выбрал простой и надежный трансформаторный двуполупериодный блок питания, состоящий собственно из трансформатора ТПГ-0.7, преобразующего 220В в 12В, диодного моста, сглаживающего конденсатора и двух линейных стабилизаторов напряжения, выдающих мне стабильные 5В и 9В.

image

Питание 5В, понятное дело, идет на цифровую схематику. А вот 9В мне понадобилось для аналоговой части, т.к. максимальное напряжение, которое может выдать операционник LM324 равно Eпит-1.5 вольта. Не трудно посчитать, что при питании его от 5В максимум на выходе можно получить 3.5, это меня не устраивало.

Переходим к пункту два. Для коммутации нагрузки я выбрал надежное и проверенное твердотельное реле S202S02, способное коммутировать до 250Вх8А.
Никаких механических частей не содержит, схема включения предельно проста: реле имеет 4 пина – два пина к нагрузке, они находятся в «нормально разомкнутом» состоянии. При подаче на управляющий пин лог 1, реле замыкается и проводит ток.

Пункт 3 тоже прост. На помощь приходит интегральный ИК датчик TSOP1736, представляющий собой маленькое трехногое чудо, которое двумя пинами подключается к земле и питанию 5В соответственно, а с третьего выдает лог. 1, когда входного сигнала нет, и лог 0, когда обнаружен входной сигнал. Входным сигналом является модулированное ИК излучение, с частотой несущей равной 36 кГц, что близко к несущей большинства ИК пультов. В силу модуляции TSOP довольно хорошо защищен от посторонних ИК шумов и постоянного света, такого как солнечный.

Переходим к самой интересной части, части аудио-захвата. Сразу представлю разработанную схему:

image

Итак, как я уже сказал, питание аналоговой части осуществляется от 9 вольт. Схема базируется на апноутах от Texas Instruments, посвященных однополярному включению операционников. В качестве операционного усилителя выбрал LM324, копеечный «четырехядерный» ОУ. Купить можно повсеместно, не дороже 10 рублей, таким образом, вся аналоговая часть строится на одной микросхеме.
Сигнал с электретного микрофона, запитанного через резистор R4 поступает через развязывающий конденсатор на вход предусилителя, а после и усилителя (верхний «этаж» схемы). Усилки включены по инвертирующей однополярной схеме, поэтому на неинвертирующие входы подана половина напряжения питания с делителя.
После первого усилка мы получаем инвертированный сигнал, усиленный в 25 раз и сдвинутый на 4.5 вольта. После второго (кондер перед ним не нужен, т.к. для него «землей» являются те самые 4.5 вольта, на которые мы уже сдвинули сигнал) входной сигнал еще раз инвертируется и усиливается еще в 80 раз.
Суммарное усиление двух каскадов составляет 2000, т.о. двуполярный сигнал с микрофона в 2 мВ предстанет перед АЦП 4хвольтовым сигналом, сдвинутым на половину напряжения питания. То что нужно.

Коэффициенты усиления я подбирал для моего конкретного микрофона – разумеется, если ваш выдает не 2 мВ а 20, то усиление следует понизить. А можно и вовсе впаять подстроечные резисторы, и менять усиление по мере надобности.

Второй «этаж» схемы – два антиальязинговых фильтра, выполненных по топологии Салена-Кея, второго порядка. Так как в основном речевой сигнал лежит в низких частотах, я выбрал частоту дискретизации равную 5КГц, что дает нам максимальную частоту сигнала в 2500 Герц. Фильтры настроены на частоту около 2КГц, что, в сочетании с 4м порядком, обеспечивает отличную антиальязинговую фильтрацию.

И последним шагом мы обрубаем постоянные 4.5В, идущие от усилков при помощи конденсатора С10 и добавляем новую постоянную составляющую в 2.5В для захвата АЦП контроллера, который, разумеется, питается от 5в и ждет сигнал в пределах от 0 до 5В.

Последняя часть схемы – контроллер с обвязкой:

image

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

Вся схема целиком выглядит так:

image

Итоги разработки схематики



Разработанная платформа оказалась очень удобной для разных DSP-экспериментов.
К аналоговой и цифровой части у меня не было никаких нареканий за все время тестирования и использования. А вот с питанием я слегка ошибся – взяв трансформатор на 12В, я не учел, что 12 вольт он выдает при номинальной нагрузке (около 100 мА). А т.к. схема потребляет много меньше, трансформатор выдает не 12 а около 15 вольт, из-за чего линейные стабилизаторы греются, особо тот, что на 5В – т.к. на нем падает целая десятка.

В остальном же, схема получилась очень удачная, и похожую аналоговую часть я часто использую в своих проектах. Так как контроллер заведен на 20 МГц, а частота дискретизации составляет 5 КГц, у него есть 4000 тактов на цифровую обработку сигнала.

На этом пока все, в следующей части статьи я расскажу про реализованный мной алгоритм распознавания. Для экономии тактов он был реализован на чистом ассемблере, так что готовьтесь)
Tags:
Hubs:
+93
Comments30

Articles