- Необхідні матеріали:
- Кругова діаграма:
- Схеми та пояснення:
- Розуміння
- Гра на фортепіанних тонах на Arduino:
- Програмування Arduino:
- Відтворюйте, записуйте, відтворюйте та повторюйте! :
Arduino став благом для людей, які не з електроніки, легко створювати речі. Це був чудовий інструмент для створення прототипів або спробувати щось круте, у цьому проекті ми збираємося створити маленьке, але веселе фортепіано за допомогою Arduino. Це фортепіано є досить простим лише з 8 кнопками та зуммером. Він використовує функцію tone () Arduino для створення різних типів фортепіанних нот на динаміку. Щоб трохи оживити це, ми додали в проект функцію запису, це дозволяє нам відтворювати мелодію і записувати її повторно, коли це потрібно. Звучить цікаво правильно !! Тож давайте будувати….
Необхідні матеріали:
- Arduino Uno
- 16 * 2 РК-дисплей
- Зумер
- Триммер 10к
- Перемикач SPDT
- Кнопка (8 ні)
- Резистори (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Макет
- Підключення проводів
Кругова діаграма:
Повний проект Arduino Piano можна побудувати на макеті з деякими сполучними проводами. Принципова схема, зроблена з використанням фризування, що показує макет проекту, наведена нижче
Просто дотримуйтесь принципової схеми та підключіть дроти відповідно, кнопки та зуммер, як це було використано з модулем друкованої плати, але в реальному обладнанні ми використовували лише перемикач та зумер, це не повинно вас сильно бентежити, оскільки вони мають однаковий вивід. Ви також можете звернутися до зображення апаратного забезпечення нижче, щоб встановити з’єднання.
Значення резисторів зліва в такому порядку: 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k і 10k. Якщо у вас немає того самого перемикача DPST, ви можете використовувати звичайний тумблер, як показано на схемі вище. Тепер давайте розглянемо схеми проекту, щоб зрозуміти, чому ми встановили такі зв’язки.
Схеми та пояснення:
Наведені вище схеми схеми, наведені вище, також були зроблені за допомогою Fritzing.
Одним з основних зв’язків, який ми повинні розуміти, є те, як ми підключили 8 кнопок до Arduino через аналоговий штифт A0. В основному нам потрібні 8 вхідних штифтів, які можна підключити до 8 вхідних кнопок, але для подібних проектів ми не можемо використовувати 8 штифтів мікроконтролера лише для кнопок, оскільки вони можуть нам знадобитися для подальшого використання. У нашому випадку ми маємо підключення РК-дисплея.
Таким чином, ми використовуємо аналоговий штифт Arduino і формуємо дільник потенціалу з різними значеннями резистора для завершення схеми. Таким чином, при натисканні кожної кнопки на аналоговий штифт буде подаватися інша аналогова напруга. Зразок схеми лише з двома резисторами та двома кнопками показано нижче.
У цьому випадку штифт АЦП отримає + 5 В, коли кнопки не натиснуті; якщо натиснути першу кнопку, то ділитель потенціалу завершується через резистор 560R, а якщо натиснути другу кнопку, потенційний дільник конкурує за допомогою 1,5 k резистор. Таким чином напруга, що надходить на штифт АЦП, буде змінюватися залежно від формул дільника потенціалу. Якщо ви хочете дізнатись більше про те, як працює потенційний дільник і як розрахувати значення напруги, що надходить на штифт АЦП, ви можете скористатися цією сторінкою калькулятора потенційних дільників.
Крім цього, всі з'єднання прямі вперед, РК-дисплей підключений до висновків 8, 9, 10, 11 і 12. Зуммер підключений до виводу 7, а перемикач SPDT - до виводу 6 Arduino. Повний проект живиться через USB-порт ноутбука. Ви також можете підключити Arduino до джерела живлення 9 В або 12 В через роз'єм постійного струму, і проект все одно працюватиме незмінно.
Розуміння
Arduino має зручну функцію тону (), яка може бути використана для генерації сигналів різної частоти, які можна використовувати для створення різних звуків за допомогою зумера. Тож давайте розберемося, як функція працює і як її можна використовувати з Arduino.
До цього ми повинні знати, як працює п’єзо-зумер. Ми могли б дізнатися про кристали П'єзо в нашій школі, це не що інше, як кристал, який перетворює механічні коливання в електрику або навпаки. Тут ми застосовуємо змінний струм (частоту), для якого кристал вібрує, створюючи таким чином звук. Отже, щоб змусити п’єзозуммер видавати якийсь шум, ми повинні змусити п’єзоелектричний кристал вібрувати, висота та тон шуму залежать від того, як швидко кристал вібрує. Отже, тоном і висотою звуку можна керувати, змінюючи частоту струму.
Добре, так як же нам отримати змінну частоту від Arduino? Тут з’являється функція tone (). Ton () може генерувати певну частоту на певному штифті. За необхідності також можна вказати тривалість часу. Синтаксис для tone () є
Синтаксичний тон (пін, частота) тон (пін, частота, тривалість) Параметри пін: пін, на якому генерується частота тону: частота тону в герцах - беззнакова тривалість int: тривалість тону в мілісекундах (необов’язково1) - без підпису довгий
Значення pin можуть бути будь-якими з ваших цифрових 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, а потім формується масив, як показано нижче. Тут частота відтворення ноти С4 дорівнює 262 тощо.
int примітки = {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.
Цикл One 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; якщо (analogVal <500) кнопка = 7; якщо (analogVal <450) кнопка = 6; якщо кнопка (analogVal <400) = 5; якщо кнопка (analogVal <300) = 4; якщо (analogVal <250) кнопка = 3; якщо (analogVal <150) кнопка = 2; якщо (analogVal <100) кнопка = 1; якщо (analogVal> 1000) кнопка = 0; / **** Зафіксуйте натиснуті кнопки в масиві *** / if (button! = pev_button && pev_button! = 0) { записаний_кнопка = pev_button; button_index ++; кнопка_записаного = 0; button_index ++; } / ** Кінець програми запису ** / }
Як вже було сказано, всередині цієї функції ми також записуємо послідовність натискання кнопок. Записані значення зберігаються в масиві з назвою записаний_кнопка. Спочатку ми перевіряємо, чи натиснута нова кнопка, якщо натиснута, тоді ми також перевіряємо, чи не є це кнопка 0. Де кнопка 0 - це ніщо інше, як жодна кнопка не натиснута. Усередині циклу if ми зберігаємо значення в розташуванні індексу, заданому змінною button_index, а потім ми також збільшуємо це значення індексу, щоб не переписувати те саме місце.
/ **** Зафіксуйте натиснуті кнопки в масиві *** / if (button! = Pev_button && pev_button! = 0) { zapisa_button = pev_button; button_index ++; кнопка_записаного = 0; button_index ++; } / ** Кінець програми запису ** /
Усередині Play_tone () функції ми будемо грати відповідний тон натиснутою кнопки, використовуючи мультиплікатор, якщо умови. Також ми будемо використовувати масив з назвою записаний_ час, всередині якого ми збережемо час, протягом якого була натиснута кнопка. Операція подібна до запису послідовності кнопок, оскільки ми використовуємо функцію millis (), щоб визначити, як довго була натиснута кожна кнопка, також для зменшення розміру змінної ми ділимо значення на 10. Для кнопки 0, що означає, що користувач не натискаючи що-небудь, ми не відтворюємо тон протягом тієї ж тривалості. Повний код усередині функції наведено нижче.
void Play_tone () { / **** Зафіксуйте затримку часу між кожним натисканням кнопки в масиві *** / if (button! = pev_button) { lcd.clear (); // Потім очистіть note_time = (millis () - start_time) / 10; записаний_ час = час_нот; time_index ++; час_початку = міліс (); } / ** Кінець програми запису ** / if (button == 0) { noTone (7); lcd.print ("0 -> Пауза.."); } if (button == 1) { tone (7, примітки); lcd.print ("1 -> ПРИМІТКА_C4"); } if (button == 2) { tone (7, примітки); lcd.print ("2 -> ПРИМІТКА_D4"); } якщо (кнопка == 3) { тон (7, примітки); lcd.print ("3 -> ПРИМІТКА_E4"); } if (button == 4) { tone (7, примітки); lcd.print ("4 -> NOTE_F4"); } if (button == 5) { tone (7, примітки); lcd.print ("5 -> NOTE_G4"); } if (кнопка == 6) { tone (7, примітки); lcd.print ("6 -> ПРИМІТКА_A4"); } if (кнопка == 7) { tone (7, примітки); lcd.print ("7 -> ПРИМІТКА_B4"); } if (кнопка == 8) { tone (7, примітки); lcd.print ("8 -> NOTE_C5"); } }
Нарешті, після запису користувач повинен переключити DPST в інший бік, щоб відтворити записаний тон. Коли це буде зроблено програмними перерви з попередніх в той час як петлі і входить в секунду в той час як цикл, в якому ми граємо ноти в послідовності кнопок пресованих в протягом часу, який раніше був записаний. Код, щоб зробити те ж саме, показано нижче.
while (digitalRead (6) == 1) // Якщо тумблер встановлений у режимі відтворення { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Зараз грає.."); для (int i = 0; i <sizeof (кнопка_записаного) / 2; i ++) { затримка ((записаний_ час) * 10); // Зачекайте, перш ніж заплатити наступну мелодію, якщо (записана_кнопка == 0) noTone (7); // користувач dint торкається будь-якої кнопки else tone (7, примітки - 1)]); // відтворюємо звук, відповідний кнопці, яку торкнувся користувач } } }
Відтворюйте, записуйте, відтворюйте та повторюйте!:
Зробіть апаратне забезпечення відповідно до схеми, показаної на малюнку, і завантажте код на плату Arduino та вказаний час. Розмістіть SPDT в режимі запису та починайте відтворювати вибрані вами тони, натискання кожної кнопки видасть інший тон. Під час цього режиму на РК-дисплеї відображатиметься « Запис…», а у другому рядку ви побачите назву ноти, яка зараз натискається, як показано нижче
Після відтворення звуку переключіть перемикач SPDT на іншу сторону, і на РК-дисплеї відображатиметься повідомлення " Зараз відтворюється..", а потім розпочніть відтворення звуку, який ви щойно відтворили. Той самий тон буде відтворюватися знову і знову, доки тумблер буде утримуватися в положенні, як показано на малюнку нижче.
Повну роботу проекту можна знайти у відео, поданому нижче. Сподіваюся, ви зрозуміли проект і сподобалось його будувати. Якщо у вас виникли проблеми зі створенням цього повідомлення, розмістіть їх у розділі коментарів або скористайтеся форумами для отримання технічної допомоги щодо вашого проекту. Також не забудьте переглянути демонстраційне відео, подане нижче.