- Необходимые материалы:
- Принципиальная электрическая схема:
- Схема и объяснение:
- Понимание
- Воспроизведение фортепианных тонов на Arduino:
- Программирование Arduino:
- Играйте, записывайте, воспроизводите и повторяйте! :
Arduino был подарком для людей, не имеющих опыта работы в электронике, в плане легкости сборки. Это был отличный инструмент для создания прототипов, или, чтобы попробовать что-то классное, в этом проекте мы собираемся построить небольшое, но забавное пианино с использованием Arduino. Это пианино довольно простое: всего 8 кнопок и зуммер. Он использует функцию тона () Arduino для создания различных типов фортепианных нот на динамике. Чтобы немного оживить его, мы добавили в проект функцию записи, это позволяет нам проигрывать мелодию, записывать ее и проигрывать повторно, когда это необходимо. Звучит интересно! Итак, приступим к строительству….
Необходимые материалы:
- Ардуино Уно
- ЖК-дисплей 16 * 2
- Зуммер
- Триммер 10к
- Переключатель SPDT
- Нажимная кнопка (8 шт.)
- Резисторы (10 кОм, 560R, 1,5 кОм, 2,6 кОм, 3.9, 5,6 кОм, 6,8 кОм, 8,2 кОм, 10 кОм)
- Макетная плата
- Соединительные провода
Принципиальная электрическая схема:
Полный проект Arduino Piano Project может быть построен на макете с некоторыми соединительными проводами. Принципиальная схема, сделанная с использованием фритзинга, демонстрирующая макет проекта, показана ниже.
Просто следуйте принципиальной схеме и подключите провода соответственно, кнопки и зуммер, как используется с модулем печатной платы, но в реальном оборудовании мы использовали только переключатель и зуммер, это не должно вас сильно смущать, потому что они имеют одинаковый тип контактов.. Вы также можете обратиться к приведенному ниже изображению оборудования для выполнения подключений.
Номиналы резисторов слева находятся в следующем порядке: 10 кОм, 560R, 1,5 кОм, 2,6 кОм, 3,9, 5,6 кОм, 6,8 кОм, 8,2 кОм и 10 кОм. Если у вас нет такого же переключателя DPST, вы можете использовать обычный переключатель, подобный показанному на принципиальной схеме выше. Теперь давайте посмотрим на схемы проекта, чтобы понять, почему мы сделали следующие подключения.
Схема и объяснение:
Принципиальная электрическая схема, показанная выше, представлена ниже, она также была сделана с использованием Fritzing.
Одно из основных обстоятельств, которое мы должны понять, это то, как мы подключили 8 кнопок к Arduino через аналоговый вывод A0. В основном нам нужно 8 входных контактов, которые можно подключить к 8 входным кнопкам, но для проектов, подобных этому, мы не можем использовать 8 контактов микроконтроллера только для кнопок, поскольку они могут понадобиться нам для дальнейшего использования. В нашем случае у нас есть ЖК-дисплей для сопряжения.
Поэтому мы используем аналоговый вывод Arduino и формируем делитель потенциала с различными значениями резисторов, чтобы завершить схему. Таким образом, при нажатии каждой кнопки на аналоговый вывод будет подаваться разное аналоговое напряжение. Ниже показан пример схемы с двумя резисторами и двумя кнопками.
В этом случае на вывод ADC будет поступать + 5 В, когда кнопки не нажаты, если первая кнопка нажата, то делитель потенциала завершается через резистор 560R, а если нажата вторая кнопка, то делитель потенциала конкурирует с использованием 1,5 резистор k. Таким образом, напряжение на выводе АЦП будет изменяться в зависимости от формулы делителя потенциала. Если вы хотите узнать больше о том, как работает делитель потенциала и как рассчитать значение напряжения, полученного на выводе АЦП, вы можете использовать эту страницу калькулятора делителя потенциала.
В остальном все соединения прямые, ЖК-дисплей подключен к контактам 8, 9, 10, 11 и 12. Зуммер подключен к контакту 7, а переключатель SPDT подключен к контакту 6 Arduino. Полный проект питается от USB-порта ноутбука. Вы также можете подключить Arduino к источнику питания 9 В или 12 В через разъем постоянного тока, и проект по-прежнему будет работать.
Понимание
В Arduino есть удобная функция tone (), которую можно использовать для генерации сигналов различной частоты, которые можно использовать для создания различных звуков с помощью зуммера. Итак, давайте разберемся, как работает функция и как ее можно использовать с Arduino.
Перед этим мы должны знать, как работает пьезо-зуммер. Возможно, мы узнали о пьезокристаллах в нашей школе, это не что иное, как кристалл, который преобразует механические колебания в электричество или наоборот. Здесь мы применяем переменный ток (частоту), при котором кристалл вибрирует, производя звук. Следовательно, чтобы заставить пьезо-зуммер издавать некоторый шум, мы должны заставить пьезоэлектрический кристалл вибрировать, высота и тон шума зависят от того, насколько быстро вибрирует кристалл. Следовательно, тон и высоту звука можно контролировать, изменяя частоту тока.
Хорошо, а как же нам получить переменную частоту от Arduino? Здесь на помощь приходит функция tone (). Функция tone () может генерировать определенную частоту на определенном контакте. При необходимости также можно указать продолжительность. Синтаксис для tone ():
Синтаксис тон (вывод, частота) тон (вывод, частота, продолжительность) Параметры pin: вывод, на котором будет генерироваться тон частота: частота тона в герцах - unsigned int duration: длительность тона в миллисекундах (необязательно1) - беззнаковый длинный
Значения pin могут быть любыми из вашего цифрового вывода. Я использовал здесь контакт номер 8. Частота, которую можно сгенерировать, зависит от размера таймера на вашей плате Arduino. Для UNO и большинства других распространенных плат минимальная частота может быть 31 Гц, а максимальная частота 65535 Гц. Однако мы, люди, можем слышать только частоты от 2000 Гц до 5000 Гц.
Воспроизведение фортепианных тонов на Arduino:
Хорошо, прежде чем я даже начну заниматься этой темой, позвольте мне прояснить, что я новичок в музыкальных нотах или фортепиано, поэтому, пожалуйста, простите меня, если что-либо, упомянутое в этом заголовке, является тарабарщиной.
Теперь мы знаем, что мы можем использовать функцию тонов в Arduino для создания некоторых звуков, но как мы можем воспроизводить тоны конкретной ноты, используя их. К счастью для нас есть библиотека под названием «pitches.h», написанная Бреттом Хагманом. Эта библиотека содержит всю информацию о том, какая частота соответствует какой ноте на фортепиано. Я был удивлен тем, насколько хорошо эта библиотека могла работать и воспроизводить практически каждую ноту на пианино. Я использовал то же самое, чтобы играть фортепианные ноты Пиратов Карибского моря, Безумной лягушки, Марио и даже титаника, и они звучали потрясающе. Ой! Здесь мы немного не по теме, поэтому, если вам это интересно, попробуйте проигрывать мелодии с помощью проекта Arduino. Вы также найдете больше объяснений о библиотеке pitches.h в этом проекте.
В нашем проекте всего 8 кнопок, поэтому каждая кнопка может воспроизводить только одну конкретную музыкальную ноту, и, таким образом, всего мы можем сыграть только 8 нот. Я выбрал наиболее часто используемые ноты на пианино, но вы можете выбрать любые 8 или даже расширить проект с помощью дополнительных кнопок и добавить больше нот.
Ноты, выбранные в этом проекте, - это ноты C4, D4, E4, F4, G4, A4, B4 и C5, которые можно играть с помощью кнопок с 1 по 8 соответственно.
Программирование Arduino:
Достаточно теории, чтобы перейти к интересной части программирования Arduino. Полная программа Arduino приводится в конце этой страницы вы можете перейти вниз, если вы готовы или читать дальше, чтобы понять, как работает код.
В нашей программе Arduino мы должны считать аналоговое напряжение с контакта A0, затем предсказать, какая кнопка была нажата, и воспроизвести соответствующий тон для этой кнопки. При этом мы также должны записывать, какую кнопку нажимал пользователь и как долго он / она нажимал, чтобы мы могли воссоздать тон, который играл пользователь позже.
Прежде чем перейти к логической части, мы должны объявить, какие 8 нот мы будем играть. Соответствующая частота нот затем берется из библиотеки pitches.h, а затем формируется массив, как показано ниже. Здесь частота воспроизведения ноты C4 равна 262 и так далее.
int notes = {262, 294, 330, 349, 392, 440, 494, 523}; // Установить частоту для C4, D4, E4, F4, G4, A4, B4,
Далее мы должны упомянуть, к каким контактам подключен ЖК-дисплей. Если вы следуете той же схеме, приведенной выше, вам не нужно здесь ничего менять.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Контакты, к которым подключен ЖК-дисплей LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Затем внутри нашей функции настройки мы просто инициализируем ЖК-модуль и последовательный монитор для отладки. Мы также отображаем вводное сообщение, чтобы убедиться, что все работает по плану. Затем внутри функции основного цикла у нас есть два цикла while.
Один цикл while будет выполняться, пока переключатель SPDT находится в режиме записи. В режиме записи пользователь может оплачивать требуемые тоны, и в то же время воспроизводимый тон также будет сохранен. Итак, цикл while выглядит так, как показано ниже
while (digitalRead (6) == 0) // Если тумблер установлен в режим записи {lcd.setCursor (0, 0); lcd.print («Запись..»); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Как вы могли заметить , внутри цикла while есть две функции. Первая функция Detect_button () используется для поиска кнопки, нажатой пользователем, а вторая функция Play_tone () используется для воспроизведения соответствующего тона. Помимо этой функции, функция Detect_button () также записывает, какая кнопка была нажата, а функция Play_tone () записывает, как долго была нажата кнопка.
Внутри Detect_button () функции мы читаем аналоговое напряжение от штыря A0 и сравнить его с некоторыми предопределенными значениями, чтобы выяснить, какая кнопка была нажата. Значение может быть определено либо с помощью калькулятора делителя напряжения выше, либо с помощью монитора последовательного порта, чтобы проверить, какое аналоговое значение считывается для каждой кнопки.
void Detect_button () { analogVal = analogRead (A0); // считываем аналоговое напряжение на выводе A0 pev_button = button; // запоминаем предыдущую кнопку, нажатую пользователем if (analogVal <550) button = 8; if (analogVal <500) button = 7; if (analogVal <450) button = 6; if (analogVal <400) button = 5; if (analogVal <300) button = 4; if (analogVal <250) button = 3; if (analogVal <150) button = 2; if (analogVal <100) button = 1; if (analogVal> 1000) button = 0; / **** Записать нажатые кнопки в массив *** / если (кнопка! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; record_button = 0; button_index ++; } / ** Конец программы записи ** / }
Как уже говорилось, внутри этой функции мы также записываем последовательность нажатия кнопок. Записанные значения хранятся в массиве с именем loaded_button. Сначала мы проверяем, нажата ли новая кнопка, если нажата, то мы также проверяем, не является ли это кнопкой 0. Где кнопка 0 - ничего, но никакая кнопка не нажата. Внутри цикла if мы сохраняем значение в позиции индекса, заданной переменной button_index, а затем мы также увеличиваем это значение индекса, чтобы не перезаписывать в том же месте.
/ **** Записать нажатые кнопки в массив *** / if (button! = Pev_button && pev_button! = 0) { loaded_button = pev_button; button_index ++; record_button = 0; button_index ++; } / ** Конец программы записи ** /
Внутри Play_tone () функции мы будем играть соответствующий тон нажатой кнопки, используя мультипликатор, если условия. Также мы будем использовать массив с именем loaded_time, внутри которого мы будем сохранять время, в течение которого была нажата кнопка. Операция аналогична записи последовательности кнопок, поскольку мы используем функцию millis (), чтобы определить, как долго каждая кнопка была нажата, а также для уменьшения размера переменной мы делим значение на 10. Для кнопки 0, что означает, что пользователь не нажатие чего-либо, мы не воспроизводим звук в течение того же времени. Полный код внутри функции показан ниже.
void Play_tone () { / **** Rcord время задержки между каждым нажатием кнопки в массиве *** / if (button! = pev_button) { lcd.clear (); // Затем очищаем note_time = (millis () - start_time) / 10; record_time = note_time; time_index ++; start_time = миллис (); } / ** Конец программы записи ** / if (button == 0) { noTone (7); lcd.print ("0 -> Пауза.."); } если (кнопка == 1) { тон (7, примечания); lcd.print ("1 -> NOTE_C4"); } если (кнопка == 2) { тон (7, примечания); lcd.print («2 -> NOTE_D4»); } если (кнопка == 3) { тон (7, примечания); lcd.print («3 -> NOTE_E4»); } если (кнопка == 4) { тон (7, примечания); lcd.print («4 -> NOTE_F4»); } если (кнопка == 5) { тон (7, примечания); lcd.print («5 -> NOTE_G4»); } если (кнопка == 6) { тон (7, примечания); lcd.print («6 -> NOTE_A4»); } если (кнопка == 7) { тон (7, примечания); lcd.print («7 -> NOTE_B4»); } если (кнопка == 8) { тон (7, примечания); lcd.print («8 -> NOTE_C5»); } }
Наконец, после записи пользователь должен переключить DPST в другое направление, чтобы воспроизвести записанный тон. Когда это будет сделано программными перерывы из предыдущих в то время как петли и входит в секунду в то время как цикл, в котором мы играем ноты в последовательности кнопок прессованных в течение времени, который ранее был записан. Код, позволяющий сделать то же самое, показан ниже.
while (digitalRead (6) == 1) // Если тумблер установлен в режим воспроизведения { lcd.clear (); lcd.setCursor (0, 0); lcd.print («Сейчас играет..»); для (int я = 0; я <размер (записанная_ кнопка) / 2; я ++) { задержка ((время записи) * 10); // Ждем перед оплатой следующей мелодии if ( loaded_button == 0) noTone (7); // пользователь не нажимает любую кнопку else tone (7, notes - 1)]); // воспроизводим звук, соответствующий кнопке, нажатой пользователем } } }
Играйте, записывайте, воспроизводите и повторяйте!:
Сделайте оборудование в соответствии с показанной схемой и загрузите код на плату Arduino и указанное время. Установите SPDT в режим записи и начните воспроизводить выбранные вами тембры, при нажатии каждой кнопки будет воспроизводиться другой тон. В этом режиме на ЖК-дисплее будет отображаться « Запись…», а во второй строке вы увидите название ноты, которая в данный момент нажата, как показано ниже.
После того, как вы сыграли свой тон, переключите переключатель SPDT в другую сторону, и на ЖК-дисплее должно появиться сообщение « Now Playing…», а затем начните играть только что сыгранный тон. Один и тот же тон будет воспроизводиться снова и снова, пока тумблер находится в положении, показанном на рисунке ниже.
Полную работу проекта можно посмотреть в видео ниже. Надеюсь, вы поняли проект и получили удовольствие от его создания. Если у вас возникли проблемы с созданием этого проекта, напишите их в разделе комментариев или воспользуйтесь форумом для получения технической помощи по вашему проекту. Также не забудьте посмотреть демонстрационное видео, приведенное ниже.