Хочете зробити компактну музичну клавіатуру на Arduino з мінімальною кількістю компонентів? У цьому проєкті ви навчитеся використовувати резистивну драбину та аналоговий вхід, щоб задіяти кілька кнопок без перевантаження цифрових пінів.
Хоча можна просто підключити кілька кнопок до цифрових входів, щоб відтворювати різні тони, у цьому проєкті ви будете створювати резистивну драбину.
Це метод зчитування декількох кнопок за допомогою аналогового входу. Такий підхід стане в нагоді, якщо вам не вистачає цифрових пінів. Ви підключите кілька кнопок паралельно до A0. Більшість із них будуть з’єднані з живленням через резистори.
Коли ви натискаєте кнопку, на вхідний пін подається певний рівень напруги. Якщо натиснути дві кнопки одночасно, буде передаватися унікальне значення, яке залежить від співвідношення резисторів, з’єднаних паралельно.


Підключіть свою макетну плату до живлення та заземлення, як у попередніх проектах. Підключіть один кінець п’єзопровода до землі. Підключіть інший кінець до контакту 8 на Arduino.
Розмістіть перемикачі на макетній платі, як показано на схемі. Розташування резисторів і перемикачів, що подаються на аналоговий вхід, називається схемою резисторів. Підключіть перший безпосередньо до живлення. Підключіть другий, третій і четвертий перемикачі до живлення через резистор на 220 Ом, 10 кОм і 1 МОм відповідно. З’єднайте всі виходи перемикачів разом в одному з’єднанні. Підключіть це з’єднання до землі за допомогою резистора на 10 кОм, а також підключіть його до аналогового входу 0. Кожен з них діє як дільник напруги.
Подумайте про корпус для клавіатури. Хоча старі аналогові синтезатори мали дроти, що стирчали всюди, ваша клавіатура витончена та цифрова. Підготуйте невеликий шматок картону, який можна вирізати, щоб розмістити ваші кнопки. Позначте клавіші, щоб знати, які ноти запускає кожна клавіша.

У цій програмі вам потрібно зберігати список частот, які будуть відтворюватися при натисканні кнопок. Ви можете почати з частот для нот до, ре, мі та фа (262 Гц, 294 Гц, 330 Гц і 349 Гц). Для цього вам знадобиться новий тип змінної, який називається масивом.
Масив – це спосіб зберігати кілька взаємопов’язаних значень, наприклад, частоти у музичній гамі, використовуючи лише одну назву. Це зручний інструмент для швидкого та ефективного доступу до інформації. Щоб оголосити масив, почніть, як із звичайною змінною, але після назви додайте квадратні дужки []. Після знака рівності {} у фігурних дужках вкажіть значення.
Щоб зчитати або змінити значення в масиві, звертайтеся до конкретного елемента за назвою масиву та індексом потрібного значення. Індексація починається з нуля: перший елемент має індекс 0, другий – 1 і так далі.
Оголосіть масив із чотирьох нот, використовуючи наведені вище частоти. Цей масив повинен бути глобальною змінною, тому оголосіть його перед setup().
У setup() почніть серійний зв’язок з комп’ютером, щоб мати змогу виводити значення в монітор порту.
У loop() створіть локальну змінну, яка зберігатиме значення, отримане з порту A0. Оскільки кожна кнопка має унікальний резистор, кожне натискання відповідатиме певному значенню. Щоб побачити їх, додайте Serial.println(keyVal), щоб передавати дані до комп’ютера.
Використовуючи оператор if()...else, можна прив’язати кожне значення до відповідної ноти. Числові значення в прикладі є орієнтовними для цих резисторів. Оскільки всі резистори мають допуск похибки, точні значення можуть відрізнятися. Використовуйте інформацію з серійного монітора, щоб коригувати пороги для спрацювання нот.
int buttons[6];
// set up an array with 6 integers
int buttons[0] = 2;
// give the first element of the array the value 2
int notes[] = {262,294,330,349};
void setup() {
Serial.begin(9600);
}
void loop() {
int keyVal = analogRead(A0);
Serial.println(keyVal);
if(keyVal == 1023){
tone(8, notes[0]);
}
Після кожного оператора if() викликайте функцію tone(). Програма використовує масив для визначення частоти, яку потрібно відтворити. Якщо значення A0 збігається з одним із умов у if(), ви можете наказати Arduino зіграти відповідну ноту.
Через можливий електричний шум у схемі значення можуть трохи коливатися при натисканні кнопки. Щоб компенсувати ці зміни, краще перевіряти діапазон значень, а не конкретне число. Використовуючи оператор &&, можна перевіряти відразу кілька умов.
Якщо натиснута перша кнопка, відтвориться notes[0]. Якщо друга кнопка – notes[1], якщо третя – notes[2]. Тут особливо корисними стають масиви, оскільки вони дозволяють легко змінювати та розширювати програму.
Оскільки Arduino може відтворювати лише одну ноту на одному піні одночасно, при натисканні кількох кнопок ви почуєте тільки одну з них. Щоб зупинити звук, коли жодна кнопка не натиснута, викликайте функцію noTone(), передаючи в неї номер піну, на якому потрібно припинити звук.
Якщо значення ваших резисторів близькі до значень у прикладі програми, ви повинні почути деякі звуки від п’єзо, коли натискаєте кнопки. Якщо ні, перевірте послідовний монітор, щоб переконатися, що кожна з кнопок знаходиться в діапазоні, який відповідає приміткам у операторі if()…else. Якщо ви чуєте звук, який ніби заїкається, спробуйте трохи збільшити діапазон.
Натисніть кілька кнопок одночасно та подивіться, які значення ви отримуєте на моніторі послідовного порту. Використовуйте ці нові значення, щоб викликати ще більше звуків. Експериментуйте з різними частотами, щоб розширити свій музичний вихід. Ви можете знайти частоти музичних нот на цій сторінці: arduino.cc/frequencies
Якщо ви заміните перемикачі та сходи резисторів аналоговими датчиками, чи зможете ви використати додаткову інформацію, яку вони вам надають, для створення більш динамічного приладу? Ви можете використати значення, щоб змінити тривалість ноти або, як у проекті Терменвокс, створити ковзну шкалу звуків.
else if(keyVal >= 990 && keyVal <= 1010){
tone(8, notes[1]);
}
else if(keyVal >= 505 && keyVal <= 515){
tone(8, notes[2]);
}
else if(keyVal >= 5 && keyVal <= 10){
tone(8, notes[3]);
}
else{
noTone(8);
}
}
Функція tone() цікава для створення звуків, але вона має кілька обмежень. Він може створювати лише квадратні хвилі, а не гладкі синусоїди чи трикутники. Квадратні хвилі зовсім не схожі на хвилі. Як ви бачили на рис. 1 у проекті 6, це серія імпульсів увімкнення та вимкнення.
Коли ви починаєте свою групу, пам’ятайте про деякі речі: одночасно може відтворюватися лише один тон, і tone() заважатиме analogWrite() на контактах 3 і 11.
Масиви корисні для групування подібних типів інформації разом; доступ до них здійснюється за номерами індексів, які стосуються окремих елементів. Резисторні сходи — це простий спосіб отримати більше цифрових входів у систему шляхом підключення до аналогового входу.