Как сделать пианино ардуино

Обновлено: 06.07.2024

Шаг 1. Компоненты

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

Кроме того, в Arduino IDE используется упрощенная версия C ++, что упрощает обучение программе. Наконец, Arduino предоставляет стандартный форм-фактор, который разбивает функции микроконтроллера на более доступные пакеты.

Необходимые компоненты для нашего урока по списку:

  1. Arduino UNO — 1 шт.
  2. Провода-переходники папа-папа
  3. Клавиатура — 14 Ом
  4. Динамики — 1 A
  5. ПК или ноутбук

Как подключать всю схему мы рассмотрим на втором шаге.

Важные страницы

Скетч

Заголовочный файл pitches.h

Теперь мы знаем как генерировать звуки с помощью функции tone(). Но как узнать какой вид тона будет генерироваться на каждой частоте? Для этой цели в Arduino есть специальная таблица нот, которая приравнивает каждую частоту к определенному типу музыкальной ноты. Эта таблица нот первоначально была написана Бреттом Хангманом (Brett Hagman), на чьих трудах и была основана работа функции tone(). Мы будем использовать эту таблицу нот чтобы проигрывать наши мелодии.

Приведенный участок кода записан в заголовочном файле pitches.h в форме zip файла. Вы должны скачать его и включить его в свой код программы как сделано в конце данной статьи. Либо этот код вы можете взять непосредственно из скачанного zip файла.

Генерирование квадратного сигнала

Программное

Квадратный сигнал может быть использован для тактирования и управления, а также для генерации звука через усилитель. Самый базовый пример, Blink, по сути тоже является генератором квадратного сигнала:

Если заменить например на , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

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

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – :

  • – цифровой пин, с которого будет генерироваться сигнал.
  • – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать . Также у генерации при помощи есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2

При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone().

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с , равной . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

Тестирование работы проекта

Соберите схему устройства и загрузите программу в плату Arduino. Переключатель переведите в положение записи звука и после этого можете начинать проигрывание мелодии, нажимая на необходимые кнопки. Во время этого процесса на экране ЖК дисплея будет высвечиваться надпись “Recording…”, а на второй строчке дисплея будет высвечиваться название проигрываемой ноты.


После того как вы закончите нажимать на кнопки переведите переключатель в положение воспроизведения музыки, после этого на экране ЖК дисплея высветится надпись “Now Playing..” и начнется воспроизведение записанной вами мелодии. Эта мелодия будет проигрываться снова и снова до тех пор пока переключатель будет находиться в положении воспроизведения музыки.


Шаг 3. Как настроить оборудование

Кнопки Клавиатуры (наше пианино) были подключены с помощью перемычек. Основной эскиз (скетч) определяет, какие частоты музыкальных нот связаны с каждой клавишей пианино.

Для этого проекта мы использовали C4, D4, E4, F4, G4, A4, B4, C5, D5, E5, F5, G5, A5 и B5, причем C4 был переключателем ‘0’, D4 — переключателем ‘1’ и так далее. Измените значения частот или добавьте дополнительные переключатели, чтобы полностью настроить собственный проект. Динамик просто подключен одним концом к контакту 11 Arduino, а другой — к земле.

Работа схемы

Схема пианино на основе платы Arduino, сделанная для сборки на макетной плате представлена на следующем рисунке.


Схема достаточно простая и ее без особых затруднений можно собрать на макетной плате. После сборки схемы на макетной плате у нее должна получиться примерно следующая конструкция:


Номиналы резисторов в схеме слева направо: 10 кОм, 560 Ом, 1,5 кОм, 2,6 кОм, 3,9 кОм, 5,6 кОм, 6,8 кОм, 8,2 кОм, 10 кОм. Если у вас нет переключателя SPDT типа, то вы можете использовать обычный переключатель.

Принципиальная схема пианино на основе платы Arduino представлена на следующем рисунке.


Одной из основных вещей, которые необходимо понять в этой схеме, является то, как мы соединили 8 кнопок к одному аналоговому контакту A0 платы Arduino. Обычно для подключения 8 кнопок используют 8 контактов платы Arduino, но в данном проекте мы не можем так сделать – у нас не хватит контактов поскольку необходимо подключать к плате Arduino еще и ЖК дисплей.

Таким образом, используемые нами 8 резисторов, включенные вместе с кнопками, образуют так называемый делитель напряжения и при нажатии кнопок будет изменяться значение напряжения, подаваемое с выхода данного делителя напряжения на контакт A0 платы Arduino. На следующем рисунке представлена схема аналогичного делителя напряжения на двух резисторах – чтобы вам проще было понять принцип его работы.


В представленной схеме на вход контакта АЦП (англ. ADC) будет подаваться напряжение +5V в случае когда кнопки не нажаты. При нажатии первой кнопки в цепь делителя напряжения будет включен резистор сопротивлением 560 Ом, а при нажатии второй кнопки — резистор сопротивлением 1,5 кОм. Соответственно, будет изменяться и напряжение, подаваемое на вход контакта АЦП (аналого-цифрового преобразователя). Аналогичный принцип используется и в делителе напряжения в проекте нашего пианино – только в нем 8 кнопок и 8 резисторов.

В представленной схеме пианино ЖК дисплей подключен к контактам 8, 9, 10, 11 и 12 платы Arduino. Зуммер подключен к контакту 7, а переключатель – к контакту 6 платы Arduino. Схема запитывается через USB кабель от компьютера, но также для этой цели можно использовать адаптер на 12 В или батарейку на 9 В.

Работа схемы

Схема устройства представлена на следующем рисунке.


В представленной схеме пьезоэлектрический зуммер подсоединен к контакту 8 платы Arduino и ее земле через резистор 1 кОм. Резистор 1 кОм служит для ограничения тока, чтобы ток не превысил допустимых значений. Также в схему добавлено 4 переключателя для выбора нужной мелодии. Одни из контактов переключателей замкнуты на землю, а другие подсоединены к контактам 2, 3, 4 и 5 платы Arduino соответственно. Переключатели подключаются к контактам платы Arduino через внутренние подтягивающие резисторы – это конфигурируется программно. На макетной плате собранное устройство выглядит следующим образом:

Проверка работы

В первом случае после конструирования должен получиться стандартный мотор-редуктор Ардуино синусоидальных и прямоугольных волновых сигналов, диапазон которых регулируется от до 40 МГц.

Проверить управление легче легкого – есть 2 кнопки – вверх и вниз, для настройки грубого характера, а другие – влево и вправо – настраивают аппарат на точную проверку. Настроить шаг можно в зависимости от установленной частоты на аппарате.

Во втором случае итоговое решение будет выглядеть так:

Пояснения к коду

  • Функция возвращает целочисленное значение из интервала , которое является пропорциональным отображением содержимого из интервала
  • Верхние границы не обязательно должны быть больше нижних и могут быть отрицательными. К примеру, значение из интервала можно отобразить в интервал
  • Если при вычислении значения образуется дробное значение, оно будет отброшено, а не округлено
  • Функция не будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует их по заданному правилу.
  • Если вам нужно ограничить множество допустимых значений, используйте функцию , которая вернет:
  • , если это значение попадает в диапазон
  • , если меньше него
  • , если больше него

Принципы работы функции Tone() в Arduino

Прежде чем рассматривать функцию Tone() сначала рассмотрим как работает пьезоэлектрический зуммер (Piezo Buzzer). По сути, это кристалл, который преобразует механические колебания в электрические или наоборот. В этом проекте мы используем переменный ток (частоту) под действием которой кристалл вибрирует и, таким образом, производит звук. То есть чтобы заставить пьезоэлектрический зуммер издавать какой-нибудь шум (звук), мы должны заставить его вибрировать, тон этого звука будет зависеть от того как быстро кристалл вибрирует. То есть тоном звука можно управлять с помощью частоты подаваемого на кристалл тока.

А каким образом мы можем получить переменную частоту в плате Arduino? И здесь как раз на помощь приходит функция tone (). Эта функция позволяет генерировать определенную частоту на заданном контакте. Можно регулировать и время генерации частоты если это необходимо. Синтаксис функции tone () выглядит следующим образом:

В качестве pin может выступать любой цифровой контакт платы Arduino. Мы в нашем проекте использовали контакт 8. Генерируемая частота зависит от размера таймера в вашей плате Arduino. Для Arduino Uno и других подобных ей плат минимальная частота звука составляет 31 Гц, а максимальная – 65535 Гц. Диапазон воспринимаемых ухом обычного человека частот значительно меньше.

Что такое генератор

Генератор производит преобразование в энергию, не поддающуюся затуханию, для расчета и частоты и образованной формы электрических колебаний.

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

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

Такой прибор, как генератор сигналов на Ардуино, легко сделать в домашних условиях. Основа конструкции – микроконтроллер Arduino.


Где применяется генератор частоты на Ардуино

Роль частотного генератора в мире электроники – настройка и определение технической характеристики тактов сигнальных волн. Другое применение – для регулировки узлов и элементов приемников, передающих радио-колебания.

Кроме того, генератор импульсов, построенный на Ардуино, используют как модулятор или источник питания для устройств, которые обладают измерительными свойствами.

Частотные измерители могут изменять выходные сигналы с определенным скачком.


Поэтому устройства с такими свойствами играют немаловажную роль в конструировании электронных приборов. Перечислим другие значительные функции Ардуино-генератора:

  1. Поиск расположения мест, где можно проложить кабели и трубопроводы. Причем поисковая работа проводится на дальних расстояниях.
  2. Поисковые работы для находки мультичастотной технологии с помощью процесса излучения сразу нескольких частотных волн.
  3. Создание аналоговых синтезаторов. Синтезирующие устройства применяются для сборки электронных устройств без использования множества блоков. Все сигнальные волны мелькают между разными блоками строго по стандартам.

Обратите внимание

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

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

NikitosLag

1)Почему? В интернете нет самодельных проектов, хотя тема довольно завораживающая и интересная. Думаю, это будет необычный опыт.
2)Зачем? Данный проект не только даст новую жизнь старому пианино, но и подарит удовольствие от прослушивания живой музыки.
3)Описание. Подробных чертежей и схем нет, но думаю это не столь сложно. Задача приобрести пианино (взять бесплатно), внедрить под каждую клавишу механизм её нажатия (с возможностью регулировки). Таким механизмом может служить небольшой электромагнит (отдельно, механизм для педалей). Всё это попробовать отдать под управление arduino, с возможностью управления через программу на смартфоне. Тяжесть проекта состоит в весе и доставке пианино, объёме работ и количестве систем. Стимул: сделать то, что никто ещё не создавал.

Вложения

100x40-400x400.jpg

PiratFox

@NikitosLag, это уж для совсем повёрнутых любителей. Ну допустим, такие найдутся. По управлению даже изобретать ничего не надо: давно существует MIDI протокол, да и с прочей электроникой привода проблем не вижу. Вопрос тут в другом: кто это делать-то будет? Да и готовых полно, вот первая же ссылка в гугле.

IamNikolay

@NikitosLag, это называется пианола, Вика говорит в 1887 году была сконструирована, так что делали до вас и не раз, да еще без всяких ардуин.

NikitosLag

@NikitosLag, это уж для совсем повёрнутых любителей. Ну допустим, такие найдутся. По управлению даже изобретать ничего не надо: давно существует MIDI протокол, да и с прочей электроникой привода проблем не вижу. Вопрос тут в другом: кто это делать-то будет? Да и готовых полно, вот первая же ссылка в гугле.

Если использовать MIDI протокол, при этом потратить на сборку/отладку механической составляющей немного времени, то на выходе будет музыкальный инструмент для любителей живой музыки. Да и те, у кого пылится пианино, смогут придать ему вторю жизнь. А готовые решения стоят 2млн рублей) Причём, простой, потребительский вариант.

@NikitosLag, это называется пианола, Вика говорит в 1887 году была сконструирована, так что делали до вас и не раз, да еще без всяких ардуин.

Пианола использует множество пневматических клапанов, если я правильно понял. При этом требуется специальная лента(которую сложно изготовить самому). Моя же идея является не изобретением той самой пианолы, а идея модернизации пианино( с использованием современных технологий). В интернете нет таких проектов.

Реально? 88 исполнительных механизмов, с возможностью нескольких "приёмов" воздействия достаточно скоростных, чтобы отыгрывать этими приёмами хотя бы со скоростью 4-5 нажатий в секунду, с драйверами для них, как минимум двух конструкций (для белых и для чёрных клавиш), систему управления для всего этого - и это немного времени? Вы пианино-то видели когда-нибудь внутри? Там всё плотненько, обычно.

IamNikolay

@NikitosLag, это и есть пианола, в 1887 году её сделали механической, вы же хотите её электрической сделать, по ссылки во 2 посте видно что и электрическая уже есть, и судя по всему тоже уже давно. так что проект ничем новым не является.
вместо пневмоклапанов - электротолкатели, а перфоленту заменяет массив данных в контроллере вот и вся разница между механической и электрической пианолами

PiratFox

@NikitosLag, хорошо, какие у Вас сложности с разработкой и реализацией этого проекта? Или же это просто предложение идеи (кстати, не новой и не Вашей) и всё?

Старик Похабыч

PiratFox

Старик Похабыч

NikitosLag

Реально? 88 исполнительных механизмов, с возможностью нескольких "приёмов" воздействия достаточно скоростных, чтобы отыгрывать этими приёмами хотя бы со скоростью 4-5 нажатий в секунду, с драйверами для них, как минимум двух конструкций (для белых и для чёрных клавиш), систему управления для всего этого - и это немного времени? Вы пианино-то видели когда-нибудь внутри? Там всё плотненько, обычно.

1)Как аксиому можно взять тот факт, что существуют готовые рояли(где, кажется, ещё меньше места). Следовательно, такое возможно) 2)Если говорить о времени: характеристика "немного" относительна. Потратить две недели на проект будет совсем немного, относительно двух лет. Но в то же время, две недель относительно двух часов, это уже не немного. Я хочу сказать о том, что такие проекты не имеют определённый срок. 3)В электронике я не силён, мало опыта. Поэтому могу только предположить как именно это должно работать. Коллективом опытных людей эта задача должна решаться легко( поэтому я тут). 4)Под клавишами сантиметра три-четыре дерева(может чуть больше/меньше), в которые можно установить механизмы. Провода от них так же можно вывести в этой же древесине( на край насквозь вниз, и скрыть кожухом). Платы управления никто не мешает спрятать в пустых полостях или вообще, отдельно от пианино в своём корпусе.

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

Вы видите динамик-пищалку (BUZZER), проводники черный на GND и красный на двенадцатом пине.

Buzzer - пищалка на монтажной плате

Давайте напишем небольшой скетч, в котором мы сможем проигрывать мелодии по нотам.

Для этого нам нужно будет объявить массив, который у нас будет называется мелодия, в нём будут перечислены ноты, которые будут идти по порядку их здесь 8 штук.

Также объявим переменную типа int с названием duration , это у нас будет длительность 500 миллисекунд.

В setup мы ничего не пишем, а в подпрограмме loop у нас будет работать цикл, в котором счетчик thisNote будет увеличиваться на единицу от нуля до восьми.

Будем использовать специальную функцию tone , которая на двенадцатом пине будет по одному проигрывать ноту из массива с длительностью равной 500 миллисекундам.

Так же в цикле делаем задержку в одну секунду, или 1000 миллисекунд, и добавим ещё одну задержку после цикла в 2 секунды, чтобы то у нас проигрывалась мелодия с паузой.

Добавим такую библиотеку, который пока у нас нет, сохраним наш скетч, нажмем комбинацию клавиш ctrl+Shift+N, добавим название нового файла pitches.h , OK.

Теперь нужно будет перейти на официальный сайт Arduino, сделать это нужно будет один раз, по этой ссылочке, и здесь нужно будет скопировать содержимое этой библиотеки в наш файл. Здесь в виде констант объявлены ноты с частотой звучания или высотой тона.

Сохраним нашу библиотеку. Ну и теперь можно подключать Arduino, выполнить проверку, всё отработало и теперь загрузим скетч. Мелодия повторяется через 2 секунды, интервал между нотами 1 секунда. Меняя параметры длительности, получится другое звучание. Можно составить какую-то мелодию, если сделать меньше задержку, ну а куда применить данную пищалку зависит от вашей фантазии.

Читайте также: