Введение
Каких только замков ни придумали! И с хитрым ключом, и на комбинации цифр, и с распознанием частей тела. Однако, мне захотелось сделать замок, который я ещё не встречал. Поскольку я увлекаюсь игрой на пианино, за идеей далеко ходить не пришлось: было решено сделать шкатулку, которая открывается, лишь «услышав» знакомую мелодию.
В этом посте я бы хотел рассказать про алгоритм распознания мелодии, об управляющей схеме и о процессе создания шкатулки.
Что получилось
Распознание мелодии
Как известно, то, что мы воспринимаем как звук, можно рассматривать как толчки воздуха в барабанную перепонку. Воздух надавил – нерв зарегистрировал. То, что мы воспринимаем как ноту, можно рассматривать как толчки с постоянным периодом. Иначе говоря, если этот нерв щекотать 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. Я буду рад ответить на любые вопросы, выслушать критику и предложения.
Автор: apple_fan