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