Пианино на Arduino с записью и воспроизведением звука

В этой статье мы рассмотрим создание на основе платы Arduino простого пианино, которое будет включать в себя 8 кнопок и зуммер. Для воспроизведения звука с помощью Arduino будет использоваться функция tone(). Чтобы сделать проект более интересным мы добавили в него функцию записи мелодии, которую вы сыграли. Записанную мелодию можно затем прослушать в любое время.

Внешний пианино на основе платы Arduino

Необходимые компоненты

Плата Arduino Uno
ЖК дисплей 16х2
Зуммер (Buzzer)
Конденсатор точной настройки (Trimmer) 10k
Переключатель SPDT типа
Кнопки – 8 шт.
Резистор 10 кОм, 560 Ом, 1,5 кОм, 2,6 кОм, 3,9 кОм, 5,6 кОм, 6,8 кОм, 8,2 кОм, 10 кОм
Макетная плата
Соединительные провода

Работа схемы

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

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

Внешний вид собранного на макетной плате пианино

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

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

Принципиальная схема пианино на основе платы 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 В.

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

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

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

Синтаксис
tone(pin, frequency)
tone(pin, frequency, duration)
Параметры
pin: контакт, на котором необходимо генерировать частоту (тон)
frequency: частота тона в герцах - unsigned int
duration: продолжительность тона в миллисекундах (опционально) - unsigned long

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

Проигрывание мелодий пианино с помощью Arduino

Мы знаем что мы можем проигрывать различные звуки с помощью функции Tone() платы Arduino. Но каким образом проигрывать с помощью этой функции определенные музыкальные ноты? Для этой цели можно использовать, к примеру, специальную библиотеку под названием “pitches.h”, которую написал Brett Hagman. Эта библиотека содержит всю необходимую информацию о частотах, которые соответствуют каждой музыкальной ноте. В нашем предыдущем аналогичном музыкальном проекте (в нем вы можете более подробно прочитать об использовании данной библиотеки) мы использовали эту библиотеку для проигрывания таких мелодий как Pirates of Caribbean, Crazy Frog, Mario и даже titanic – и это звучало превосходно.

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

В этом проекте мы будем использовать следующие музыкальные ноты - C4, D4, E4, F4, G4, A4, B4 и C5.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы рассмотрим его наиболее важные фрагменты.

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

В программе сначала мы должны объявить 8 используемых нот. Соответствующие частоты для этих нот будут браться из файла pitches.h и затем будет формироваться массив как показано в следующем фрагменте кода. К примеру, из данного массива следует, что ноте C4 будет соответствовать частота 262 и т.д.

Далее мы должны сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.

Далее, в функции setup мы должны инициализировать ЖК дисплей и порт последовательной связи для целей отладки. Также мы будем высвечивать на экране ЖК дисплея приветственное сообщение. Далее, в функции loop у нас будет два цикла while.

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

Внутри этого цикла, как вы могли заметить, используется две функции: Detect_button() – для определения нажатой пользователем кнопки (клавиши) и Play_tone() – для проигрывания соответствующей мелодии. В функции Detect_button() также записывается какая кнопка была нажата, а в функции Play_tone() записывается как долго была кнопка нажата.

Внутри функции Detect_button() мы считываем аналоговое значение напряжения с контакта A0 и затем сравниваем его с заранее определенными значениями чтобы определить какая кнопка была нажата. Проверить, какое значение будет на выходе АЦП контакта A0 в зависимости от нажатой кнопки, можно в окне монитора последовательной связи (serial monitor).

Также в этой функции мы производим запись нажатых клавиш в массив recorded_button[]. Сначала мы проверяем нажата ли новая кнопка, если да, то проверяем не является ли она кнопкой 0. Здесь под кнопкой 0 мы подразумеваем что ни одна из кнопок не нажата. Далее мы производим запись нажатой кнопки в массив и увеличиваем индекс массива (по которому мы производим запись) на 1 чтобы значения новых кнопок не затирали значения старых кнопок.

Внутри функции Play_tone() мы проигрываем мелодию соответствующую нажатой кнопке. Делаем мы это с помощью многочисленных условий if. Также внутри этой функции мы записываем длительность нажатия кнопок в массив recorded_time[]. Операции те же самые, что и при записи последовательности нажатых кнопок, для определения длительности нажатия кнопки мы используем функцию millis(). Для уменьшения размерности переменной делим полученное значение длительности на 10. Для кнопки 0 (то есть ни одна из кнопок не нажата) мы не проигрываем никакой мелодии.

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

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

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

Работа пианино во время записи музыки

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

Работа пианино во время воспроизведения музыки

Исходный код программы

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

Видео, демонстрирующее работу пианино

(Проголосуй первым!)
Загрузка...
113 просмотров


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *