Sveiki, vaikinai, per kelias pastarąsias savaites aš stengiausi iš naujo susisiekti su meile gitarai. Grodamas dėžute gitara, aš atsipalaidavau keletą metų atgal, kol saksofonas užvaldė. Grįždamas prie gitaros, po 3 metų, kai retai mušinėjau akordą, be kitų dalykų atradau, kad nebežinau, kaip turi skambėti kiekviena styga, draugės žodžiais tariant: „Mano klausa nebebuvo sureguliuota“ ir dėl to aš negalėjau sureguliuoti gitaros be klaviatūros ar mobiliosios programos, kurią vėliau atsisiunčiau. Savaitės prabėgo iki kelių dienų, kai kūrėjas manyje tapo motyvuotas ir aš nusprendžiau pastatyti „Arduino“ pagrįstą gitaros derintuvą. Šiandienos pamokoje aš dalinuosi, kaip sukurti savo „ pasidaryk pats“ „Arduino“ gitaros derintuvą.
Kaip veikia gitaros derintuvas
Prieš pereinant prie elektronikos, svarbu suprasti kūrimo principą. Yra 7 pagrindinės muzikinės natos, pažymėtos abėcėlėmis; A, B, C, D, E, F, G ir paprastai baigiasi kitu A, kuris visada yra oktavoje aukštesnis už pirmąjį A. Muzikoje egzistuoja kelios šių natų versijos, tokios kaip pirmasis A ir paskutinis A. Šios natos skiriasi nuo jų kitimo ir viena nuo kitos garso savybių, vadinamų aukščiu. Tempis apibrėžiamas kaip garso stiprumas ar silpnumas, o jį nurodo to garso dažnis. Kadangi šių natų dažnis yra žinomas, mums reikia nustatyti, ar gitara yra sureguliuota, ar ne, mums tereikia palyginti tam tikros stygos natos dažnį su tikruoju natos, kurią reiškia styga, dažnumu.
7 muzikinių natų dažniai:
A = 27,50 Hz
B = 30,87Hz
C = 16,35Hz
D = 18,35Hz
E = 20,60 Hz
F = 21,83Hz
G = 24,50 Hz
Kiekvienas šių užrašų variantas visada yra lygyje, lygus FxM, kur F yra dažnis, o M yra ne nulis sveikasis skaičius. Taigi paskutiniam A, kuris, kaip aprašyta anksčiau, yra oktavoje aukštesnis už pirmąjį A, dažnis yra;
27,50 x 2 = 55Hz.
Gitara („Lead / box guitar“) ant atviros stygos paprastai turi 6 stygas, žymimas natomis E, A, D, G, B, E. Kaip įprasta, paskutinis E bus oktavoje, aukštesnėje už pirmąją E. Mes sukursime savo gitaros derintuvą, kuris padės sureguliuoti gitarą naudojant šių natų dažnius.
Pagal standartinį gitaros derinimą kiekvienos stygos nata ir atitinkamas dažnis parodytas žemiau esančioje lentelėje.
Stygos |
Dažnis |
Žymėjimas |
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 |
Projektas srautas yra gana paprastas; gitaros sugeneruotą garso signalą paverčiame dažniu, tada palyginame su tikslia derinamos stygos dažnio verte. Gitaristui pranešama naudojant šviesos diodą, kai vertė koreliuoja.
Dažnio aptikimas / konversija apima 3 pagrindinius etapus;
- Didinantis
- Įskaitymas
- Analoginis į skaitmeninį keitimą (mėginių ėmimas)
Gaminamas garso signalas bus per silpnas, kad „Arduino“ ADC galėtų atpažinti, todėl turime sustiprinti signalą. Po sustiprinimo, norėdami išlaikyti signalą diapazone, kurį atpažįsta „Arduino“ ADC, kad būtų išvengta signalo nukirpimo, mes kompensuojame signalo įtampą. Po kompensavimo signalas perduodamas „ Arduino ADC“, kur jis imamas ir gaunamas to garso dažnis.
Reikalingi komponentai
Norint sukurti šį projektą, reikalingi šie komponentai;
- „Arduino Uno x1“
- LM386 x1
- Kondensatoriaus mikrofonas x1
- Mikrofono / garso lizdas x1
- 10k potenciometras x1
- O.1uf kondensatorius x2
- 100 omų rezistorius x4
- 10 omų rezistorius x1
- 10uf kondensatorius x3
- 5 mm geltonas LED x2
- 5 mm žalias LED x1
- Paprastai atidarykite mygtukus x6
- Džemperių laidai
- Bandomoji Lenta
Schemos
Prijunkite komponentus, kaip parodyta žemiau esančiame „ Guitar Tuner“ grandinės schemoje.
Mygtukai jungiami be ištraukimo / nuleidimo varžų, nes bus naudojami pastatyti „Arduino“ varžai. Taip siekiama užtikrinti, kad grandinė būtų kuo paprastesnė.
„Arduino“ gitaros derintuvo kodas
Šio „ Guitar Tuner Project“ kodo algoritmas yra paprastas. Norėdami sureguliuoti tam tikrą stygą, gitaristas pasirenka stygą paspausdamas atitinkamą mygtuką ir paleidžia grojamą atvirą stygą. Garsą surenka stiprinimo pakopa ir perduoda „Arduino ADC“. Dažnis dekoduojamas ir lyginamas. Kai įvesties dažnis iš eilutės yra mažesnis už nurodytą dažnį, tai eilutei įsižiebia vienas iš geltonų šviesos diodų, rodančių, kad eilutė turėtų būti sugriežtinta. Kai išmatuotas dažnis yra didesnis už nurodytą tos stygos dažnį, užsidega kitas šviesos diodas. Kai tos stygos dažnis neviršija nustatyto diapazono, užsidega žalias šviesos diodas, vedantis gitaristą.
Pabaigoje pateikiamas pilnas „Arduino“ kodas, čia mes trumpai paaiškinome svarbias kodo dalis.
Pirmiausia sukuriame masyvą jungikliams laikyti.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Tada mes sukuriame masyvą, kad išlaikytume atitinkamą kiekvienos stygos dažnį.
plūduriuojantis dažnis = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // visi Hz
Tai atlikę mes deklaruojame kaiščius, prie kurių prijungti šviesos diodai, ir kitus kintamuosius, kurie bus naudojami dažniui gauti iš ADC.
int žemiauLed = 7; int didesnisLed = 6; int justRight = 5; #define LENGTH 512 baitų rawData; int skaičius;
Toliau yra „ void setup ()“ funkcija.
Čia mes pradedame įgalindami vidinį „Arduino“ traukimą kiekvienam iš kaiščių, prie kurių prijungti jungikliai. Po to mes nustatome kaiščius, prie kurių prijungti šviesos diodai, kaip išėjimus ir paleidžiame serijinį monitorių, kad būtų rodomi duomenys.
negaliojanti sąranka () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (didesnisLed, OUTPUT); pinMode (justRight, OUTPUT); Serijos pradžia (115200); }
Toliau yra tuštumos kilpos funkcija, mes įgyvendiname dažnio aptikimą ir palyginimą.
void loop () { if (skaičius <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } kita { suma = 0; pd_state = 0; int laikotarpis = 0; for (i = 0; i <len; i ++) { // Autokoreliacijos suma_oldas = suma; suma = 0; už (k = 0; k <len-i; k ++) sumą + = (rawData-128) * (rawData-128) / 256; // Serial.println (suma); // Piko aptikimo būsenos mašina, jei (pd_state == 2 && (sum-sum_old) <= 0) { periodas = i; pd_state = 3; } if (pd_state == 1 && (suma> kulti) && (suma-suma_oldas)> 0) pd_state = 2; jei (! i) { kulta = suma * 0,5; pd_state = 1; } } // Dažnis nustatytas Hz, jei ( kulmas > 100) { dažnis_per = mėginio_freq / periodas; Serial.println (dažnis_per); už (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 (didesnisLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } skaičius = 0; } }
Visas kodas su demonstraciniu vaizdo įrašu pateikiamas žemiau. Įkelkite kodą į savo „Arduino“ lentą ir pasitraukite.