Pull to refresh

Шкатулка с музыкальным замком

Reading time 4 min
Views 18K

Введение




Каких только замков ни придумали! И с хитрым ключом, и на комбинации цифр, и с распознанием частей тела. Однако, мне захотелось сделать замок, который я ещё не встречал. Поскольку я увлекаюсь игрой на пианино, за идеей далеко ходить не пришлось: было решено сделать шкатулку, которая открывается, лишь «услышав» знакомую мелодию.

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



Что получилось




Распознание мелодии


Как известно, то, что мы воспринимаем как звук, можно рассматривать как толчки воздуха в барабанную перепонку. Воздух надавил – нерв зарегистрировал. То, что мы воспринимаем как ноту, можно рассматривать как толчки с постоянным периодом. Иначе говоря, если этот нерв щекотать 130 раз в секунду, то мы «услышим» ноту «до».
Устройство, которое распознаёт ноты, старается понять, сколько раз в секунду ему «щекотали» микрофон и какая получилась частота (и, стало быть, нота). Переход от частоты к ноте – штука простая, есть таблица «частота → нота».

Есть несколько разных алгоритмов, которые превращают данные с микрофона в частоты. Самый известный – преобразование Фурье. Принцип работы таков: на вход подаётся с какой силой воздух давил на микрофон в каждый момент времени. На выходе – сколько какой частоты содержалось. Его работу проще всего объяснить картинкой:



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

Однако, мы пойдём другим путём. Знать, какие именно ноты играют, нам не обязательно. Надо лишь узнать, играет ли в данный момент та нота, которую мы ожидаем. На помощь приходит алгоритм Гёрцеля. Этот алгоритм используется в телефонии, когда надо определить тональный сигнал. Суть проста: алгоритму дают искомую частоту и данные с микрофона, а он отвечает, какова «громкость» искомой частоты.

На реализацию алгоритма можно взглянуть в файле NoteDetector.cpp.

Выбор компонентов


Я остановился на довольно стандартных компонентах. Вот, что мне пригодилось:

ATMega328P с кристаллом на 16Mhz – «мозг» устройства. Выбор пал именно на него, поскольку уж больно просто с ним работать.

Электретный микрофон с усилителем OPA344 – эти два устройства продавались комплектом на одной плате на сайте Sparkfun. Данные с этого устройства можно считывать прямо с аналогового входа микроконтроллера.

Серво Spektrum SPMAS2000L – этот сервопривод открывает и закрывает замок. Я был очень рад, что нашел такую деталь. Серво работает от 3.3V и поддерживает обычный протокол. Это линейный привод, то есть вместо крутящейся головки у привода есть ползунок, который ходит вправо-влево примерно на сантиметр. По бокам – уши для крепления.
Этот моторчик обычно используется в мире авиамоделирования. Насколько я понимаю, им регулируют отклонения элеронов. Почитать про него можно на сайте производителя.

Выключатель TPS2020 – это отличный выключатель с очень низким энергопотреблением в выключенном состоянии (10 μA). Он будет управлять питанием серво.

Регулятор LM2936Z – линейный регулятор на 3.3V с небольшим током в рабочей точке (≤ 15 μA). То, что надо для нашего устройства, которое будет питаться от батарейки.

Зарядное устройство MAX1555 – чип, который управляет зарядкой батарейки и мигает лампочкой, когда батарейка полна.

Схема


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



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



Синие соединения – те, что будут на самой плате. Красные – те, что будут добавлены позже, либо шилдиковыми коннекторами, либо проводами поверх платы.

Создание платы


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

Печатаем схему на прозрачной плёнке и выпиливаем основу для платы:


Плата до лужения и проделывания отверстий:


Платы с одной стороны:


Платы с другой стороны:


Собранные платы:


С другой стороны:


Создание шкатулки


Шкатулка состоит из самой шкатулки и стенок, окружающих схему и моторчик. Я решил купить неотделанную шкатулку, чтобы самому покрыть её краской и лаком. Стенки и вспомогательные детали я заказал на сайте Ponoko: им можно послать чертёж в SVG, а они вырежут её лазером на тонкой фанерке. Чертёж можно найти тут. Вот, как выглядит этот чертёж и его реализация:


Плюс три недели:


После того как эти части были интегрированы в шкатулку, получилось так:


Теперь можно окрасить шкатулку и покрыть её лаком. Я нанёс два слоя краски и два слоя лака, чтоб на века. Пожалуй, ничего особо сложного в этом процессе нет. Разве что шкурить дерево надо очень качественно: места, где схалтурил отчётливо видны. Вот что получилось:


Механизм замка выглядит вот так:


Результат


В результате схема отлично поместилась в шкатулку:


Я отнёс поделку к нескольким своим знакомым: правильная мелодия распознаётся на разных фортепиано: и на электронных пианино, и на обычных пианино, и на рояле. Точность распознавания: полтона.

Исходный код контроллера, схему и чертёж платы можно найти на Google Code. Я буду рад ответить на любые вопросы, выслушать критику и предложения.

Tags:
Hubs:
+146
Comments 134
Comments Comments 134

Articles