- PVSM.RU - https://www.pvsm.ru -
Каких только замков ни придумали! И с хитрым ключом, и на комбинации цифр, и с распознанием частей тела. Однако, мне захотелось сделать замок, который я ещё не встречал. Поскольку я увлекаюсь игрой на пианино, за идеей далеко ходить не пришлось: было решено сделать шкатулку, которая открывается, лишь «услышав» знакомую мелодию.
В этом посте я бы хотел рассказать про алгоритм распознания мелодии, об управляющей схеме и о процессе создания шкатулки.
Как известно, то, что мы воспринимаем как звук, можно рассматривать как толчки воздуха в барабанную перепонку. Воздух надавил – нерв зарегистрировал. То, что мы воспринимаем как ноту, можно рассматривать как толчки с постоянным периодом. Иначе говоря, если этот нерв щекотать 130 раз в секунду, то мы «услышим» ноту «до».
Устройство, которое распознаёт ноты, старается понять, сколько раз в секунду ему «щекотали» микрофон и какая получилась частота (и, стало быть, нота). Переход от частоты к ноте – штука простая, есть таблица «частота → нота» [1].
Есть несколько разных алгоритмов, которые превращают данные с микрофона в частоты. Самый известный – преобразование Фурье [2]. Принцип работы таков: на вход подаётся с какой силой воздух давил на микрофон в каждый момент времени. На выходе – сколько какой частоты содержалось. Его работу проще всего объяснить картинкой:
Так можно было бы реализовать распознание нот. В каждый момент времени определять, какая из частот громче всего. Если она совпадает с ожидаемой, переходить к распознанию следующей ноты или открыть замок, если мелодия кончилась.
Однако, мы пойдём другим путём. Знать, какие именно ноты играют, нам не обязательно. Надо лишь узнать, играет ли в данный момент та нота, которую мы ожидаем. На помощь приходит алгоритм Гёрцеля [3]. Этот алгоритм используется в телефонии, когда надо определить тональный сигнал. Суть проста: алгоритму дают искомую частоту и данные с микрофона, а он отвечает, какова «громкость» искомой частоты.
На реализацию алгоритма можно взглянуть в файле NoteDetector.cpp [4].
Я остановился на довольно стандартных компонентах. Вот, что мне пригодилось:
ATMega328P с кристаллом на 16Mhz – «мозг» устройства. Выбор пал именно на него, поскольку уж больно просто с ним работать.
Электретный микрофон с усилителем OPA344 – эти два устройства продавались комплектом на одной плате на сайте Sparkfun [5]. Данные с этого устройства можно считывать прямо с аналогового входа микроконтроллера.
[6]Серво Spektrum SPMAS2000L – этот сервопривод открывает и закрывает замок. Я был очень рад, что нашел такую деталь. Серво работает от 3.3V и поддерживает обычный протокол. Это линейный привод, то есть вместо крутящейся головки у привода есть ползунок, который ходит вправо-влево примерно на сантиметр. По бокам – уши для крепления.
Этот моторчик обычно используется в мире авиамоделирования. Насколько я понимаю, им регулируют отклонения элеронов. Почитать про него можно на сайте производителя [6].
Выключатель TPS2020 – это отличный выключатель с очень низким энергопотреблением в выключенном состоянии (10 μA). Он будет управлять питанием серво.
Регулятор LM2936Z – линейный регулятор на 3.3V с небольшим током в рабочей точке (≤ 15 μA). То, что надо для нашего устройства, которое будет питаться от батарейки.
Зарядное устройство MAX1555 – чип, который управляет зарядкой батарейки и мигает лампочкой, когда батарейка полна.
Ничего особо сложного в схеме устройства нет. Здесь [7] можно найти полную схему. А вот упрощённая схема, которая поясняет, какие компоненты при чём:
Довольно интересным делом оказалось скомпоновать плату так, чтобы она уместилась в небольшую коробку. Поскольку я решил делать всё сам, дома, варианты с многослойной платой не подходили. Поэтому пришлось придумать фейк многослойной платы: устройство состоит из двух уровней, которые соединяются как шилды для Arduino. Получилось что-то подобное:
Синие соединения – те, что будут на самой плате. Красные – те, что будут добавлены позже, либо шилдиковыми коннекторами, либо проводами поверх платы.
Я решил использовать фоторезистивный метод создания. Я его описывал на хабре [8], так что лишь приведу пару фоток.
Печатаем схему на прозрачной плёнке и выпиливаем основу для платы:
Плата до лужения и проделывания отверстий:
Платы с одной стороны:
Платы с другой стороны:
Собранные платы:
С другой стороны:
Шкатулка состоит из самой шкатулки и стенок, окружающих схему и моторчик. Я решил купить неотделанную шкатулку, чтобы самому покрыть её краской и лаком. Стенки и вспомогательные детали я заказал на сайте Ponoko [9]: им можно послать чертёж в SVG, а они вырежут её лазером на тонкой фанерке. Чертёж можно найти тут [10]. Вот, как выглядит этот чертёж и его реализация:
Плюс три недели:
После того как эти части были интегрированы в шкатулку, получилось так:
Теперь можно окрасить шкатулку и покрыть её лаком. Я нанёс два слоя краски и два слоя лака, чтоб на века. Пожалуй, ничего особо сложного в этом процессе нет. Разве что шкурить дерево надо очень качественно: места, где схалтурил отчётливо видны. Вот что получилось:
Механизм замка выглядит вот так:
В результате схема отлично поместилась в шкатулку:
Я отнёс поделку к нескольким своим знакомым: правильная мелодия распознаётся на разных фортепиано: и на электронных пианино, и на обычных пианино, и на рояле. Точность распознавания: полтона.
Исходный код контроллера, схему и чертёж платы можно найти на Google Code [11]. Я буду рад ответить на любые вопросы, выслушать критику и предложения.
Автор: apple_fan
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/arduino/4656
Ссылки в тексте:
[1] таблица «частота → нота»: http://en.wikipedia.org/wiki/Piano_key_frequencies
[2] преобразование Фурье: http://ru.wikipedia.org/wiki/Преобразование_Фурье
[3] алгоритм Гёрцеля: http://ru.wikipedia.org/wiki/Алгоритм_Гёрцеля
[4] NoteDetector.cpp: http://code.google.com/p/music-lock/source/browse/trunk/src/NoteDetector.cpp
[5] сайте Sparkfun: http://www.sparkfun.com/products/9964
[6] Image: http://www.spektrumrc.com/Products/Default.aspx?ProdID=spmas2000l
[7] Здесь: http://code.google.com/p/music-lock/source/browse/trunk/#trunk%2Fschematic
[8] описывал на хабре: http://habrahabr.ru/post/134834/
[9] Ponoko: http://www.ponoko.com/
[10] тут: http://code.google.com/p/music-lock/source/browse/trunk/enclosure/MusicLock.svg
[11] Google Code: http://code.google.com/p/music-lock/source/browse/trunk/
Нажмите здесь для печати.