loading


Build your own electric guitar tuner using the Arduino! I decided to make this because I wanted to experiment with audio input and frequency detection. I used Amanda Ghassaei's method for Arduino Frequency Detection in order to get frequency readings using the Arduino. I used LEDs that light up according to the frequency of the audio input, indicating whether the string being played is sharp, flat, or in tune. This works like any other guitar tuner, but you can make it yourself!

Step 1: What You Need

(x1) Arduino Uno (RadioShack #276-128)
(x1) TL082 Dual JFET Input Op Amp (RadioShack #276-1715)
(x1) 6x4x2" project enclosure (RadioShack #270-1806)
(x6) 5mm Yellow LED (RadioShack #276-021)
(x6) 5mm Red LED (RadioShack #276-041)
(x1) 5mm Green LED (RadioShack #276-022)
(x13) 150 Ohm Resistor (RadioShack #271-1109)
(x2) 9V Battery (RadioShack #23-1134)
(x2) 9V Snap Connector (RadioShack #270-324)
(x1) M-type power plug (RadioShack #274-1569)
(x1) SPST Rocker Switch (RadioShack #275-693)
(x1) 1/4" Mono Audio Jack (RadioShack #274-255)
(x1) Matching Printed Circuit Board (RadioShack #276-170)
(x1) Grid-Style Printed Circuit Board (RadioShack #276-149)
(x3) 100kOhm Resistor (RadioShack #271-1347)
(x1) 22kOhm Resistor (RadioShack #271-1339)
(x1) 10uF Capacitor (RadioShack #272-1025)
(x1) 100nF Capacitor
(x1) 6x4x.125" Acrylic Sheet





Step 2: Drill

Drill a starter hole on the side of your enclosure using a 1/8" drill bit. Drill into the starter hole using a 13/16" spade bit to create a larger hole for the SPST rocker switch. The rocker switch will serve as an on/off switch for the tuner.

Drill a hole beneath the on/off switch hole using a 23/64" bit. This hole is for your audio jack.

Step 3: On/Off Switch

Solder the red end of one of your battery snaps to one of the lugs on the switch and solder a red wire to the other lug of the switch.

Feed the snap and wire through the 13/16" hole in your enclosure and fasten it in place with its mounting nut.

Step 4: Audio Jack

Solder a green wire to the output terminal and a black wire to the ground terminal on the audio jack.

Insert the audio jack in the 23/64" hole you drilled and fasten it in place with its mounting nut and washer. 

Step 5: Power Plug

Take apart the M-type power plug. 

Solder a red wire to the plug's tip terminal, and a black wire to the plug's barrel terminal.

Thread both wires through the black casing and screw the casing back onto the plug.

Step 6: Amplify and Offset

The audio signal coming from the electric guitar needs to be amplified to be about 5V peak to peak and and offset to be centered around 2.5V as opposed to 0V. The signal needs to be between 0 and 5V in order for it to be read by the Arduino's analog pin. It should also have the greatest amplitude possible without clipping in order to get more accurate frequency calculations.

Above is a schematic of the circuit you will need to do this.

I recommend building this circuit on a breadboard and testing it out using an oscilloscope before soldering it together. Your audio input should be the green wire of the audio jack. Connect the black wire of the jack to ground.  Attach your scope probe to the output of the DC offset (where the circuit is attached to A0 on the Arduino). Turn the volume on your guitar all the way up and plug your guitar into the audio jack. Play every string and check on the oscilloscope to make sure your signal is centered around 2.5V and that the signal is close to but does not exceed 5V peak to peak. 

Try running this modified version of Amanda's code for Arduino Frequency Detection to test out the Arduino's frequency calculation. The only thing I have changed from her code is I removed the clipping indicator LED and instead printed "clipping" in the serial monitor whenever the signal clips.  



The serial monitor should print the frequency of the strings being played. The guitar's strings should have the following frequencies:
E - 82.4 Hz
A - 110 Hz
D - 146.8 Hz
G - 196 Hz
B - 246.9 Hz
E - 329.6 Hz

Since the the higher strings have a much lower amplitude signal than the lower strings, it can be tricky to get the frequency detection to work. Amanda's code has a variable called ampThreshold that is the minimum signal amplitude for the Arduino to calculate frequency. For the guitar tuner, the ampThreshold should be high enough that the Arduino calculates the frequency of the higher strings, but also low enough that it does not pick up too much noise from the lower strings. I found that an ampThreshold of 20 works. You have to strum the high strings a bit harder to get the Arduino to pick them up, but the frequency detection works well. You can experiment with other values to get it to work for you. Values ranging from 10 to 30 work okay. For more information on Amanda's algorithm for frequency detection, check out her Instructable: Arduino Frequency Detection.

Step 7: Solder the Chip

Solder the TL082 to the grid-style PC board.

Step 8: Solder the Amplifier and Offset

Solder the resistors for the amplifier and a wire for the output from the amplifier. 

Solder the capacitors and resistors for the DC offset.

Solder wires to the DC offset that will connect to 5V, ground, and A0 on the Arduino. 

Step 9: Solder Power and Input

Solder the red wire on the on/off switch to +VCC (pin 8) on the TL082 chip. Solder the black wire to ground.

Solder the black wire of the other battery snap to -VCC (pin 4) on the TL082 chip and solder the red wire to ground.

Solder the green wire of the audio jack to the positive input of the op amp on the TL082 (pin 3) and the black wire to ground.

Solder the red wire of the power plug to +VCC (pin 8) and the black wire to ground and insert the plug in the Arduino.

Plug the wires for 5V, Ground, and A0 from the DC Offset into the Arduino.


Step 10: Program

Load the following code into the Arduino.

This code contains the frequency detection and controls the LEDs that you will soon add to your tuner.


<pre>/*
 * Arduino Guitar Tuner
 * by Nicole Grimwood
 *
 * For more information please visit:
 * https://www.instructables.com/id/Arduino-Guitar-Tuner/
 *
 * Based upon:
 * Arduino Frequency Detection
 * created October 7, 2012
 * by Amanda Ghassaei
 *
 * This code is in the public domain. 
*/


//data storage variables
byte newData = 0;
byte prevData = 0;
unsigned int time = 0;//keeps time and sends vales to store in timer[] occasionally
int timer[10];//storage for timing of events
int slope[10];//storage for slope of events
unsigned int totalTimer;//used to calculate period
unsigned int period;//storage for period of wave
byte index = 0;//current storage index
float frequency;//storage for frequency calculations
int maxSlope = 0;//used to calculate max slope as trigger point
int newSlope;//storage for incoming slope data

//variables for deciding whether you have a match
byte noMatch = 0;//counts how many non-matches you've received to reset variables if it's been too long
byte slopeTol = 3;//slope tolerance- adjust this if you need
int timerTol = 10;//timer tolerance- adjust this if you need

//variables for amp detection
unsigned int ampTimer = 0;
byte maxAmp = 0;
byte checkMaxAmp;
byte ampThreshold = 30;//raise if you have a very noisy signal

//variables for tuning
int correctFrequency;//the correct frequency for the string being played

void setup(){
  
  Serial.begin(9600);
  
  //LED pins
  pinMode(7,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(A3,OUTPUT);
  pinMode(A4,OUTPUT);
  pinMode(A5,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  
  
  //Beginning LED sequence
  digitalWrite(7,1);
  digitalWrite(6,1);
  digitalWrite(5,1);
  digitalWrite(4,1);
  digitalWrite(3,1);
  digitalWrite(2,1);
  digitalWrite(8,1);
  analogWrite(A1,255);
  delay(500);
  digitalWrite(9,1);
  analogWrite(A2,255);
  delay(500);
  digitalWrite(A5,255);
  analogWrite(A3,255);
  delay(500);
  analogWrite(A4,255);
  delay(500);
  
  
  
  cli();//disable interrupts
  
  //set up continuous sampling of analog pin 0 at 38.5kHz
 
  //clear ADCSRA and ADCSRB registers
  ADCSRA = 0;
  ADCSRB = 0;
  
  ADMUX |= (1 << REFS0); //set reference voltage
  ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
  
  ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz
  ADCSRA |= (1 << ADATE); //enabble auto trigger
  ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
  ADCSRA |= (1 << ADEN); //enable ADC
  ADCSRA |= (1 << ADSC); //start ADC measurements
  
  sei();//enable interrupts
}

ISR(ADC_vect) {//when new ADC value ready
  
  PORTB &= B11101111;//set pin 12 low
  prevData = newData;//store previous value
  newData = ADCH;//get value from A0
  if (prevData < 127 && newData >=127){//if increasing and crossing midpoint
    newSlope = newData - prevData;//calculate slope
    if (abs(newSlope-maxSlope)<slopeTol){//if slopes are ==
      //record new data and reset time
      slope[index] = newSlope;
      timer[index] = time;
      time = 0;
      if (index == 0){//new max slope just reset
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
        index++;//increment index
      }
      else if (abs(timer[0]-timer[index])<timerTol && abs(slope[0]-newSlope)<slopeTol){//if timer duration and slopes match
        //sum timer values
        totalTimer = 0;
        for (byte i=0;i<index;i++){
          totalTimer+=timer[i];
        }
        period = totalTimer;//set period
        //reset new zero index values to compare with
        timer[0] = timer[index];
        slope[0] = slope[index];
        index = 1;//set index to 1
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
      }
      else{//crossing midpoint but not match
        index++;//increment index
        if (index > 9){
          reset();
        }
      }
    }
    else if (newSlope>maxSlope){//if new slope is much larger than max slope
      maxSlope = newSlope;
      time = 0;//reset clock
      noMatch = 0;
      index = 0;//reset index
    }
    else{//slope not steep enough
      noMatch++;//increment no match counter
      if (noMatch>9){
        reset();
      }
    }
  }
  
  time++;//increment timer at rate of 38.5kHz
  
  ampTimer++;//increment amplitude timer
  if (abs(127-ADCH)>maxAmp){
    maxAmp = abs(127-ADCH);
  }
  if (ampTimer==1000){
    ampTimer = 0;
    checkMaxAmp = maxAmp;
    maxAmp = 0;
  }
  
}

void reset(){//clean out some variables
  index = 0;//reset index
  noMatch = 0;//reset match couner
  maxSlope = 0;//reset slope
}

//Turn off 5 out the 6 LEDs for the guitar strings
void otherLEDsOff(int LED1, int LED2,int LED3,int LED4,int LED5){
  digitalWrite(LED1,0);  
  digitalWrite(LED2,0);
  digitalWrite(LED3,0);
  digitalWrite(LED4,0);
  digitalWrite(LED5,0);
}

//Determine the correct frequency and light up 
//the appropriate LED for the string being played 
void stringCheck(){
  if(frequency>70&frequency;<90){
    otherLEDsOff(2,3,5,6,7);
    digitalWrite(2,1);
    correctFrequency = 82.4;
  }
  if(frequency>100&frequency;<120){
    otherLEDsOff(2,3,4,5,6);
    digitalWrite(3,1);
    correctFrequency = 110;
  }
  if(frequency>135&frequency;<155){
    otherLEDsOff(2,3,4,6,7);
    digitalWrite(4,1);
    correctFrequency = 146.8;
  }
  if(frequency>186&frequency;<205){
    otherLEDsOff(2,3,5,6,7);
    digitalWrite(5,1);
    correctFrequency = 196;
  }
  if(frequency>235&frequency;<255){
    otherLEDsOff(2,4,5,6,7);
    digitalWrite(6,1);
    correctFrequency = 246.9;
  }
  if(frequency>320&frequency;<340){
    otherLEDsOff(3,4,5,6,7);
    digitalWrite(7,1);
    correctFrequency = 329.6;
  }
}

//Compare the frequency input to the correct 
//frequency and light up the appropriate LEDS
void frequencyCheck(){
  if(frequency>correctFrequency+1){
    analogWrite(A3,255);
  }
  if(frequency>correctFrequency+4){
    analogWrite(A2,255);
  }
  if(frequency>correctFrequency+6){
    analogWrite(A1,255);
  }
  if(frequency<correctFrequency-1){
    analogWrite(A5,255);
  }
  if(frequency<correctFrequency-4){
    digitalWrite(9,1);
  }
  if(frequency<correctFrequency-6){
    digitalWrite(8,1);
  }
  if(frequency>correctFrequency-1&frequency;<correctFrequency+1){
    analogWrite(A4,255);
  }
}

void allLEDsOff(){
  digitalWrite(2,0);
  digitalWrite(3,0);
  digitalWrite(4,0);
  digitalWrite(5,0);
  digitalWrite(6,0);
  digitalWrite(7,0);
  digitalWrite(8,0);
  digitalWrite(9,0);
  analogWrite(A1,0);
  analogWrite(A2,0);
  analogWrite(A3,0);
  analogWrite(A4,0);
  analogWrite(A5,0);
}

void loop(){
  
  allLEDsOff();
  
  if (checkMaxAmp>ampThreshold){
    frequency = 38462/float(period);//calculate frequency timer rate/period
  }
  
  stringCheck();
  frequencyCheck();
  
  delay(100);
 
}


Step 11: Create the Front

For my guitar tuner, I chose to laser cut the front of it. I like the look of the white acrylic and the ability to etch the letters and symbols on the front. I have attached a template for the front of the guitar tuner. I used CorelDRAW to create it, but I have also attached it in EPS format.

If you do not have a laser cutter, you can use the normal lid for the enclosure and drill holes into it. Use a 13/64" drill bit and drill six holes for the LEDs indicating which of the six different strings is being tuned and seven holes for the LEDs indicating how sharp or flat the string is. Label the set of six holes with E, A, D, G, B, and E from left to right. Label the middle hole of the set of seven with a triangle pointed toward the hole. Label the rightmost hole with the musical symbol for sharp and the leftmost hole with the musical symbol for flat. 

Step 12: LEDs

Solder LEDs to your matching PC board. Space the LEDs such that they will fit into the holes of your acrylic front piece. An easy way to do this is lay the front piece on top of your PC board and mark the spacings of the holes on your board using a pen. This way, you know exactly where to solder your LEDs. 

Solder a 150 Ohm resistor to the anode of each LED and a wire from that resistor which will go to one of the pins on the Arduino.
I chose red wire for the LEDs indicating whether the string is in tune and green wire for the LEDs that show which string is being played.

Solder the cathodes of the LEDs to ground and solder a black wire to ground. This black wire will connect to the Arduino's ground.
 



Step 13: Put It Together

Place the front cover of the tuner onto the PC board with the LEDs. 

Connect the wires on the PC board to the Arduino. The following list indicates which LED should be connected to which pin. 

leftmost red LED (most flat)- pin 8
next red LED to the right - pin 9
next red LED to the right - A5
green LED (in tune) - A4
first red LED to the right of the green LED - A3
next red LED to the right - A2
rightmost red LED (most sharp) - A1

Leftmost LED Labeled "E" - pin 2
LED Labeled "A" - pin 3
LED Labeled "D" - pin 4
LED Labeled "G" - pin 5
LED Labeled "B" - pin 6
Rightmost LED Labeled "E" - pin 7

There are also labels on the second image above to help.

The black wire on the PC board should be connected to ground on the Arduino. 

Turn on the tuner and test it out in order to make sure you have your LEDs connected properly.


Step 14: Close It Up

Gently put the front of the tuner onto the front of the enclosure making sure that none of the wires get disconnected.

Screw in the screws provided with the enclosure to fix the front in place.

Step 15: Tune

Plug in your guitar and tune it!
<p>this is awesome project!! i try to make one of this, but when i try to verify the sketch this is appear &quot;<strong>exit status 1</strong></p><p><strong>invalid operands of types 'bool' and 'float' to binary 'operator&amp;' </strong>&quot; at this <strong>if(frequency&gt;correctFrequency-1&amp;frequency;&lt;correctFrequency+1){</strong></p><p> im very very new with arduino and i need explanation :( can someone help me ?</p><p>thanks so much</p>
<p>dude here is the correct code</p><p>/*</p><p> * Arduino Guitar Tuner</p><p> * by Nicole Grimwood</p><p> *</p><p> * For more information please visit:</p><p> * https://www.instructables.com/id/Arduino-Guitar-Tuner/</p><p> *</p><p> * Based upon:</p><p> * Arduino Frequency Detection</p><p> * created October 7, 2012</p><p> * by Amanda Ghassaei</p><p> *</p><p> * This code is in the public domain. </p><p>*/</p><p>//data storage variables</p><p>byte newData = 0;</p><p>byte prevData = 0;</p><p>unsigned int time = 0;//keeps time and sends vales to store in timer[] occasionally</p><p>int timer[10];//storage for timing of events</p><p>int slope[10];//storage for slope of events</p><p>unsigned int totalTimer;//used to calculate period</p><p>unsigned int period;//storage for period of wave</p><p>byte index = 0;//current storage index</p><p>float frequency;//storage for frequency calculations</p><p>int maxSlope = 0;//used to calculate max slope as trigger point</p><p>int newSlope;//storage for incoming slope data</p><p>//variables for deciding whether you have a match</p><p>byte noMatch = 0;//counts how many non-matches you've received to reset variables if it's been too long</p><p>byte slopeTol = 3;//slope tolerance- adjust this if you need</p><p>int timerTol = 10;//timer tolerance- adjust this if you need</p><p>//variables for amp detection</p><p>unsigned int ampTimer = 0;</p><p>byte maxAmp = 0;</p><p>byte checkMaxAmp;</p><p>byte ampThreshold = 10;//raise if you have a very noisy signal</p><p>//variables for tuning</p><p>int correctFrequency;//the correct frequency for the string being played</p><p>void setup(){</p><p> Serial.begin(9600);</p><p> //LED pins</p><p> pinMode(7,OUTPUT);</p><p> pinMode(6,OUTPUT);</p><p> pinMode(5,OUTPUT);</p><p> pinMode(4,OUTPUT);</p><p> pinMode(3,OUTPUT);</p><p> pinMode(2,OUTPUT);</p><p> pinMode(A3,OUTPUT);</p><p> pinMode(A4,OUTPUT);</p><p> pinMode(A5,OUTPUT);</p><p> pinMode(A1,OUTPUT);</p><p> pinMode(A2,OUTPUT);</p><p> pinMode(8,OUTPUT);</p><p> pinMode(9,OUTPUT);</p><p> //Beginning LED sequence</p><p> digitalWrite(7,1);</p><p> digitalWrite(6,1);</p><p> digitalWrite(5,1);</p><p> digitalWrite(4,1);</p><p> digitalWrite(3,1);</p><p> digitalWrite(2,1);</p><p> digitalWrite(8,1);</p><p> analogWrite(A1,255);</p><p> delay(500);</p><p> digitalWrite(9,1);</p><p> analogWrite(A2,255);</p><p> delay(500);</p><p> digitalWrite(A5,255);</p><p> analogWrite(A3,255);</p><p> delay(500);</p><p> analogWrite(A4,255);</p><p> delay(500);</p><p> cli();//disable interrupts</p><p> //set up continuous sampling of analog pin 0 at 38.5kHz</p><p> //clear ADCSRA and ADCSRB registers</p><p> ADCSRA = 0;</p><p> ADCSRB = 0;</p><p> ADMUX |= (1 &lt;&lt; REFS0); //set reference voltage</p><p> ADMUX |= (1 &lt;&lt; ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only</p><p> ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz</p><p> ADCSRA |= (1 &lt;&lt; ADATE); //enabble auto trigger</p><p> ADCSRA |= (1 &lt;&lt; ADIE); //enable interrupts when measurement complete</p><p> ADCSRA |= (1 &lt;&lt; ADEN); //enable ADC</p><p> ADCSRA |= (1 &lt;&lt; ADSC); //start ADC measurements</p><p> sei();//enable interrupts</p><p>}</p><p>ISR(ADC_vect) {//when new ADC value ready</p><p> PORTB &amp;= B11101111;//set pin 12 low</p><p> prevData = newData;//store previous value</p><p> newData = ADCH;//get value from A0</p><p> if (prevData &lt; 127 &amp;&amp; newData &gt;=127){//if increasing and crossing midpoint</p><p> newSlope = newData - prevData;//calculate slope</p><p> if (abs(newSlope-maxSlope)&lt;slopeTol){//if slopes are ==</p><p> //record new data and reset time</p><p> slope[index] = newSlope;</p><p> timer[index] = time;</p><p> time = 0;</p><p> if (index == 0){//new max slope just reset</p><p> PORTB |= B00010000;//set pin 12 high</p><p> noMatch = 0;</p><p> index++;//increment index</p><p> }</p><p> else if (abs(timer[0]-timer[index])&lt;timerTol &amp;&amp; abs(slope[0]-newSlope)&lt;slopeTol){//if timer duration and slopes match</p><p> //sum timer values</p><p> totalTimer = 0;</p><p> for (byte i=0;i&lt;index;i++){</p><p> totalTimer+=timer[i];</p><p> }</p><p> period = totalTimer;//set period</p><p> //reset new zero index values to compare with</p><p> timer[0] = timer[index];</p><p> slope[0] = slope[index];</p><p> index = 1;//set index to 1</p><p> PORTB |= B00010000;//set pin 12 high</p><p> noMatch = 0;</p><p> }</p><p> else{//crossing midpoint but not match</p><p> index++;//increment index</p><p> if (index &gt; 9){</p><p> reset();</p><p> }</p><p> }</p><p> }</p><p> else if (newSlope&gt;maxSlope){//if new slope is much larger than max slope</p><p> maxSlope = newSlope;</p><p> time = 0;//reset clock</p><p> noMatch = 0;</p><p> index = 0;//reset index</p><p> }</p><p> else{//slope not steep enough</p><p> noMatch++;//increment no match counter</p><p> if (noMatch&gt;9){</p><p> reset();</p><p> }</p><p> }</p><p> }</p><p> time++;//increment timer at rate of 38.5kHz</p><p> ampTimer++;//increment amplitude timer</p><p> if (abs(127-ADCH)&gt;maxAmp){</p><p> maxAmp = abs(127-ADCH);</p><p> }</p><p> if (ampTimer==1000){</p><p> ampTimer = 0;</p><p> checkMaxAmp = maxAmp;</p><p> maxAmp = 0;</p><p> }</p><p>}</p><p>void reset(){//clean out some variables</p><p> index = 0;//reset index</p><p> noMatch = 0;//reset match couner</p><p> maxSlope = 0;//reset slope</p><p>}</p><p>//Turn off 5 out the 6 LEDs for the guitar strings</p><p>void otherLEDsOff(int LED1, int LED2,int LED3,int LED4,int LED5){</p><p> digitalWrite(LED1,0); </p><p> digitalWrite(LED2,0);</p><p> digitalWrite(LED3,0);</p><p> digitalWrite(LED4,0);</p><p> digitalWrite(LED5,0);</p><p>}</p><p>//Determine the correct frequency and light up </p><p>//the appropriate LED for the string being played </p><p>void stringCheck(){</p><p> if(frequency&gt;70&amp;&amp;frequency&lt;90){</p><p> otherLEDsOff(2,3,5,6,7);</p><p> digitalWrite(2,1);</p><p> correctFrequency = 82.4;</p><p> }</p><p> if(frequency&gt;100&amp;&amp;frequency&lt;120){</p><p> otherLEDsOff(2,3,4,5,6);</p><p> digitalWrite(3,1);</p><p> correctFrequency = 110;</p><p> }</p><p> if(frequency&gt;135&amp;&amp;frequency&lt;155){</p><p> otherLEDsOff(2,3,4,6,7);</p><p> digitalWrite(4,1);</p><p> correctFrequency = 146.8;</p><p> }</p><p> if(frequency&gt;186&amp;&amp;frequency&lt;205){</p><p> otherLEDsOff(2,3,5,6,7);</p><p> digitalWrite(5,1);</p><p> correctFrequency = 196;</p><p> }</p><p> if(frequency&gt;235&amp;&amp;frequency&lt;255){</p><p> otherLEDsOff(2,4,5,6,7);</p><p> digitalWrite(6,1);</p><p> correctFrequency = 246.9;</p><p> }</p><p> if(frequency&gt;320&amp;&amp;frequency&lt;340){</p><p> otherLEDsOff(3,4,5,6,7);</p><p> digitalWrite(7,1);</p><p> correctFrequency = 329.6;</p><p> }</p><p>}</p><p>//Compare the frequency input to the correct </p><p>//frequency and light up the appropriate LEDS</p><p>void frequencyCheck(){</p><p> if(frequency&gt;correctFrequency+1){</p><p> analogWrite(A3,255);//255 analog</p><p> }</p><p> if(frequency&gt;correctFrequency+4){</p><p> analogWrite(A2,255);</p><p> }</p><p> if(frequency&gt;correctFrequency+6){</p><p> analogWrite(A1,255);</p><p> }</p><p> if(frequency&lt;correctFrequency-1){</p><p> analogWrite(A5,255);</p><p> }</p><p> if(frequency&lt;correctFrequency-4){</p><p> digitalWrite(9,1);//1,0 digital</p><p> }</p><p> if(frequency&lt;correctFrequency-6){</p><p> digitalWrite(8,1);</p><p> }</p><p> if(frequency&gt;correctFrequency-1&amp;&amp;frequency&lt;correctFrequency+1){</p><p> analogWrite(A4,255);</p><p> }</p><p>}</p><p>void allLEDsOff(){</p><p> digitalWrite(2,0);</p><p> digitalWrite(3,0);</p><p> digitalWrite(4,0);</p><p> digitalWrite(5,0);</p><p> digitalWrite(6,0);</p><p> digitalWrite(7,0);</p><p> digitalWrite(8,0);</p><p> digitalWrite(9,0);</p><p> analogWrite(A1,0);</p><p> analogWrite(A2,0);</p><p> analogWrite(A3,0);</p><p> analogWrite(A4,0);</p><p> analogWrite(A5,0);</p><p>}</p><p>void loop(){</p><p> allLEDsOff();</p><p> if (checkMaxAmp&gt;ampThreshold){</p><p> frequency = 38462/float(period);//calculate frequency timer rate/period</p><p> }</p><p> stringCheck();</p><p> frequencyCheck();</p><p> delay(100);</p><p>}</p>
<p>Thx so much bro :D</p><p>i hope my tuner can work very good.</p>
<p><div><div><div><p>I'm trying to adapt a lcd screen to this project but I cant seem to figure the code out.</p><p>I have checked everything multiple times but wasn't able to find whats wrong and why isn't this working. Everythig seems to be working fine with the leds but when I try to use the lcd screen it shows nothing.</p><p>I have included the LiquidCrystal on the begining of the code and lcd.begin(16,2); in the setup, this was the other change I did in the code:</p></div></div></div></p><p>&quot;void stringCheck(){</p><p>if(frequency&gt;70&amp;frequency&lt;90){</p><p>lcd.print(&quot;E&quot;);</p><p>correctFrequency = 82.4;</p><p>}</p><p>if(frequency&gt;100&amp;frequency&lt;120){</p><p>lcd.print(&quot;A&quot;);</p><p>correctFrequency = 110;</p><p>}</p><p>if(frequency&gt;135&amp;frequency&lt;155){</p><p>lcd.print(&quot;D&quot;);</p><p>correctFrequency = 146.8;</p><p>}</p><p>if(frequency&gt;186&amp;frequency&lt;205){</p><p>lcd.print(&quot;G&quot;);</p><p>correctFrequency = 196;</p><p>}</p><p>if(frequency&gt;235&amp;frequency&lt;255){</p><p>lcd.print(&quot;B&quot;);</p><p>correctFrequency = 246.9;</p><p>}</p><p>if(frequency&gt;320&amp;frequency&lt;340){</p><p>lcd.print(&quot;e&quot;);</p><p>correctFrequency = 329.6;</p><p>}</p><p>}</p><p>//Compare the frequency input to the correct</p><p>//frequency and light up the appropriate LEDS</p><p>void frequencyCheck(){</p><p>if(frequency&gt;correctFrequency+1){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&gt;&quot;);</p><p>}</p><p>if(frequency&gt;correctFrequency+4){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&gt;&gt;&quot;);</p><p>}</p><p>if(frequency&gt;correctFrequency+6){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&gt;&gt;&gt;&quot;);</p><p>}</p><p>if(frequency&lt;correctFrequency-1){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&lt;&quot;);</p><p>}</p><p>if(frequency&lt;correctFrequency-4){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&lt;&lt;&quot;);</p><p>}</p><p>if(frequency&lt;correctFrequency-6){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;&lt;&lt;&lt;&quot;);</p><p>}</p><p>if(frequency&gt;correctFrequency-1&amp;frequency&lt;correctFrequency+1){</p><p>lcd.setCursor(0,1);</p><p>lcd.print(&quot;OK!&quot;);</p><p>}</p><p>}</p><p>void loop(){</p><p>lcd.clear();</p><p>&quot;</p><p>Thanks for the project! If someone could help me it would be awesome =)</p>
<p>dude i had the same problem using LCD have you figure it out.. Could u send me the correct code</p>
I don't remember exactly what happened but I think the problem was that I was using pin 12 to connect the lcd and the code uses manipulation of this port. Anyway this is the code that i used:<br><br>#include <br><br>//variaveis para armazenar dados<br>byte newData = 0;<br>byte prevData = 0;<br>unsigned int time = 0;//armazena o tempo e envia valores para o vetor time<br>int timer[10];//vetor que armazena o tempo dos eventos<br>int slope[10];//vetor que armazena a inclinacao dos eventos<br>unsigned int totalTimer;//usado para calcular o periodo<br>unsigned int period;//armazena o periodo<br>byte index = 0;//indice atual<br>float frequency;//frequencia<br>int maxSlope = 0;//usado para o calculo da inclina&ccedil;&atilde;o m&aacute;xima como trigger<br>int newSlope;//armazenamento de novas inclinacoes<br><br>//vari&aacute;veis para comparacao<br>byte noMatch = 0;//conta quantos valores diferentes foram recebidos para resetar as variaveis <br>byte slopeTol = 3;//tolerancia da inclinacao (pode ser ajustada)<br>int timerTol = 10;//tolerancia de tempo (pode ser ajustada)<br><br>//variaveis para deteccao da amplitude<br>unsigned int ampTimer = 0;<br>byte maxAmp = 0;<br>byte checkMaxAmp;<br>byte ampThreshold = 30;//aumentar caso o ruido seja muito grande<br><br>//variaveis para o afinador<br>int correctFrequency;//frequencia correta da corda tocada<br><br>LiquidCrystal lcd(13, 11, 5, 4, 3, 2);<br><br>void setup(){<br> <br> lcd.begin(16,2);<br> Serial.begin(9600);<br> lcd.print(&quot;Afinador&quot;);<br> lcd.setCursor(0,1);<br> lcd.print(&quot;&lt;&lt;&lt;&lt;&lt;&lt; oo &gt;&gt;&gt;&gt;&gt;&gt;&quot;);<br> delay(5000);<br> lcd.clear();<br> <br> <br> cli();//desabilita interrupcoes(time sensitive)<br> <br> //da uma amostra do pino 0 com frequencia 38.5kHz<br> <br> //limpa os registradores ADCSRA e ADCSRB <br> ADCSRA = 0;<br> ADCSRB = 0;<br> <br> ADMUX |= (1 &lt;&lt; REFS0); //tensao de referencia <br> ADMUX |= (1 &lt;&lt; ADLAR); //alinhamento &agrave; esqueda do valor de ADC<br> // so eh possivel ler os maiores 8bits do registrador ADCH<br> ADCSRA |= (1 &lt;&lt; ADPS2) | (1 &lt;&lt; ADPS0); //clock do ADC com 32 escalas- 16mHz/32=500kHz<br> ADCSRA |= (1 &lt;&lt; ADATE); //habilita auto trigger<br> ADCSRA |= (1 &lt;&lt; ADIE); //habilita interrupcoes quando a medida foi completa<br> ADCSRA |= (1 &lt;&lt; ADEN); //habilita ADC<br> ADCSRA |= (1 &lt;&lt; ADSC); //habilita medidas ADC <br> <br> sei();//habilita interrupcoes<br>}<br><br>ISR(ADC_vect) {//quando um valor novo de ADC est&aacute; pronto<br> <br> PORTB &amp;= B11101111;//pino 12 em low<br> prevData = newData;//armazena dado anterior<br> newData = ADCH;//novo valor de A0<br> if (prevData &lt; 127 &amp;&amp; newData &gt;=127){//se aumentando ao passar por 2.5v<br> newSlope = newData - prevData;//calcular inclinacao<br> if (abs(newSlope-maxSlope) //armazenar os dados e zerar o tempo<br> slope[index] = newSlope;<br> timer[index] = time;<br> time = 0;<br> if (index == 0){//resetar se a inclinacao eh nova<br> PORTB |= B00010000;//pino 12 no high<br> noMatch = 0;<br> index++;//aumenta o indice<br> }<br> else if (abs(timer[0]-timer[index]) //se o tempo e a inclinacao sao iguais aos valores iniciais<br> //somar os valores do tempo<br> totalTimer = 0;<br> for (byte i=0;i totalTimer+=timer[i];<br> }<br> period = totalTimer;//periodo<br> //reseta novo indice zero para comparacao<br> timer[0] = timer[index];<br> slope[0] = slope[index];<br> index = 1;<br> PORTB |= B00010000;//pino 12 high<br> noMatch = 0;<br> }<br> else{//cruza a linha de 2.5v mas nao deve ser armazenado(nao eh match)<br> index++;//aumenta o indice<br> if (index &gt; 9){<br> reset();<br> }<br> }<br> }<br> else if (newSlope&gt;maxSlope){//se a inclinacao eh muito maior que a inclinacao max<br> maxSlope = newSlope;<br> time = 0;//reseta o clock<br> noMatch = 0;<br> index = 0;//reseta indice<br> }<br> else{//inclinacao menor que o esperado<br> noMatch++;//aumenta o contador do noMatch<br> if (noMatch&gt;9){<br> reset();<br> }<br> }<br> }<br> <br> time++;//aumenta o timer em uma taxa de 38.5kHz<br> <br> ampTimer++;//aumenta o timer da amplitude<br> if (abs(127-ADCH)&gt;maxAmp){<br> maxAmp = abs(127-ADCH);<br> }<br> if (ampTimer==1000){<br> ampTimer = 0;<br> checkMaxAmp = maxAmp;<br> maxAmp = 0;<br> }<br> <br>}<br><br>void reset(){//limpa algumas variaveis<br> index = 0;//reseta o indice<br> noMatch = 0;//reseta o contador de noMatch<br> maxSlope = 0;//reseta inclinacao<br>}<br><br><br>//Determina a frequ&ecirc;ncia correta <br><br>void stringCheck(){<br> <br> lcd.setCursor(0,0);<br><br> if(frequency&gt;70&amp;frequency&lt;90){<br> lcd.print(&quot;Corda E . E (mi)&quot;);<br> correctFrequency = 82.4;<br> }<br> if(frequency&gt;100&amp;frequency&lt;120){<br> lcd.print(&quot;Corda A . A (la)&quot;);<br> correctFrequency = 110;<br> }<br> if(frequency&gt;135&amp;frequency&lt;155){<br> lcd.print(&quot;Corda D . D (re)&quot;);<br> correctFrequency = 146.8;<br> }<br> if(frequency&gt;186&amp;frequency&lt;205){<br> lcd.print(&quot;Corda G . G (sol)&quot;);<br> correctFrequency = 196;<br> }<br> if(frequency&gt;235&amp;frequency&lt;255){<br> lcd.print(&quot;Corda B . B (si)&quot;);<br> correctFrequency = 246.9;<br> }<br> if(frequency&gt;320&amp;frequency&lt;340){<br> lcd.print(&quot;Corda e . e (mi)&quot;);<br> correctFrequency = 329.6;<br> }<br>}<br><br>//Compara a frequencia de entrada com a<br>//frequencia correta para determinar o ajuste<br>void frequencyCheck(){<br> <br> if(frequency&gt;correctFrequency+1){<br> lcd.setCursor(0,1);<br> lcd.print(&quot; &lt;&lt; &quot;);<br> }<br> if(frequency&gt;correctFrequency+6){<br> lcd.setCursor(0,1);<br> lcd.print(&quot;&lt;&lt;&lt;&lt;&lt;&lt; &quot;);<br> }<br> if(frequency lcd.setCursor(0,1);<br> lcd.print(&quot; &gt;&gt; &quot;);<br> }<br> if(frequency lcd.setCursor(0,1);<br> lcd.print(&quot; &gt;&gt;&gt;&gt;&gt;&gt;&quot;);<br> }<br> if(frequency&gt;correctFrequency-1&amp;frequency lcd.setCursor(0,1);<br> lcd.print(&quot; oo &quot;);<br> <br> }<br>}<br><br><br>void loop(){<br><br> if (checkMaxAmp&gt;ampThreshold){<br> frequency = 38462/float(period);<br> //calcula a frequencia taxa do timer/periodo<br> }<br> <br> stringCheck();<br> frequencyCheck();<br><br> <br> delay(100);<br> lcd.clear();<br> <br>}
<p>sory for the late reply thought u never reply so u mean we have to use other lcd not the 12 pin lcd....lol so sad i have the 12 pin lcd</p>
<p>This is a nice project.I ve been trying to use the LCD instead of LED does any one have the code for it.</p>
<p>I made it work. Thank you so much for your tutorial! It was an awesome feeling having it done.</p>
<p>can you send your coding in hawisscooterist@gmail.com</p><p>i have problem in a compile coding </p>
<p>Awesome! Looks great! Glad it worked out.</p>
<p>may i see ur schematic sir, pls?</p>
<p>just refer to the schematic on step 6. what I found useful was that I started wiring everything from the arduino first. I actually skipped the frequency detection code and started wiring in all the LEDs and tested it out with my guitar. here is video if you are curious on how I set it up. </p><p>https://www.facebook.com/photo.php?v=832338783445292&amp;set=vb.100000075330048&amp;type=2&amp;theater&amp;notif_t=video_comment</p>
<p>Awesome project, Nicole! How critical is it that the op amp be a TL082? I have quite a few different op amps on hand, but, sadly, the TL082 isn't one of them. Is there another part I could substitute? Thanks!</p>
<p>hi.thanks.it was an interesting project!!</p><p>i've got a question and it's related to my project.i wanna make s.th with an arduino uno to recive guitar notes and show it's frequency and note name on the LCD.but i've got a lot of problems with the code and it made me really confused.what should I do in your opinions?</p><p>I would really appriciate that if you help me with the circuit and the code.</p>
<p>Hi! Thanks!</p><p>Did you try checking out the serial output from the arduino to make sure it's correctly registering the frequency? Is there a certain step that you're stuck on? Do you happen to have access to an oscilloscope?</p>
<p>does any one have any idea about my problem?</p><p>I really need help.</p>
<p>Hi! I love this project. I have a problem though. Three of the LEDs are constantly on, and I can't seem to be able to get it to work. The input test just gave me the repeating word 'clipping', no matter what sound is coming to the arduino. I'm thinking that maybe there isn't any sound coming to it. Please help. Thanks,</p><p><em>G.</em></p>
<p>Hi! Your project is very impressive!! Congratulations!!</p><p>About latency, you already had measured that information? How many time the Arduino spend until detect the frequency?</p>
<p>Please tell the procedure for acoustic guitar ? can we not use the wire to carry the signal as you have used ? Please reply asap !</p>
Hi! So you would want to use a microphone to get the signal from the guitar. This would be a bit more unreliable since there could be external noise and the microphone might not pick up the signal as well. Depending on the microphone you use, you might also need to change the amplifier portion of the circuit.
<p>How about using a piezo as a contact mic, kind of the way that the Snark and similar tuners work?</p>
<p>This Instructable might be useful: </p><p>https://www.instructables.com/id/Arduino-Audio-Input/</p>
<p>This is where diy gets weird. What is the point of making something that will cost about $100 to make something that is vastly inferior to the many chinese guitar tuners on the market that cost under $10.00 and come with features like an led, a range of tuning scale, clip onto the headstock for both electric and acoustic guitars, and run off a tiny watch battery and not off of 18v supply (more dead batteries in the landfill). You'd learn a lot more about electronics trying to figure your project out using a bunch of 555 timer chips. The only winner here is Radio Shack promoting their ridiculaouly overpriced parts..bah humbug :)</p>
<p>&quot;We have a be nice comment policy.<br> Please be positive and constructive.&quot;</p><p>Not every instructable is about making something that is better or cheaper than the commercial version.</p><p>I am personally glad to see this instructable; I think it's cool. And it helps teach me something about programming and frequency detection (which I'm interested in), although not so much about electronics (which I'm not as interested in).</p><p>Too bad the only place I can get the parts for this instructable is Radio Shack. Oh, wait...</p>
<p>This is brilliant. Great job! We have a free online tuning fork which can be enjoyed here: http://www.123guitartuner.com</p>
<p>Hi. I'm really a newbie and i'd like to make a tuner like this one, but in a smaller version, so i don't want to use two 9v batteries. I was wondering if there's a way to amplify audio signal up to 2.5v, always using a TL082, but only one 12v battery. Could someone help me please?</p>
<p>having some errors when I try to program the code. Does anyone have a sketch saved that works that I could possibly borrow? I would love to try this out have all wired just needing help with the code</p>
<p>please give the schematic, circuit diagram when we are using microphone instead of a wire to take input from the acoustic guitar. We are struck in the middle of our project. please help asap.</p>
<p>Hi, great instructable, very useful indeed. My query is regarding the signal coming in from the guitar lead. What is the voltage and current of the said signal? I'm guessing the peak voltage is about 0.25V but I have no knowledge of the current output. Please could you help, it would really be appreciated.</p>
<p>HEY!! nice project. I tied to build this and have problems with arduino. (my first arduino project) so when i not strum strings always leds what are connected to pin 8 9 and A5 are always on. How can i get those off when i am not hitting srings :) sorry my englis is worst.</p>
<p>hi i'm jin i've read your making idea </p><p>my team will make it following you</p><p>if we don't use arduino how should make it? (using ic or transistor)</p><p>my english is something wrong or rude </p><p>plz understand me ~</p><p>thank you read it :) </p>
<p>i made it with some modifications :)</p>
<p>Very remarkable and ingenious project!!</p><p>Just one question, if I may: I just can't seem to get around a couple of weird messages that the serial monitor gives me every time, and I was wondering if there's any way to fix it. Most of times it just says &quot;cl&quot; and, by trying different changes in the sketch, I always got only as far as &quot;inf hz&quot;, just like a guy a couple messages behind. The project is currently assembled on a breadboard, so I could easily change it. But... I don't know. I'm just stuck, I guess... :(</p>
<p>Hmm darn. Okay, are you sure that you have the amplifier and offset set up correctly? Do you have access to an oscilloscope? Not sure what cl means.. Possibly It's "clipping" but the message was cut off. If that's the case, the amplitude of your signal coming in is too large. What did you change to get it to say inf hz? When I did the project, I only got that message when I had no signal coming in. Hopefully we can figure this out.</p>
<p>hi i've followed everything and made the circuit work. however, i the yellow LEDs seem to work very unstably. any suggestion on how to fix this? Thanks!</p>
<p>Hey! Even my finished product jumped around a bit. It took a little bit of experimentation to get it to my liking. One thing you could try is you can change the ampThreshold constant in the code. Currently the code has it set at 20, but you could try values ranging from 10-30 and see if that helps at all. I believe that higher thresholds lead to less clipping, but they also lead to less accurate frequency detection. Let me know if that works for you.</p>
<p>Do you have the proteus file of the Amplification and offsetting circuit design? I'm little confused to design it on Proteus</p>
<p>Hey there, I finished all the soldering and even started the LED's but am having trouble getting the frequency to read out. I'm getting the same issue as a previous comment about the &quot;inf hz&quot; being displayed hundreds of times in the serial monitor. I've quadruple checked all my connections, placemets, and soldering and everything goes with the schematic and your photos it seems. Any idea? Is this a short circuit or is my soldering wrong? (See images below - I know it's poor, I'm a beginner). Please help! This project rocks but I'm bummed if it doesn't ever come together.</p>
<p>Oh no! Hmm, It's honestly pretty hard to tell from the photos. Obviously It's kind of late in the game now, but did you try bread-boarding the circuit first? If you did, did you have the same problem? Is your guitar turned all the way up? Are you sure your batteries are good? Sorry if these are stupid questions.. Just gotta cover all the basics first.</p>
<p>I did but didn't get a readout, I'm new with breadboards and electronics in general so I figured I probably hooked it up wrong. I felt more comfortable following your schematic and pictures, but ended up with the 3 rd lights on the right. Would it help if I took closer pictures? I also used a 104 M ceramic capacitor, you seemed to use a 473M capacitor, does this matter?</p>
<p>Hi, I actually only used 10uF and 100nF capacitors. I'm assuming you replaced the 100nF cap with the 104M cap? That could be your problem. I also highly recommend breadboarding your circuit and getting it working before soldering. It makes it easier to make changes and It'll help you in the long run. Let me know if you still encounter problems.</p>
<p>I built this project but the LEDs seem working wrong. They don't refrhes themselves. They stay the same when I kill the sound. I built for an acoustic guitar</p>
<p>The way I coded it, the LEDs only respond to new audio input, so they will stay lit up until you strum the guitar again. You can definitely change the code so that they turn off when there is no new input.</p>
<p>I know the circuit I built is correct but i just get inf hz and clipping if I strum the guitar... so now what...</p>
<p>Hmm darn. I recall having a similar problem when I made mine. I'm sure we can figure it out. Are you confident that the signal coming from the guitar is about 5V peak to peak? I think I had that problem when the amplitude of the signal coming in wasn't quite right or if there was no signal at all. Have you played with the volume on your guitar?</p>
Not entirely sure... I don't have a scope and my Mac doesn't have a line in so not quite sure what to do in that case... I think my problem is VCC+ voltage because I'm trying to not use 9v since I use them up like mad so I'm hacking up power supplies and not getting 18v... Either too high or too low and at one point I was getting some frequencies but really had to dig in because of the low voltage supply. I'll try using 9v batteries to test and build and worry about external supplies after it works lol. I'll let you know when the magic smoke comes out :P
<p>We tried this tonight. There's something wrong with the power section. The Ardunio wouldn't power up, until we powered externally and disconnected from the battery power. </p>
<p>Powering externally is a bit more difficult because you need both positive and negative voltage. She splits the power in the middle to get a ground reference and 9v for the arduino. If you want to power external then I would loop up schematics for a positive and negative supply but for testing I would go with two 9 volts just until you get it working.</p>
<p>Yeah I feel ya about the 9v batteries, but I think that could be the problem. Let me know how it goes! </p>

About This Instructable

180,725views

458favorites

License:

Bio: Hey! I am an Electrical Engineering major and I love making fun and useful electronics projects. I am also interested in crafts of all sorts ... More »
More by nikoala3:Whipped Coconut Oil Laser Cut Light Fixture Knitted Flower Headband 
Add instructable to: