Arduino мелодии. Музыкальная шкатулка на Arduino

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Схема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Результат

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

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

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


Всем нашим читателям блога привет. Продолжим осваивать наш ардуино конструктор. В этом уроке мы попробуем использовать на практике самый обычный пьезоизлучатель. Надеемся что у вас он есть, так же понадобиться еще нам плата ардуино и светодиод. Ну и для наблюдением за сигналом не помешает еще и осциллограф. А перед тем как начать работать над проектом небольшая предыстория…

Предыстория, или как хотите вступление, ведет в те детские годы, когда мы пробовали без всякой подготовки «поиграть» на разных инструментах. В итоги обычно удавалось из разных инструментов (например гитары или пианино) извлекать разные ноты, которые в своем наборе напоминали не музыку а дикую каксофонию. А вы знаете что и наш ардуино тоже так умеет? И даже больше: гораздо лучше и интереснее! А вот теперь давайте и приступим к делу…

Начнем со схемы. Все настолько просто, что даже на этот раз мы обойдемся без ее рисунка. Просто подключите наш пьезодинамик (но с соблюдением полярности – посмотрите где у него «плюс» и соответственно плюсовой вывод мы подключим к 7 пину на плате ардуино, а другой на землю) прямо к плате ардуино. Все просто не правда ли? Теперь давайте освоим новый оператор…

Оператор tone как раз и позволит получить звук определенной частоты и длительности. По сути все что нужно это просто прописать: tone (номер пина, частота Гц, длительность мс,); чтобы все наглядно показать, давайте сделаем чтобы на 7 пине генерировался сигнал с частотой 770 Гц продолжительностью в полсекунды. Да нет ничего проще: tone (7, 770, 500);

Думаю, что слушать тон одной и той же частоты да еще одинаковой продолжительности вряд ли заинтересует нашего любопытного читателя. А давайте сделаем так чтобы все параметры постоянно менялись. А вот тогда мы получим «музыкальную шкатулку» в которой будет издаваться самые разные звуки причем разной длительности. Для этого воспользуемся специальным оператором генерации случайных чисел: random (300, 800); С этим оператором еще проще: он просто будет генерировать случайным образом числа в указанном в скобках диапазоне. Таким образом будет меняться тональность (скажем от 300 до 800 Гц) и длительность (от 200 до 400 мс). Конечно вы можете потом сами поменять размах этих задаваемых значений тона и длительности и посмотреть, что из этого вышло. А теперь сам скетч:

int spek=7;

long res=300;

long sef=300;

void setup()

PinMode (spek , OUTPUT);

void loop()

Res=random (300, 800);

Sef=random (200, 400);

tone (spek, res, sef);


Записываем в плату ардуино скетч и … началось… ардуино сам играет не то мелодию, не то просто попискивает. А теперь давайте подключим параллельно к динамику осциллограф и понаблюдаем за сигналом. Да интересно понаблюдать за сигналом прямоугольной форы, у которого все меняется. А теперь давайте еше проведем эксперимент со светодиодом: нужно подключить его точно так же параллельно нашему пьезоизлучателю, и тогда он будет мигать в такт звуковым импульсам. Впрочем все как всегда можно увидеть в очередном видеоролике ниже. Приятного просмотра.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Схема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Результат

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

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

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: