Hei gutter, de siste ukene har jeg jobbet med å få kontakt med kjærligheten min til gitaren. Å spille kassegitar var slik jeg slappet av for noen år tilbake før saksofonen tok over. Etter å ha gått tilbake til gitaren, etter 3 år med sjelden å tromme en akkord, oppdaget jeg blant annet at jeg ikke lenger visste hvordan hver streng skulle høres ut, for å si det i vennens ord: "Min hørsel var ikke lenger innstilt" som et resultat av dette klarte jeg ikke å stille inn gitaren uten hjelp av et tastatur eller en mobilapp som jeg senere lastet ned. Ukene gikk til for få dager siden da produsenten i meg ble motivert og jeg bestemte meg for å bygge en Arduino-basert gitartuner. I dagens opplæring vil jeg dele hvordan du bygger din egen DIY Arduino Guitar Tuner.
Hvordan Guitar Tuner fungerer
Før vi går over til elektronikken, er det viktig å forstå prinsippet bak bygningen. Det er 7 store noter betegnet med alfabetene; A, B, C, D, E, F, G og slutter vanligvis med en annen A som alltid er i en oktav høyere enn den første A. I musikk eksisterer flere versjoner av disse tonene som den første A og den siste A. Disse tonene skilles hver fra sin variasjon og fra hverandre ved en av lydegenskapene kjent som tonehøyde. Tonehøyde er definert som lydens eller lavhetens lyd, og den er indikert av lydens frekvens. Siden frekvensen til disse tonene er kjent, trenger vi bare å sammenligne frekvensen til tonen til en bestemt streng med den faktiske frekvensen til tonen som strengen representerer for at vi skal finne ut om gitaren er innstilt eller ikke.
Hyppighetene til de 7 notene er:
A = 27,50Hz
B = 30,87Hz
C = 16,35 Hz
D = 18,35Hz
E = 20,60Hz
F = 21,83Hz
G = 24,50 Hz
Hver variant av disse notatene er alltid på en tonehøyde lik FxM der F er frekvensen og M er et heltall som ikke er null. Således for den siste A som som beskrevet tidligere, er ved en oktav høyere enn den første A, er frekvensen;
27,50 x 2 = 55Hz.
Gitaren (Lead / box guitar) har vanligvis 6 strenger betegnet med notene E, A, D, G, B, E på åpen streng. Som vanlig vil siste E ligge i en oktav høyere enn den første E. Vi skal designe gitartuneren vår for å hjelpe til med å stille gitaren ved hjelp av frekvensene til disse tonene.
I henhold til standard gitarinnstilling vises noten og tilhørende frekvens for hver streng i tabellen nedenfor.
Strenger |
Frekvens |
Notasjon |
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 prosjektet flyt er ganske enkel; vi konverterer lydsignalet generert av gitaren til en frekvens og sammenligner med den nøyaktige frekvensverdien til strengen som stilles inn. Gitaristen får beskjed ved hjelp av en LED når verdien korrelerer.
Frekvensdeteksjon / konvertering involverer 3 hovedfaser;
- Forsterkende
- Motregning
- Analog til digital konvertering (sampling)
Lydsignalet som produseres vil være for svakt til at Arduinos ADC kan gjenkjenne, så vi trenger å forsterke signalet. For å holde signalet innenfor området som gjenkjennes av Arduinos ADC for å forhindre klipping av signalet, kompenserer vi spenningen til signalet etter forsterkning. Etter motregning blir signalet deretter sendt til Arduino ADC hvor det samples og frekvensen til den lyden oppnås.
Nødvendige komponenter
Følgende komponenter kreves for å bygge dette prosjektet;
- Arduino Uno x1
- LM386 x1
- Kondensatormikrofon x1
- Mikrofon / lydkontakt x1
- 10k potensiometer x1
- O.1uf kondensator x2
- 100 ohm motstand x4
- 10 ohm motstand x1
- 10uf kondensator x3
- 5mm gul LED x2
- 5mm grønn LED x1
- Normalt åpne trykknapper x6
- Jumper ledninger
- Brettbrett
Skjemaer
Koble komponentene som vist i Guitar Tuner Circuit Diagram nedenfor.
Trykknappene er koblet til uten å trekke opp / ned motstander fordi Arduino's innebygde pullup-motstander vil bli brukt. Dette er for å sikre at kretsen er så enkel som mulig.
Arduino Code for Guitar Tuner
Algoritmen bak koden for dette Guitar Tuner Project er enkel. For å stille inn en bestemt streng, velger gitaristen strengen ved å trykke på den tilhørende trykknappen og strummer den som spiller en åpen streng. Lyden samles opp av forsterkningstrinnet og overføres til Arduino ADC. Frekvensen dekodes og sammenlignes. Når inngangsfrekvensen fra strengen er mindre enn den angitte frekvensen, tennes en av de gule lysdiodene for den strengen som indikerer at strengen skal strammes. Når den målte frekvensen er større enn den angitte frekvensen for den strengen, tennes en annen LED. Når frekvensen er innenfor det angitte området for den strengen, lyser den grønne LED-en for å veilede gitaristen.
Komplett Arduino-kode er gitt på slutten, her har vi kort forklart de viktige delene av koden.
Vi starter med å lage en matrise for å holde bryterne.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
Deretter oppretter vi en matrise for å holde den tilsvarende frekvensen for hver av 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 deretter pinnene som lysdiodene er koblet til og andre variabler som vil bli brukt for å oppnå frekvensen fra ADC.
int lavereLed = 7; int higherLed = 6; int justRight = 5; #define LENGDE 512 byte rawData; int telle;
Neste er funksjonen ugyldig oppsett () .
Her starter vi med å aktivere den interne trekkingen på Arduino for hver av pinnene som bryterne er koblet til. Deretter setter vi pinnene som lysdiodene er koblet til som utganger og starter den serielle skjermen for å vise dataene.
ugyldig oppsett () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (higherLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Deretter er ugyldig sløyfefunksjon , vi implementerer frekvensdeteksjon og sammenligning.
ugyldig sløyfe () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } annet { sum = 0; pd_state = 0; int periode = 0; for (i = 0; i <len; i ++) { // Autokorrelasjon 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> thresh) && (sum-sum_old)> 0) pd_state = 2; hvis (! i) { treske = sum * 0,5; pd_state = 1; } } // Frekvens identifisert i Hz hvis (trøske> 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); } annet hvis (freq_per - freqarray> 10) { digitalWrite (higherLed, HIGH); } annet { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Den komplette koden med en demonstrasjonsvideo er gitt nedenfor. Last opp koden til Arduino-kortet og snublet deg bort.