Hej gutter, i løbet af de sidste par uger har jeg arbejdet på at genoprette forbindelse til min kærlighed til guitaren. At spille kasseguitar var, hvordan jeg slapper af for nogle år tilbage, før saxofonen overtog. Når jeg kom tilbage til guitaren, efter 3 år med sjældent at strumme en akkord, opdagede jeg blandt andet, at jeg ikke længere vidste, hvordan hver streng skulle lyde, for at sige det i min vens ord, "Min hørelse var ikke længere indstillet" og som et resultat af dette var jeg ikke i stand til at indstille guitaren uden hjælp af et keyboard eller en mobilapp, som jeg senere downloadede. Ugerne gik indtil for få dage siden, da producenten i mig blev motiveret, og jeg besluttede at bygge en Arduino-baseret Guitar Tuner. I dagens tutorial fortæller jeg, hvordan jeg bygger din egen DIY Arduino Guitar Tuner.
Sådan fungerer Guitar Tuner
Før vi går over til elektronikken, er det vigtigt at forstå princippet bag bygningen. Der er 7 store noter betegnet med alfabeterne; A, B, C, D, E, F, G og slutter normalt med en anden A, som altid er i en oktav højere end den første A. I musik findes der flere versioner af disse toner som den første A og den sidste A. Disse toner adskiller sig hver fra deres variation og fra hinanden ved en af egenskaberne ved lyd kendt som tonehøjde. Tonehøjde er defineret som lydens eller lavhedens lyd og dens angivet af lydens frekvens. Da frekvensen af disse toner er kendt, skal vi kun sammenligne frekvensen af tonen for en bestemt streng med den faktiske frekvens for den tone, som strengen repræsenterer, for at vi kan afgøre, om guitaren er indstillet eller ej.
Hyppigheden af de syv musiknoter er:
A = 27,50Hz
B = 30,87Hz
C = 16,35 Hz
D = 18,35 Hz
E = 20,60Hz
F = 21,83 Hz
G = 24,50 Hz
Hver variation af disse toner er altid på en tonehøjde lig med FxM, hvor F er frekvensen, og M er et ikke-nul heltal. Således for den sidste A, som som beskrevet tidligere, er ved en oktav højere end den første A, er frekvensen;
27,50 x 2 = 55 Hz.
Guitaren (Lead / box guitar) har normalt 6 strenge betegnet med noterne E, A, D, G, B, E på åben streng. Som sædvanlig vil sidste E være i en oktav højere end den første E. Vi designer vores guitar tuner for at hjælpe med at tune guitaren ved hjælp af frekvenserne på disse toner.
I henhold til standard guitarindstilling vises tonen og den tilsvarende frekvens for hver streng i nedenstående tabel.
Strenge |
Frekvens |
Notation |
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 |
Den projektflow er ganske enkel; konverterer vi lydsignalet genereret af guitaren til en frekvens og sammenligner derefter med den nøjagtige frekvensværdi for den streng, der bliver tunet. Guitaristen får besked ved hjælp af en LED, når værdien korrelerer.
Frekvensdetektering / konvertering involverer 3 hovedfaser;
- Forstærker
- Modregning
- Analog til digital konvertering (sampling)
Lydsignalet, der produceres, vil være for svagt til, at Arduino's ADC kan genkende, så vi er nødt til at forstærke signalet. For at holde signalet inden for det område, der kan genkendes af Arduino's ADC for at forhindre klipning af signalet, modregner vi signalets spænding efter forstærkning. Efter modregning sendes signalet derefter til Arduino ADC, hvor det samples, og frekvensen af denne lyd opnås.
Nødvendige komponenter
Følgende komponenter er nødvendige for at opbygge dette projekt;
- Arduino Uno x1
- LM386 x1
- Kondensatormikrofon x1
- Mikrofon / lydstik x1
- 10k potentiometer x1
- O.1uf kondensator x2
- 100 ohm modstand x4
- 10 ohm modstand x1
- 10uf kondensator x3
- 5 mm gul LED x2
- 5 mm grøn LED x1
- Normalt åbne trykknapper x6
- Jumper ledninger
- Brødbræt
Skemaer
Tilslut komponenterne som vist i Guitar Tuner Circuit Diagram nedenfor.
Trykknapperne er forbundet uden pull up / down-modstande, fordi Arduino's indbyggede pullup-modstande vil blive brugt. Dette er for at sikre, at kredsløbet er så simpelt som muligt.
Arduino-kode til guitar tuner
Algoritmen bag koden til dette Guitar Tuner-projekt er enkel. For at indstille en bestemt streng vælger guitaristen strengen ved at trykke på den tilsvarende trykknap og strummer spiller en åben streng. Lyden indsamles af forstærkningstrinnet og videreføres til Arduino ADC. Frekvensen afkodes og sammenlignes. Når inputfrekvensen fra strengen er mindre end den angivne frekvens, tændes en af de gule lysdioder for den streng, der angiver, at strengen skal strammes. Når den målte frekvens er større end den fastsatte frekvens for den streng, tændes en anden LED. Når frekvensen er inden for det fastsatte interval for den streng, tænder den grønne LED for at guide guitaristen.
Komplet Arduino-kode er givet i slutningen, her har vi kort forklaret de vigtige dele af koden.
Vi starter med at oprette en matrix, der holder kontakten.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Dernæst opretter vi et array, der holder den tilsvarende frekvens for hver af strengene.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // alt i Hz
Når dette er gjort, erklærer vi derefter de ben, som lysdioderne er tilsluttet, og andre variabler, der vil blive brugt til at opnå frekvensen fra ADC.
int lavereLed = 7; int højereLed = 6; int justRight = 5; #definer LÆNGDE 512 byte rawData; int tæller;
Dernæst er funktionen ugyldig opsætning () .
Her starter vi med at aktivere den interne træk på Arduino for hver af de ben, som afbryderne er tilsluttet. Derefter indstiller vi de ben, som lysdioderne er tilsluttet som udgange og starter den serielle skærm for at få vist dataene.
ugyldig opsætning () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (højereLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Dernæst er ugyldig sløjfefunktion , vi implementerer frekvensdetektion og sammenligning.
ugyldig loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } andet { sum = 0; pd_state = 0; int periode = 0; for (i = 0; i <len; i ++) { // Autokorrelation sum_old = sum; sum = 0; for (k = 0; k <len-i; k ++) sum + = (rawData-128) * (rawData-128) / 256; // Serial.println (sum); // Peak Detect State Machine, hvis (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } hvis (pd_state == 1 && (sum> tærskel) && (sum-sum_old)> 0) pd_state = 2; hvis (! i) { tærsk = sum * 0,5; pd_state = 1; } } // Frekvens identificeret i Hz hvis (tærskel> 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); } ellers hvis (freq_per - freqarray> 10) { digitalWrite (higherLed, HIGH); } andet { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Den komplette kode med en demonstrationsvideo er angivet nedenfor. Upload koden til dit Arduino-kort, og strum væk.