Hallo allemaal, de afgelopen weken heb ik gewerkt aan het opnieuw verbinden met mijn liefde voor de gitaar. Door op de boxgitaar te spelen, ontspande ik me een paar jaar geleden voordat de saxofoon het overnam. Terugkerend naar de gitaar, na 3 jaar zelden tokkelen op een akkoord, ontdekte ik onder andere dat ik niet langer wist hoe elk van de snaren moest klinken, om het in de woorden van mijn vriend te zeggen: "Mijn gehoor was niet meer afgestemd" en Als gevolg hiervan kon ik de gitaar niet stemmen zonder de hulp van een toetsenbord of een mobiele app die ik later heb gedownload. De weken gingen voorbij tot een paar dagen geleden dat de maker in mij gemotiveerd raakte en ik besloot om een Arduino-gebaseerde Guitar Tuner te bouwen. In de tutorial van vandaag zal ik delen hoe je je eigen DIY Arduino Guitar Tuner kunt bouwen.
Hoe Guitar Tuner werkt
Voordat we naar de elektronica gaan, is het belangrijk om het principe achter de build te begrijpen. Er zijn 7 belangrijke muzieknoten aangegeven door de alfabetten; A, B, C, D, E, F, G en eindigen meestal met een andere A die altijd een octaaf hoger is dan de eerste A. In de muziek bestaan er verschillende versies van deze noten, zoals de eerste A en de laatste A. Deze noten onderscheiden elk van elkaar door hun variatie en van elkaar door een van de karakteristieken van geluid die bekend staan als toonhoogte. Toonhoogte wordt gedefinieerd als de luidheid of laagheid van geluid en wordt aangegeven door de frequentie van dat geluid. Aangezien de frequentie van deze noten bekend is, hoeven we alleen de frequentie van de noot van een bepaalde snaar te vergelijken met de werkelijke frequentie van de noot die de snaar vertegenwoordigt, zodat we kunnen bepalen of de gitaar al dan niet is gestemd.
De frequenties van de 7 muzieknoten zijn:
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
Elke variatie van deze noten heeft altijd een toonhoogte die gelijk is aan FxM, waarbij F de frequentie is en M een geheel getal dat niet gelijk is aan nul. Dus voor de laatste A die, zoals eerder beschreven, een octaaf hoger is dan de eerste A, is de frequentie;
27,50 x 2 = 55 Hz.
De gitaar (Lead / box-gitaar) heeft meestal 6 snaren die worden aangeduid met de noten E, A, D, G, B, E op een open snaar. Zoals gewoonlijk zal de laatste E een octaaf hoger zijn dan de eerste E. We gaan onze gitaartuner ontwerpen om de gitaar te stemmen met de frequenties van deze noten.
Volgens de standaard gitaarstemming worden de noot en de bijbehorende frequentie van elke snaar in de onderstaande tabel weergegeven.
Snaren |
Frequentie |
Notatie |
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 (EEN) |
110,00 Hz |
A2 |
6 (E) |
82,41 Hz |
E2 |
De projectstroom is vrij eenvoudig; we zetten het geluidssignaal dat door de gitaar wordt gegenereerd om in een frequentie en vergelijken deze met de exacte frequentiewaarde van de snaar die wordt afgestemd. De gitarist wordt via een LED op de hoogte gebracht wanneer de waarde correleert.
De frequentiedetectie / conversie omvat 3 hoofdfasen;
- Versterkend
- Compensatie
- Analoog naar digitaal conversie (sampling)
Het geproduceerde geluidssignaal zal te zwak zijn voor de Arduino ADC om te herkennen, dus we moeten het signaal versterken. Na versterking, om het signaal binnen het bereik te houden dat herkenbaar is voor de Arduino's ADC om clipping van het signaal te voorkomen, compenseren we de spanning van het signaal. Na compensatie wordt het signaal vervolgens doorgegeven aan de Arduino ADC waar het wordt bemonsterd en de frequentie van dat geluid wordt verkregen.
Vereiste componenten
De volgende componenten zijn vereist om dit project te bouwen;
- Arduino Uno x1
- LM386 x1
- Condensatormicrofoon x1
- Microfoon / audio-aansluiting x1
- 10 k potentiometer x1
- O.1uf condensator x2
- 100 ohm weerstand x4
- 10 ohm weerstand x1
- 10uf condensator x3
- 5 mm gele LED x2
- 5 mm groene LED x1
- Normaal open drukknoppen x6
- Doorverbindingsdraden
- Breadboard
Schema's
Sluit de componenten aan zoals weergegeven in het onderstaande schakelschema van de gitaartuner.
De drukknoppen zijn aangesloten zonder pull up / down weerstanden omdat de Arduino's in ingebouwde pullup weerstanden gebruikt zullen worden. Dit is om ervoor te zorgen dat het circuit zo eenvoudig mogelijk is.
Arduino-code voor gitaartuner
Het algoritme achter de code voor dit Guitar Tuner Project is eenvoudig. Om een bepaalde snaar te stemmen, selecteert de gitarist de snaar door op de overeenkomstige drukknop te drukken en tokkelt de speelt een open snaar. Het geluid wordt opgevangen door de versterkingsfase en doorgegeven aan de Arduino ADC. De frequentie wordt gedecodeerd en vergeleken. Als de ingangsfrequentie van de snaar lager is dan de gespecificeerde frequentie, gaat voor die snaar een van de gele LED's branden om aan te geven dat de snaar moet worden aangespannen. Als de gemeten frequentie groter is dan de voorgeschreven frequentie voor die string, gaat er weer een LED branden. Als de frequentie binnen het aangegeven bereik voor die snaar valt, gaat de groene LED branden om de gitarist te begeleiden.
Aan het einde wordt de volledige Arduino-code gegeven, hier hebben we de belangrijke delen van de code kort uitgelegd.
We beginnen met het maken van een array om de schakelaars vast te houden.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Vervolgens maken we een array om de corresponderende frequentie voor elk van de strings vast te houden.
float freqarray = {82,41, 110,00, 146,83, 196,00, 246,94, 329,63}; // alles in Hz
Met dit gedaan, declareren we vervolgens de pinnen waarop de LED's zijn aangesloten en andere variabelen die zullen worden gebruikt om de frequentie van de ADC te verkrijgen.
int lowerLed = 7; int hogerLed = 6; int justRight = 5; #define LENGTH 512 byte rawData; int telling;
De volgende is de void setup () functie.
Hier beginnen we met het inschakelen van de interne pull-up op de Arduino voor elk van de pinnen waarop de schakelaars zijn aangesloten. Waarna we de pinnen instellen waarop de LED's zijn aangesloten als uitgangen en de seriële monitor starten om de gegevens weer te geven.
void setup () { voor (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (upperLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Vervolgens is de void loop- functie, we implementeren de frequentiedetectie en vergelijking.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } anders { som = 0; pd_state = 0; int periode = 0; for (i = 0; i <len; i ++) { // Autocorrelatie sum_old = som; som = 0; voor (k = 0; k <len-i; k ++) som + = (rawData-128) * (rawData-128) / 256; // Serial.println (som); // Peak Detect State Machine if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } if (pd_state == 1 && (som> drempel) && (som-som_oud)> 0) pd_state = 2; if (! i) { drempel = som * 0,5; pd_state = 1; } } // Frequentie geïdentificeerd in 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 (hogere led, HIGH); } else { digitalWrite (justRight, HIGH); } } } } count = 0; } }
De volledige code met een demonstratievideo wordt hieronder gegeven. Upload de code naar je Arduino-bord en tokkel weg.