Arduino gitarr Tuner (6 / 15 steg)
Steg 6: Förstärk och Offset
Ovan är en schematisk av kretsen måste du göra detta.
Jag rekommenderar bygga denna krets på en skärbräda och testa med ett oscilloskop innan lödning det tillsammans. Din ljudingång bör den gröna ledningen av audio jack. Anslut den svarta sladden av jack till marken. Bifoga ditt scope sond till produktionen av DC offset (där kretsen är kopplad till A0 på Arduino). Höj volymen på din gitarr hela vägen och koppla in din gitarr till uttaget audio. Spela varje sträng och kolla på oscilloskopet att se till att din signal är centrerad runt 2.5V och att signalen är nära men inte överstiger 5V topp till topp.
Prova att köra denna modifierad version av Amanda är koden för Arduino frekvensen upptäckt att testa den Arduino frekvens beräkning. Det enda jag har ändrat från hennes kod är jag bort klippning indikatorn LED och istället tryckt "klippning" i följetong monitor när signalen klippen.
/*
* Ändrade Arduino frekvens identifiering
* av Nicole Grimwood
*
* För mer information vänligen besök:
*
*
*
* Något redigerad version av:
* Arduino frekvens identifiering
* skapade 7 oktober 2012
* av Amanda Ghassaei
*
* Denna kod är i public domain.
*/
Clipping indicator variabler
booleska klippning = 0;
data storage variabler
byte newData = 0;
byte prevData = 0;
unsigned int tid = 0; //keeps tid och skickar vales att lagra i [timer] ibland
int timer [10]; //storage för tidpunkten för händelser
int lutning [10]; //storage för lutning av händelser
unsigned int totalTimer; //used att beräkna period
unsigned int period; //storage under för wave
byte index = 0; //current storage index
float frekvens; //storage för frekvens beräkningar
int maxSlope = 0; //used att beräkna max lutning som trigger punkt
int newSlope; //storage för inkommande lutning data
variabler för beslutat om du har en match
byte noMatch = 0; //counts hur många icke-matcher du har fått för att återställa variabler om det har gått för långt
byte slopeTol = 3; //slope tolerans - justera detta om du behöver
int timerTol = 10; //timer tolerans - justera detta om du behöver
variabler för amp upptäckt
unsigned int ampTimer = 0;
byte maxAmp = 0;
byte checkMaxAmp;
byte ampThreshold = 30. //raise om du har en mycket högljudd signal
void setup() {
Serial.BEGIN(9600);
pinMode (13, OUTPUT); //led indikator pin
pinMode (12, OUTPUT); //output pin
(CLI); //diable avbrott
Ställ in kontinuerlig provtagning av analoga pin 0 vid 38,5 kHz
Rensa ADCSRA och ADCSRB register
ADCSRA = 0;
ADCSRB = 0;
ADMUX | = (1 << REFS0); ange referens spänning
ADMUX | = (1 << ADLAR); Vänsterjustera ADC värde - så vi kan läsa högst 8 bitar från ADCH register endast
ADCSRA | = (1 << ADPS2) | (1 << ADPS0); ställa in ADC klockan med 32 prescaler - 16mHz/32 = 500 kHz
ADCSRA | = (1 << ADATE); enabble automatisk utlösare
ADCSRA | = (1 << Ebba Grön); Aktivera avbrott när mätningen är klar
ADCSRA | = (1 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
SEI (); //enable avbrott
}
ISR(ADC_vect) {//when nya ADC värdet redo
PORTB & = B11101111; //set stift 12 låg
prevData = newData; //store tidigare värde
newData = ADCH; //get värde från A0
om (prevData < 127 & & newData > = 127) {//if ökar och passage mittpunkten
newSlope = newData - prevData; //calculate lutning
om (abs(newSlope-maxSlope) < slopeTol) {//if sluttningar är ==
spela in nya data och återställa tiden
sluttningen [index] = newSlope;
timer [index] = tid;
tid = 0;
om (index == 0) {//new max lutning bara reset
PORTB | = B00010000; //set stift 12 hög
noMatch = 0;
index ++; //increment index
}
annars om (abs(timer[0]-timer[index]) < timerTol & & abs(slope[0]-newSlope) < slopeTol) {//if timer varaktighet och backarna match
summa timer-värden
totalTimer = 0;
för (byte jag = 0; jag < index; i ++) {
totalTimer += timer [i];
}
period = totalTimer; //set perioden
återställa nya noll indexvärden att jämföra med
timer [0] = timer [index];
sluttningen [0] = lutningen [index];
index = 1; //set index 1
PORTB | = B00010000; //set stift 12 hög
noMatch = 0;
}
annat {//crossing mittpunkt men inte matchen
index ++; //increment index
om (index > 9) {
Reset();
}
}
}
annars om (newSlope > maxSlope) {//if nya lutning är mycket större än max lutning
maxSlope = newSlope;
tid = 0; //reset klocka
noMatch = 0;
index = 0; //reset index
}
annat {//slope inte brant nog
noMatch ++; //increment ingen match counter
om (noMatch > 9) {
Reset();
}
}
}
om (newData == 0 || newData == 1023) {//if klippning
klippningen = 1; //currently klippning
Serial.println("Clipping");
}
tid ++; //increment timer i takt på 38,5 kHz
ampTimer ++; //increment amplitud timer
om (abs(127-ADCH) > maxAmp) {
maxAmp = abs(127-ADCH);
}
om (ampTimer == 1000) {
ampTimer = 0;
checkMaxAmp = maxAmp;
maxAmp = 0;
}
}
void reset() {//clean ut vissa variabler
index = 0; //reset index
noMatch = 0; //reset matcha couner
maxSlope = 0; //reset lutning
}
void checkClipping() {//manage klippning indikation
om (klippning) {//if för närvarande klippning
klippningen = 0;
}
}
void loop() {
checkClipping();
om (checkMaxAmp > ampThreshold) {
frekvens = 38462/float (period); //calculate frekvens timer kurs/period
skriva ut resultaten
Serial.Print(Frequency);
Serial.println ("hz");
}
Delay(100);
}
Seriella bildskärmen bör skriva ut frekvensen av strängarna som spelas. Gitarrens strängar bör ha följande frekvenser:
E - 82.4 Hz
A - 110 Hz
D - 146.8 Hz
G - 196 Hz
B - 246.9 Hz
E - 329.6 Hz
Sedan den högre strängar har en mycket lägre amplitud signal än de lägre strängarna, kan det vara knepigt att få frekvensen upptäckt att arbeta. Amanda är koden har en variabel som kallas ampThreshold som är den minsta signal amplituden för Arduino att beräkna frekvens. För gitarr tuner, bör ampThreshold vara tillräckligt hög för att Arduino beräknar frekvensen av högre strängarna, men också låg nog att det inte plocka upp för mycket buller från de lägre strängarna. Jag upptäckte att en ampThreshold av 20 verk. Du har till strum kicken stränger lite svårare att få Arduino att plocka upp dem, men frekvensen upptäckt fungerar bra. Du kan experimentera med andra värden att få det att fungera för dig. Värde från 10 till 30 fungerar okej. För mer information om amandas algoritm för frekvens identifiering, kolla in hennes Instructable: Arduino frekvens identifiering.