Привет, ребята, последние несколько недель я работал над воссоединением со своей любовью к гитаре. Несколько лет назад я расслаблялся, играя на бокс-гитаре, до того, как на смену пришел саксофон. Вернувшись к гитаре, после 3 лет, когда я редко играл на аккордах, я обнаружил, среди прочего, что я больше не знаю, как должна звучать каждая струна, говоря словами моего друга: «Мой слух больше не был настроен» и В результате я не смог настроить гитару без помощи клавиатуры или мобильного приложения, которое я позже загрузил. Прошли недели, и несколько дней назад создатель во мне заинтересовался, и я решил создать гитарный тюнер на базе Arduino. В сегодняшнем уроке я расскажу, как создать свой собственный гитарный тюнер для 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 x 2 = 55 Гц.
Гитара (ведущая / коробчатая гитара) обычно имеет 6 струн, обозначенных нотами E, A, D, G, B, E на открытой струне. Как обычно, последняя E будет на октаву выше, чем первая E. Мы будем проектировать наш гитарный тюнер, чтобы настроить гитару, используя частоты этих нот.
В соответствии со стандартной настройкой гитары, ноты и соответствующая частота каждой струны показаны в таблице ниже.
Струны |
Частота |
Обозначение |
1 (E) |
329,63 Гц |
E4 |
2 (В) |
246,94 Гц |
B3 |
3 (G) |
196,00 Гц |
G3 |
4 (D) |
146,83 Гц |
D3 |
5 (А) |
110,00 Гц |
A2 |
6 (E) |
82,41 Гц |
E2 |
Ход проекта довольно прост; мы преобразуем звуковой сигнал, генерируемый гитарой, в частоту, а затем сравниваем с точным значением частоты настраиваемой струны. Когда значение коррелирует, гитарист получает уведомление с помощью светодиода.
Обнаружение / преобразование частоты включает 3 основных этапа;
- Усиливающий
- Взаимозачет
- Аналого-цифровое преобразование (выборка)
Создаваемый звуковой сигнал будет слишком слабым для распознавания АЦП Arduino, поэтому нам нужно усилить сигнал. После усиления, чтобы сохранить сигнал в пределах диапазона, распознаваемого АЦП Arduino, чтобы предотвратить ограничение сигнала, мы смещаем напряжение сигнала. После смещения сигнал затем передается на АЦП Arduino, где он дискретизируется и получается частота этого звука.
Необходимые компоненты
Для создания этого проекта требуются следующие компоненты;
- Arduino Uno x1
- LM386 x1
- Конденсаторный микрофон x1
- Микрофон / аудиоразъем x1
- Потенциометр 10k x1
- O.1 мкФ конденсатор x2
- Резистор 100 Ом x4
- Резистор 10 Ом x1
- Конденсатор 10 мкФ x3
- 5 мм желтый светодиод x2
- 5 мм зеленый светодиод x1
- Обычно открытые кнопки x6
- Перемычки
- Макетная плата
Схемы
Подключите компоненты, как показано на схеме гитарного тюнера ниже.
Кнопки подключаются без подтягивающих резисторов, поскольку будут использоваться подтягивающие резисторы, встроенные в Arduino. Это сделано для того, чтобы схема была максимально простой.
Код Arduino для гитарного тюнера
Алгоритм кода для этого проекта Guitar Tuner прост. Чтобы настроить конкретную струну, гитарист выбирает струну, нажимая соответствующую кнопку, и играет на открытой струне. Звук собирается каскадом усиления и передается на АЦП Arduino. Частота декодируется и сравнивается. Когда входная частота из строки меньше указанной частоты, для этой строки загорается один из желтых светодиодов, указывающий на необходимость натяжения струны. Когда измеренная частота превышает установленную частоту для этой цепочки, загорается другой светодиод. Когда частота находится в пределах установленного диапазона для этой струны, загорается зеленый светодиод, чтобы направлять гитариста.
Полный код 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 upperLed = 6; int justRight = 5; #define LENGTH 512 байт rawData; int count;
Далее идет функция void setup () .
Здесь мы начинаем с включения внутреннего подтягивания на Arduino для каждого из контактов, к которым подключены переключатели. После этого мы устанавливаем контакты, к которым подключены светодиоды, в качестве выходов и запускаем последовательный монитор для отображения данных.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (массив кнопок, INPUT_PULLUP); } pinMode (lowerLed, ВЫХОД); pinMode (высший светодиод, ВЫХОД); pinMode (justRight, ВЫХОД); Serial.begin (115200); }
Далее идет функция void loop , мы реализуем обнаружение и сравнение частоты.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } еще { сумма = 0; pd_state = 0; int period = 0; for (i = 0; i <len; i ++) { // Автокорреляция sum_old = sum; сумма = 0; для (k = 0; k <len-i; k ++) sum + = (rawData-128) * (rawData-128) / 256; // Serial.println (сумма); // Конечный автомат определения пика if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } если (pd_state == 1 && (sum> thresh) && (sum-sum_old)> 0) pd_state = 2; если (! i) { порог = сумма * 0,5; pd_state = 1; } } // Частота в Гц if (thresh> 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); } иначе, если (freq_per - freqarray> 10) { digitalWrite (вышеLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Полный код с демонстрационным видео приводится ниже. Загрузите код на свою плату Arduino и начните играть.