Ahoj kluci, během posledních několika týdnů jsem pracoval na opětovném připojení se svou láskou ke kytaru. Hraní na kytaru bylo to, jak jsem před několika lety relaxoval, než převzal saxofon. Když jsem se vrátil ke kytarě, po 3 letech, kdy jsem zřídka brnkal na akord, jsem mimo jiné zjistil, že už nevím, jak by měla každá z strun znít, řečeno slovy mého přítele: „Můj sluch už nebyl vyladěn“ a v důsledku toho jsem nebyl schopen vyladit kytaru bez pomoci klávesnice nebo mobilní aplikace, kterou jsem si později stáhl. Týdny ubíhaly před několika dny, kdy mě tvůrce motivoval a rozhodl jsem se postavit kytarový tuner na bázi Arduina. V dnešním tutoriálu budu sdílet, jak vytvořit svůj vlastní DIY Arduino Guitar Tuner.
Jak funguje kytarový tuner
Než přejdeme k elektronice, je důležité pochopit princip, který stojí za sestavením. Existuje 7 hlavních hudebních not označených abecedami; A, B, C, D, E, F, G a obvykle končí jiným A, které je vždy o oktávu vyšší než první A. V hudbě existuje několik verzí těchto not jako první A a poslední A. Tyto noty se odlišují každý od své variace a od sebe navzájem jednou z charakteristik zvuku známých jako hřiště. Výška tónu je definována jako hlasitost nebo nízká úroveň zvuku a je indikována frekvencí daného zvuku. Vzhledem k tomu, že frekvence těchto not je známa, abychom mohli určit, zda je kytara naladěna či nikoli, musíme pouze porovnat frekvenci noty konkrétního stringu se skutečnou frekvencí noty, kterou struna představuje.
Frekvence 7 hudebních not jsou:
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á variace těchto not je vždy na výšce rovné FxM, kde F je frekvence a M je nenulové celé číslo. Takže pro poslední A, které, jak bylo popsáno dříve, je v oktávě vyšší než první A, je frekvence;
27,50 x 2 = 55 Hz.
Kytara (sólová / boxová kytara) má obvykle 6 strun označených notami E, A, D, G, B, E na otevřené struně. Jako obvykle bude poslední E o oktávu vyšší než první E. Navrhneme náš kytarový tuner, který pomůže naladit kytaru pomocí frekvencí těchto tónů.
Podle standardního ladění kytary je nota a odpovídající frekvence každého řetězce uvedena v tabulce níže.
Struny |
Frekvence |
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 |
Průtok Projekt je velmi jednoduchá; převedeme zvukový signál generovaný kytarou na frekvenci a poté porovnáme s přesnou hodnotou frekvence laděného řetězce. Když hodnota koreluje, je kytarista upozorněn pomocí LED.
Detekce / převod frekvence zahrnuje 3 hlavní stupně;
- Zesilující
- Kompenzace
- Analogově-digitální převod (vzorkování)
Produkovaný zvukový signál bude příliš slabý na to, aby jej ADC Arduino rozpoznal, takže musíme signál zesílit. Po zesílení, abychom udrželi signál v rozsahu rozpoznatelném Arduinovým ADC, abychom zabránili ořezávání signálu, jsme vyrovnali napětí signálu. Po vyrovnání je signál předán do Arduino ADC, kde je vzorkován a získá se frekvence tohoto zvuku.
Požadované komponenty
K sestavení tohoto projektu jsou vyžadovány následující komponenty;
- Arduino Uno x1
- LM386 x1
- Kondenzátorový mikrofon x1
- Konektor mikrofonu / zvuku x1
- 10k potenciometr x1
- O.1uf kondenzátor x2
- 100ohmový odpor x4
- 10ohmový odpor x1
- 10uf kondenzátor x3
- 5 mm žlutá LED x2
- 5 mm zelená LED x1
- Normálně otevřená tlačítka x6
- Propojovací vodiče
- Nepájivá deska
Schémata
Připojte komponenty podle schématu zapojení kytarového tuneru níže.
Tlačítka jsou připojena bez pull up / down rezistorů, protože budou použity vestavěné pullup rezistory Arduina. Tím je zajištěno, že obvod je co nejjednodušší.
Arduino kód pro kytarový tuner
Algoritmus za kódem pro tento projekt kytarových tunerů je jednoduchý. Chcete-li naladit konkrétní strunu, kytarista vybere strunu stisknutím příslušného tlačítka a strumuje přehrávání otevřené struny. Zvuk je sbírán zesilovacím stupněm a předáván do Arduino ADC. Frekvence je dekódována a porovnána. Pokud je vstupní frekvence z řetězce menší než zadaná frekvence, rozsvítí se pro tento řetězec jedna ze žlutých LED diod, které indikují, že řetězec by měl být utažen. Pokud je naměřená frekvence větší než předepsaná frekvence pro daný řetězec, rozsvítí se další LED. Když je frekvence ve stanoveném rozsahu pro daný řetězec, rozsvítí se zelená LED, která kytaru povede.
Na konci je uveden kompletní Arduino kód, zde jsme stručně vysvětlili důležité části kódu.
Začneme vytvořením pole, které drží přepínače.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Dále vytvoříme pole pro udržení odpovídající frekvence pro každý z řetězců.
float freqarray = {82,41, 110,00, 146,83, 196,00, 246,94, 329,63}; // vše v Hz
Poté jsme deklarovali piny, ke kterým jsou připojeny LED diody, a další proměnné, které budou použity pro získání frekvence z ADC.
int lowerLed = 7; int vyššíLed = 6; int justRight = 5; #define LENGTH 512 byte rawData; počet int;
Další je funkce void setup () .
Zde začneme povolením interního vytažení Arduina pro každý z pinů, ke kterým jsou připojeny přepínače. Poté nastavíme piny, ke kterým jsou LED připojeny jako výstupy, a spustíme sériový monitor pro zobrazení dat.
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); }
Dále je funkce void loop , implementujeme detekci a srovnání kmitočtů.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { součet = 0; pd_state = 0; int period = 0; for (i = 0; i <len; i ++) { // Autokorelace sum_old = suma; součet = 0; pro (k = 0; k <len-i; k ++) součet + = (rawData-128) * (rawData-128) / 256; // Serial.println (sum); // Peak Detect State Machine 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; if (! i) { thresh = součet * 0,5; pd_state = 1; } } // Frekvence identifikovaná v 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 (higherLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } pocet = 0; } }
Kompletní kód se v ukázkovém videu je uveden níže. Nahrajte kód na svoji desku Arduino a odjeďte pryč.