Hej killar, under de senaste veckorna har jag arbetat med att återansluta med min kärlek till gitarr. Att spela boxgitarr var hur jag slappnade av för några år tillbaka innan saxofonen tog över. Efter att ha gått tillbaka till gitarr, efter tre år av sällan att stryka ett ackord, upptäckte jag bland annat att jag inte längre visste hur var och en av strängarna skulle låta, för att uttrycka det i min väns ord, "Min hörsel var inte längre inställd" och som ett resultat av detta kunde jag inte ställa in gitarr utan hjälp av ett tangentbord eller en mobilapp som jag senare laddade ner. Veckorna gick till för några dagar sedan när tillverkaren i mig blev motiverad och jag bestämde mig för att bygga en Arduino-baserad gitarrmottagare. I dagens handledning kommer jag att dela hur du bygger din egen DIY Arduino Guitar Tuner.
Hur Guitar Tuner fungerar
Innan vi går till elektroniken är det viktigt att förstå principen bakom byggnaden. Det finns 7 stora noter betecknade med alfabetet; A, B, C, D, E, F, G och slutar vanligtvis med en annan A som alltid är vid en oktav högre än den första A. I musik finns flera versioner av dessa toner som den första A och den sista A. Dessa toner särskiljs var och en från sin variation och från varandra genom en av egenskaperna hos ljud som kallas tonhöjd. Pitch definieras som ljudets låghet eller låghet och dess indikeras av ljudets frekvens. Eftersom frekvensen av dessa toner är kända, för att vi ska kunna avgöra om gitarr är inställd eller inte, behöver vi bara jämföra frekvensen för tonen för en viss sträng med den faktiska frekvensen för den ton som strängen representerar.
Frekvenserna på de 7 noterna är:
A = 27,50Hz
B = 30,87Hz
C = 16,35Hz
D = 18,35Hz
E = 20,60Hz
F = 21,83Hz
G = 24,50 Hz
Varje variant av dessa toner är alltid på en tonhöjd som är lika med FxM där F är frekvensen och M är ett heltal som inte är noll. Således för den sista A, som beskrivits tidigare, vid en oktav högre än den första A, är frekvensen;
27,50 x 2 = 55Hz.
Gitarren (Lead / box guitar) har vanligtvis 6 strängar betecknade med noterna E, A, D, G, B, E på öppen sträng. Som vanligt kommer sista E att vara en oktav högre än den första E. Vi kommer att utforma vår gitarrmottagare för att hjälpa till att ställa in gitarr med frekvenserna i dessa toner.
Enligt standard gitarrinställning visas noten och motsvarande frekvens för varje sträng i tabellen nedan.
Strängar |
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 projektflöde är ganska enkel; vi konverterar ljudsignalen som genereras av gitarr till en frekvens och jämför sedan med det exakta frekvensvärdet för strängen som ställs in. Gitarristen meddelas med en lysdiod när värdet korrelerar.
Frekvensdetektering / konvertering innefattar tre huvudsteg;
- Förstärkande
- Förskjutning
- Analog till digital konvertering (sampling)
Ljudsignalen som produceras kommer att vara för svag för att Arduinos ADC ska känna igen så vi måste förstärka signalen. Efter förstärkning, för att hålla signalen inom det område som kan kännas igen av Arduinos ADC för att förhindra klippning av signalen, kompenserar vi signalens spänning. Efter förskjutning skickas signalen sedan till Arduino ADC där den samplas och frekvensen för det ljudet erhålls.
Nödvändiga komponenter
Följande komponenter krävs för att bygga detta projekt;
- Arduino Uno x1
- LM386 x1
- Kondensatormikrofon x1
- Mikrofon / ljuduttag x1
- 10k potentiometer x1
- O.1uf kondensator x2
- 100 ohm motstånd x4
- 10 ohm motstånd x1
- 10uf kondensator x3
- 5mm gul LED x2
- 5mm grön LED x1
- Normalt öppna tryckknappar x6
- Bygeltrådar
- Bakbord
Scheman
Anslut komponenterna som visas i Guitar Tuner Circuit Diagram nedan.
Tryckknapparna är anslutna utan drag upp / ner motstånd eftersom Arduino's inbyggda pullup motstånd kommer att användas. Detta för att säkerställa att kretsen är så enkel som möjligt.
Arduino-kod för gitarrmottagare
Algoritmen bakom koden för detta Guitar Tuner Project är enkel. För att ställa in en viss sträng väljer gitarristen strängen genom att trycka på motsvarande tryckknapp och strumma spelar en öppen sträng. Ljudet samlas av förstärkningssteget och skickas vidare till Arduino ADC. Frekvensen avkodas och jämförs. När ingångsfrekvensen från strängen är mindre än den angivna frekvensen, för den strängen tänds en av de gula lysdioderna som indikerar att strängen ska dras åt. När den uppmätta frekvensen är större än den angivna frekvensen för den strängen tänds en annan lysdiod. När frekvensen ligger inom det angivna intervallet för den strängen tänds den gröna lysdioden för att vägleda gitarristen.
Komplett Arduino-kod ges i slutet, här har vi kort förklarat de viktiga delarna av koden.
Vi börjar med att skapa en matris för att hålla omkopplarna.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Därefter skapar vi en matris för att hålla motsvarande frekvens för var och en av strängarna.
flottör freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // allt i Hz
När detta är gjort förklarar vi sedan stiften som lysdioderna är anslutna till och andra variabler som kommer att användas för att få frekvensen från ADC.
int lowerLed = 7; int högreLed = 6; int justRight = 5; #define LÄNGD 512 byte rawData; int räkning;
Nästa är tomrumsinställningsfunktionen () .
Här börjar vi med att möjliggöra den interna dragningen på Arduino för var och en av stiften som omkopplarna är anslutna till. Därefter ställer vi in stiften som lysdioderna är anslutna till som utgångar och startar den seriella bildskärmen för att visa data.
ogiltig installation () { för (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (högreLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Därefter är tomrumsfunktionen , vi implementerar frekvensdetektering och jämförelse.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } annat { sum = 0; pd_stat = 0; int period = 0; för (i = 0; i <len; i ++) { // Autokorrelation sum_old = summa; summa = 0; för (k = 0; k <len-i; k ++) sum + = (rawData-128) * (rawData-128) / 256; // Serial.println (summa); // Peak Detect State Machine om (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_stat = 3; } om (pd_state == 1 && (summa> tröska) && (sum-sum_old)> 0) pd_state = 2; om (! i) { trösk = summa * 0,5; pd_stat = 1; } } // Frekvens identifierad i Hz om (tröskel> 100) { freq_per = sample_freq / period; Serial.println (freq_per); för (int s = 0; s <= 5; s ++) { if (digitalRead (buttonarray) == HIGH) { if (freq_per - freqarray <0) { digitalWrite (lowerLed, HIGH); } annars om (freq_per - freqarray> 10) { digitalWrite (higherLed, HIGH); } annat { digitalWrite (justRight, HIGH); } } } } antal = 0; } }
Den fullständiga koden med en demonstrationsvideo ges nedan. Ladda upp koden till ditt Arduino-kort och snubla bort.