Ahoj chlapci, posledných pár týždňov som pracoval na opätovnom pripojení so svojou láskou ku gitare. Hra na boxovú gitaru bola tým, čo som relaxoval pred niekoľkými rokmi, než saxofón prebral. Keď sa vrátim ku gitare, po 3 rokoch, keď som zriedka brnkal na strunu, som okrem iného zistil, že už neviem, ako by mala ktorá struna znieť, povedané slovami môjho priateľa: „Môj sluch už nebol vyladený“ a v dôsledku toho som nebol schopný vyladiť gitaru bez pomoci klávesnice alebo mobilnej aplikácie, ktorú som si neskôr stiahol. Týždne ubehli až pred pár dňami, keď bol výrobca vo mne motivovaný a ja som sa rozhodol postaviť gitarový tuner založený na Arduine. V dnešnom tutoriáli sa budem deliť o to, ako si zostaviť svoj vlastný DIY Arduino gitarový tuner.
Ako funguje gitarový tuner
Než prejdeme k elektronike, je dôležité pochopiť princíp, ktorý stojí za zostavením. Existuje 7 hlavných hudobných nôt označených abecedami; A, B, C, D, E, F, G a obvykle končia iným A, ktoré je vždy o oktávu vyššie ako prvé A. V hudbe existuje niekoľko verzií týchto nôt ako prvé A a posledné A. Tieto nôty sa líšia každý od svojej variácie a navzájom od jednej z charakteristík zvuku známych ako výška tónu. Výška tónu je definovaná ako hlasitosť alebo slabosť zvuku a je indikovaná frekvenciou daného zvuku. Pretože je známa frekvencia týchto tónov, aby sme mohli určiť, či je gitara naladená alebo nie, stačí, aby sme porovnali frekvenciu tónu konkrétneho struny so skutočnou frekvenciou tónu, ktorú struna predstavuje.
Frekvencie 7 hudobných nôt sú:
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ždá variácia týchto nôt je vždy na ihrisku rovnom FxM, kde F je frekvencia a M je nenulové celé číslo. Takže pre posledné A, ktoré, ako je opísané vyššie, je o oktávu vyššiu ako prvé A, je frekvencia;
27,50 x 2 = 55 Hz.
Gitara (olovená / boxová gitara) má zvyčajne 6 strún označených notami E, A, D, G, B, E na otvorenej strune. Ako obvykle, posledné E bude o oktávu vyššie ako prvé E. Budeme navrhovať náš gitarový tuner, ktorý pomáha ladiť gitaru pomocou frekvencií týchto tónov.
Podľa štandardného ladenia gitary je v nasledujúcej tabuľke uvedená nota a zodpovedajúca frekvencia jednotlivých strún.
Struny |
Frekvencia |
Zápis |
1 (E) |
329,63 Hz |
E4 |
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 |
Prietok Projekt je veľmi jednoduchá; prevedieme zvukový signál generovaný gitarou na frekvenciu a potom ju porovnáme s presnou hodnotou frekvencie ladenej struny. Gitarista je informovaný pomocou LED, keď hodnota koreluje.
Detekcia / konverzia frekvencie zahrnuje 3 hlavné stupne;
- Zosilňujúce
- Započítanie
- Analógovo-digitálna konverzia (vzorkovanie)
Produkovaný zvukový signál bude príliš slabý na to, aby ho ADC Arduino rozpoznal, takže musíme zosilniť signál. Po zosilnení, aby sme udržali signál v rozsahu rozpoznateľnom Arduinovým ADC, aby sme zabránili orezávaniu signálu, sme vyrovnali napätie signálu. Po vyrovnaní sa signál potom odovzdá do Arduino ADC, kde sa vzorkuje a získa sa frekvencia tohto zvuku.
Požadované komponenty
Na zostavenie tohto projektu sú potrebné nasledujúce komponenty;
- Arduino Uno x1
- LM386 x1
- Kondenzátorový mikrofón x1
- Konektor pre mikrofón / zvuk x1
- 10k potenciometer x1
- O.1uf kondenzátor x2
- 100ohmový odpor x4
- 10ohmový odpor x1
- 10uf kondenzátor x3
- 5 mm žltá LED x2
- 5 mm zelená LED x1
- Normálne otvorené tlačidlá x6
- Prepojovacie vodiče
- Nepál
Schémy
Pripojte komponenty, ako je to znázornené na schéme zapojenia tunera gitary.
Tlačidlá sú pripojené bez pull-up rezistorov, pretože sa budú používať zabudované pullup rezistory Arduina. To zaisťuje, že obvod je čo najjednoduchší.
Arduino kód pre gitarový tuner
Algoritmus za kódom pre tento projekt gitarových tunerov je jednoduchý. Ak chcete naladiť konkrétnu strunu, gitarista vyberie strunu stlačením príslušného tlačidla a brnká na otvorenú strunu. Zvuk sa zhromažďuje v zosilňovacom stupni a odovzdáva sa do Arduino ADC. Frekvencia je dekódovaná a porovnaná. Keď je vstupná frekvencia z reťazca menšia ako zadaná frekvencia, pre tento reťazec sa rozsvieti jedna zo žltých LED diód, ktoré indikujú, že reťazec by mal byť utiahnutý. Keď je nameraná frekvencia vyššia ako predpísaná frekvencia pre daný reťazec, rozsvieti sa ďalšia LED. Keď je frekvencia v stanovenom rozsahu pre daný reťazec, rozsvieti sa zelená LED dióda, ktorá vedie gitaristu.
Kompletný Arduino kód je uvedený na konci, tu sme stručne vysvetlili dôležité časti kódu.
Začneme vytvorením poľa, ktoré drží prepínače.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Ďalej vytvoríme pole na udržanie zodpovedajúcej frekvencie pre každý z reťazcov.
float freqarray = {82,41, 110,00, 146,83, 196,00, 246,94, 329,63}; // všetko v Hz
Keď to urobíme, potom deklarujeme piny, ku ktorým sú pripojené LED diódy, a ďalšie premenné, ktoré sa použijú na získanie frekvencie z ADC.
int lowerLed = 7; int vyššiaLed = 6; int justRight = 5; #define LENGTH 512 bajtov rawData; počet int;
Ďalej je tu funkcia void setup () .
Tu začneme povolením interného vytiahnutia Arduina pre každý z pinov, ku ktorým sú pripojené prepínače. Potom nastavíme piny, ku ktorým sú LED pripojené ako výstupy, a spustíme sériový monitor pre zobrazenie údajov.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (higherLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Ďalej je funkciou neplatnej slučky implementujeme detekciu a porovnanie frekvencií.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { sum = 0; pd_state = 0; int obdobie = 0; for (i = 0; i <len; i ++) { // Autokorelácia sum_old = suma; suma = 0; pre (k = 0; k <len-i; k ++) súčet + = (rawData-128) * (rawData-128) / 256; // Serial.println (sum); // Zistenie špičkového stavu stroja if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } if (pd_state == 1 && (sum> mlátiť) && (sum-sum_old)> 0) pd_state = 2; if (! i) { thresh = suma * 0,5; pd_state = 1; } } // Frekvencia uvedená v Hz if (prah> 100) { freq_per = sample_freq / period; Serial.println (freq_per); pre (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 (higherLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } pocet = 0; } }
Kompletné kód sa v ukážkovom videu je uvedený nižšie. Nahrajte kód na svoju dosku Arduino a choďte preč.