Cześć, w ciągu ostatnich kilku tygodni pracowałem nad ponownym połączeniem się z moją miłością do gitary. Gra na gitarze pudełkowej była sposobem, w jaki odpoczywałem kilka lat temu, zanim przejął saksofon. Wracając do gitary, po 3 latach rzadkiego grania akordu odkryłem między innymi, że nie wiedziałem już, jak powinna brzmieć każda struna, mówiąc słowami mojego przyjaciela: „Mój słuch nie był już nastrojony” i w rezultacie nie byłem w stanie nastroić gitary bez pomocy klawiatury lub aplikacji mobilnej, którą później pobrałem. Tygodnie minęły do kilku dni temu, kiedy twórca we mnie stał się zmotywowany i zdecydowałem się zbudować tuner gitarowy oparty na Arduino. W dzisiejszym samouczku opowiem, jak zbudować własny tuner gitarowy Arduino.
Jak działa tuner gitarowy
Zanim przejdziemy do elektroniki, ważne jest, aby zrozumieć zasady stojące za kompilacją. Istnieje 7 głównych nut oznaczonych alfabetami; A, B, C, D, E, F, G i zwykle kończą się innym A, które jest zawsze o oktawę wyżej niż pierwsze A. W muzyce istnieje kilka wersji tych dźwięków, takich jak pierwsze A i ostatnie A. są odróżniane od ich wariacji i od siebie na podstawie jednej z charakterystyk dźwięku zwanej wysokością. Wysokość dźwięku definiuje się jako głośność lub cichość dźwięku i wskazuje na to częstotliwość tego dźwięku. Ponieważ częstotliwość tych nut jest znana, abyśmy mogli określić, czy gitara jest dostrojona, czy nie, wystarczy porównać częstotliwość nuty danej struny z rzeczywistą częstotliwością nuty, którą reprezentuje struna.
Częstotliwości 7 nut to:
A = 27,50 Hz
B = 30,87 Hz
C = 16,35 Hz
D = 18,35 Hz
E = 20,60 Hz
F = 21,83 Hz
G = 24,50 Hz
Każda odmiana tych nut ma zawsze wysokość równą FxM, gdzie F jest częstotliwością, a M jest niezerową liczbą całkowitą. Zatem dla ostatniego A, które, jak opisano wcześniej, jest o oktawę wyżej niż pierwsze A, częstotliwość wynosi;
27,50 x 2 = 55 Hz.
Gitara (prowadząca / skrzynkowa) ma zwykle 6 strun oznaczonych przez nuty E, A, D, G, B, E na otwartej strunie. Jak zwykle ostatnie E będzie o oktawę wyższe niż pierwsze E. Będziemy projektować nasz tuner gitarowy, który pomoże nastroić gitarę przy użyciu częstotliwości tych nut.
Zgodnie ze standardowym strojem gitary, nuta i odpowiadająca jej częstotliwość każdej struny jest pokazana w poniższej tabeli.
Smyczki |
Częstotliwość |
Notacja |
1 (E) |
329,63 Hz |
E 4 |
2 (B) |
246,94 Hz |
B3 |
3 (G) |
196,00 Hz |
G3 |
4 (D) |
146,83 Hz |
D3 |
5 (A) |
110,00 Hz |
A2 |
6 (E) |
82,41 Hz |
E2 |
Przebieg projektu jest dość prosty; konwertujemy sygnał dźwiękowy generowany przez gitarę na częstotliwość, a następnie porównujemy z dokładną wartością częstotliwości strojonej struny. Gitarzysta jest powiadamiany za pomocą diody LED o korelacji wartości.
Wykrywanie / konwersja częstotliwości obejmuje 3 główne etapy;
- Wzmacniające
- Przesunięcie
- Konwersja analogowo-cyfrowa (próbkowanie)
Wytwarzany sygnał dźwiękowy będzie zbyt słaby, aby ADC Arduino mógł go rozpoznać, więc musimy wzmocnić sygnał. Po wzmocnieniu, aby utrzymać sygnał w zakresie rozpoznawalnym przez ADC Arduino, aby zapobiec obcinaniu sygnału, kompensujemy napięcie sygnału. Po przesunięciu sygnał jest następnie przesyłany do Arduino ADC, gdzie jest próbkowany i uzyskuje się częstotliwość tego dźwięku.
Wymagane komponenty
Do zbudowania tego projektu wymagane są następujące składniki;
- Arduino Uno x1
- LM386 x1
- Mikrofon pojemnościowy x1
- Mikrofon / gniazdo audio x1
- Potencjometr 10 k x1
- Kondensator O.1uf x2
- Rezystor 100 omów x4
- Rezystor 10 omów x1
- Kondensator 10uf x3
- 5mm żółta dioda LED x2
- 5mm zielona dioda LED x1
- Normalnie otwarte przyciski x6
- Przewody połączeniowe
- Płytka prototypowa
Schematy
Podłącz komponenty, jak pokazano na schemacie obwodu stroika gitarowego poniżej.
Przyciski są podłączone bez rezystorów pull up / down, ponieważ Arduino będzie używał wbudowanych rezystorów pullup. Ma to na celu zapewnienie jak najprostszego obwodu.
Kod Arduino dla tunera gitarowego
Algorytm kodu tego projektu Guitar Tuner jest prosty. Aby nastroić konkretną strunę, gitarzysta wybiera strunę, naciskając odpowiedni przycisk i brzdąkając na otwartej strunie. Dźwięk jest zbierany przez stopień wzmocnienia i przekazywany do Arduino ADC. Częstotliwość jest dekodowana i porównywana. Kiedy częstotliwość wejściowa struny jest mniejsza niż określona częstotliwość, dla tego ciągu zapala się jedna z żółtych diod LED, wskazując, że struna powinna być dokręcona. Gdy zmierzona częstotliwość jest większa niż częstotliwość określona dla tego ciągu, zapala się kolejna dioda LED. Kiedy częstotliwość znajdzie się w określonym zakresie dla tej struny, zapala się zielona dioda LED, aby prowadzić gitarzystę.
Kompletny kod Arduino jest podany na końcu, tutaj pokrótce wyjaśniliśmy ważne części kodu.
Zaczynamy od utworzenia tablicy do przechowywania przełączników.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Następnie tworzymy tablicę do przechowywania odpowiedniej częstotliwości dla każdego z ciągów.
float freqarray = {82,41, 110,00, 146,83, 196,00, 246,94, 329,63}; // wszystko w Hz
Po wykonaniu tej czynności deklarujemy piny, do których są podłączone diody LED, i inne zmienne, które będą używane do uzyskania częstotliwości z ADC.
int lowerLed = 7; int wyższaLed = 6; int justRight = 5; #define LENGTH 512 bajtów rawData; int count;
Następna jest funkcja void setup () .
Tutaj zaczynamy od włączenia wewnętrznego podciągania Arduino dla każdego z pinów, do których są podłączone przełączniki. Po czym ustawiamy piny, do których podłączone są diody LED jako wyjścia i uruchamiamy szeregowy monitor do wyświetlania danych.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (highLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Następnie, jest funkcja pustej pętli , implementujemy wykrywanie i porównywanie częstotliwości.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { suma = 0; pd_state = 0; int period = 0; for (i = 0; i <len; i ++) { // Autokorelacja sum_old = suma; suma = 0; for (k = 0; k <len-i; k ++) sum + = (rawData-128) * (rawData-128) / 256; // Serial.println (suma); // Maszyna stanu wykrywania szczytu 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; jeśli (! i) { thresh = suma * 0,5; pd_state = 1; } } // Częstotliwość określona w Hz 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); } else if (freq_per - freqarray> 10) { digitalWrite (highLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Kompletny kod z filmu demonstracyjnego znajduje się poniżej. Prześlij kod do swojej płyty Arduino i odejdź.