Привіт, хлопці, протягом останніх кількох тижнів я працював над відновленням зв'язку зі своєю любов’ю до гітари. Граючи на бокс-гітарі, я розслаблявся кілька років тому, перш ніж саксофон взяв на себе. Повертаючись до гітари, після 3-х років рідкісного барабанення акорду, серед іншого, я виявив, що вже не знаю, як повинна звучати кожна струна, якщо сказати словами мого друга: «Слух у мене вже не налаштований» і в результаті цього я не зміг налаштувати гітару без допомоги клавіатури або мобільного додатка, який пізніше завантажив. Тижні йшли кілька днів тому, коли виробник у мене став мотивованим, і я вирішив створити тюнер для гітари на базі Arduino. У сьогоднішньому підручнику я розповім, як створити власний тюнер для гітари DIY Arduino.
Як працює гітарний тюнер
Перш ніж перейти до електроніки, важливо зрозуміти принцип побудови. Є 7 основних музичних нот, що позначаються алфавітами; A, B, C, D, E, F, G і зазвичай закінчуються іншим A, який завжди на октаву вище першого A. У музиці існує кілька версій цих нот, як перша A і остання A. Ці ноти відрізняються кожен від їх варіації та один від одного за однією з характеристик звуку, відомою як висота. Висота звуку визначається як гучність або низький рівень звуку, що позначається частотою цього звуку. Оскільки частота цих нот відома, для того, щоб визначити, налаштована гітара чи ні, нам потрібно лише порівняти частоту ноти конкретного струна з фактичною частотою ноти, яку представляє струна.
Частотами 7 музичних нот є:
A = 27,50 Гц
B = 30,87 Гц
C = 16,35 Гц
D = 18,35 Гц
E = 20,60 Гц
F = 21,83 Гц
G = 24,50 Гц
Кожна варіація цих нот завжди має висоту, рівну FxM, де F - частота, а M - ненульове ціле число. Таким чином, для останнього А, який, як описано раніше, на октаву перевищує перший А, частота становить;
27,50 х 2 = 55 Гц.
Гітара (Lead / box гітара) зазвичай має 6 струн, що позначаються нотами E, A, D, G, B, E на відкритій струні. Як зазвичай, остання Е буде на октаву вище, ніж перша Е. Ми розробимо наш гітарний тюнер, щоб допомогти налаштувати гітару, використовуючи частоти цих нот.
Відповідно до стандартного налаштування гітари, нота та відповідна частота кожної струни наведені в таблиці нижче.
Струни |
Частота |
Позначення |
1 (E) |
329,63 Гц |
E4 |
2 (Б) |
246,94 Гц |
B3 |
3 (G) |
196,00 Гц |
G3 |
4 (D) |
146,83 Гц |
D3 |
5 (А) |
110,00 Гц |
А2 |
6 (E) |
82,41 Гц |
E2 |
Потік проекту досить проста; ми перетворюємо звуковий сигнал, що генерується гітарою, на частоту, а потім порівнюємо з точним значенням частоти струну, що настроюється. Гітарист отримує сповіщення за допомогою світлодіода, коли значення співпадає.
Визначення / перетворення частоти включає 3 основні етапи;
- Посилюючий
- Залік
- Аналого-цифрове перетворення (дискретизація)
Вироблений звуковий сигнал буде занадто слабким, щоб АЦП Arduino розпізнавав, тому нам потрібно посилити сигнал. Після посилення, щоб зберегти сигнал у діапазоні, розпізнаваному АЦП Arduino, щоб запобігти відсіканню сигналу, ми компенсуємо напругу сигналу. Після компенсації сигнал потім передається в АЦП Arduino, де він дискретизується і отримується частота цього звуку.
Необхідні компоненти
Для побудови цього проекту необхідні наступні компоненти;
- Arduino Uno x1
- LM386 x1
- Конденсаторний мікрофон x1
- Роз'єм для мікрофона / аудіо x1
- Потенціометр 10k x1
- O.1uf конденсатор x2
- Резистор 100 Ом x4
- Резистор 10 Ом x1
- Конденсатор 10 мкф x3
- 5мм жовтий світлодіод x2
- 5 мм зелений світлодіод x1
- Зазвичай відкриті кнопки x6
- Провід перемички
- Макет
Схеми
Підключіть компоненти, як показано на схемі гітарного тюнера нижче.
Кнопки підключені без підтягуючих вгору / вниз резисторів, оскільки будуть використовуватися вбудовані резистори підтяжки Arduino. Це для того, щоб схема була якомога простішою.
Код Arduino для гітарного тюнера
Алгоритм коду для цього проекту Guitar Tuner є простим. Щоб налаштувати конкретну струну, гітарист вибирає струну, натискаючи відповідну кнопку, і грає грати на відкриту струну. Звук збирається підсилювачем і передається на Arduino ADC. Частота декодується і порівнюється. Коли вхідна частота з рядка менше заданої частоти, для цього рядка загоряється один із жовтих світлодіодів, що вказує на те, що струна повинна бути затягнута. Коли виміряна частота перевищує встановлену частоту для цього рядка, загоряється інший світлодіод. Коли частота знаходиться в межах встановленого діапазону для цієї струни, зелений світлодіод загоряється, щоб вести гітариста.
Повний код Arduino наведено в кінці, тут ми коротко пояснили важливі частини коду.
Ми починаємо зі створення масиву для утримання перемикачів.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Далі ми створюємо масив, щоб утримувати відповідну частоту для кожного з рядків.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // все в Гц
Після цього ми оголошуємо контакти, до яких підключені світлодіоди, та інші змінні, які будуть використовуватися для отримання частоти від АЦП.
int lowerLed = 7; int higherLed = 6; int justRight = 5; #define LENGTH 512 байт rawData; int count;
Далі - функція void setup () .
Тут ми починаємо з включення внутрішнього підтягування Arduino для кожного з контактів, до яких підключені комутатори. Після чого ми встановлюємо виходи, до яких підключені світлодіоди, і запускаємо послідовний монітор для відображення даних.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (нижній світлодіод, ВИХІД); pinMode (higherLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Далі, це функція порожнечі петлі , ми реалізуємо виявлення та порівняння частоти.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } ще { сума = 0; pd_state = 0; період int = 0; for (i = 0; i <len; i ++) { // Автокореляція sum_old = sum; сума = 0; для (k = 0; k <len-i; k ++) сума + = (rawData-128) * (rawData-128) / 256; // Serial.println (сума); // Пік виявлення автомата машини if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } if (pd_state == 1 && (sum> thresh) && (sum-sum_old)> 0) pd_state = 2; якщо (! i) { обмолот = сума * 0,5; pd_state = 1; } } // Частота, визначена в Гц, якщо (молоти> 100) { freq_per = sample_freq / period; Serial.println (freq_per); for (int s = 0; s <= 5; s ++) { if (digitalRead (buttonarray) == HIGH) { if (freq_per - freqarray <0) { digitalWrite (lowerLed, HIGH); } інакше if (freq_per - freqarray> 10) { digitalWrite (higherLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } кол = 0; } }
Повний код з демонстраційним відео наводиться нижче. Завантажте код на свою плату Arduino і відштовхуйтеся.