3 Simple Ways to
Share What You Make

With Instructables you can share what you make with the world — and tap into an ever-growing community of creative experts.

PhotosPhotos

Share one or more photos of a project, recipe, or whatever you've made, quickly and easily.

Step by StepStep-By-Step

Share your step-by-step photos with text instructions of what you made so others can do it too!

VideoVideo

Share your how-to video. You'll need your embed code from a video site such as YouTube.

Visual / Aural Guitar Tuner "The Tune Trainer"

Step 2Programming

Programming
The program for the arduino takes in button commands from the 6 pushbuttons on pins 2-7 and outputs the selected frequency in light and sound via pins 10 and 11 (two of the PWM pins) these outputs are pulsed high and low at the frequency of the selected note to drive the Peizo and the LED respectively

here's the basic flow of the program (in pseudo-code):

loop
-check for buttons
-if button
--set "frequency"
--loop
-- -set led HIGH
-- -set piezo HIGH
-- -wait "led pulse length"
-- -set led LOW
-- -wait "frequency"/2 - "led pulse length"
-- -set piezo LOW
-- -wait "frequency"/2
-- -check for buttons
-- -if button
-- --break
-- -end if
--end loop
-end if
end loop

and the full code

//**************************// THE TUNE TRAINER v1.0// BY: GREG SCHOPPE// http://www.gschoppe.com//**************************// STRINGS  ========================================#define  e      3034    // 329.63 Hz#define  b      4050    // 246.94 Hz#define  g      5102    // 196.00 Hz#define  d      6811    // 146.83 Hz#define  a      9091    // 110.00 Hz#define  E     12135    // 82.407 Hz#define  NONE      0    // Default State// -- length of time the LED is on in each cycle#define FlashLength     1024// SETUP ============================================// Set up input on 6 pinsint inPin_e = 7;int inPin_b = 6;int inPin_g = 5;int inPin_d = 4;int inPin_a = 3;int inPin_E = 2;// Set up output on a PWM pin (digital 9, 10 or 11)int freqOut = 11;// Do we want debugging on serial out? 1 for yes, 0 for noint DEBUG = 0;void setup() {   pinMode(freqOut, OUTPUT);  // declare pushbuttons as input  pinMode(inPin_e, INPUT);  //high-e  pinMode(inPin_b, INPUT);  //     b  pinMode(inPin_g, INPUT);  //     g  pinMode(inPin_d, INPUT);  //     d  pinMode(inPin_a, INPUT);  //     a  pinMode(inPin_E, INPUT);  // low-e   // turn on pull-up resistors  digitalWrite(inPin_e,HIGH);  //high-e  digitalWrite(inPin_b,HIGH);  //     b  digitalWrite(inPin_g,HIGH);  //     g  digitalWrite(inPin_d,HIGH);  //     d  digitalWrite(inPin_a,HIGH);  //     a  digitalWrite(inPin_E,HIGH);  // low-e    if (DEBUG) {     Serial.begin(9600); // Set serial out if we want debugging  }  // SIGNAL THAT THE CHIP IS READY  digitalWrite(freqOut,HIGH);  delay(500);  digitalWrite(freqOut,LOW);   }int input () {  if(digitalRead(inPin_e)==LOW) {    return(e);  }  if(digitalRead(inPin_b)==LOW) {    return(b);  }  if(digitalRead(inPin_g)==LOW) {    return(g);  }  if(digitalRead(inPin_d)==LOW) {    return(d);  }  if(digitalRead(inPin_a)==LOW) {    return(a);  }  if(digitalRead(inPin_E)==LOW) {    return(E);  }  return(NONE);}void playTone (int period) {  if(period==NONE) { //if no button has been pressed    return;  }    int ToneLength = period/2 - FlashLength;  int OffLength  = period/2;    // SIGNAL THAT THE INPUT WAS ACCEPTED  digitalWrite(freqOut,LOW);  delay(100);  digitalWrite(freqOut,HIGH);  delay(100);  digitalWrite(freqOut,LOW);  delay(500);  // CONTINUE TO STROBE LOOP    // -- the strobe loop runs 4 strobes before each test,  // -- to try and lose as few microseconds as possible.  while(true) {    // BEGIN SET OF 4 STROBES	    // ON TONE & LIGHT    PORTB = (B00001100 | PORTB);   // -- turns on  Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(FlashLength);    // OFF LIGHT    PORTB = (B11110111 & PORTB);   // -- turns off Pin 11; Leaves all others as-is;    delayMicroseconds(ToneLength);        // OFF BOTH    PORTB = (B11110011 & PORTB);   // -- turns off Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(OffLength);        // ON TONE & LIGHT    PORTB = (B00001100 | PORTB);   // -- turns on  Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(FlashLength);    // OFF LIGHT    PORTB = (B11110111 & PORTB);   // -- turns off Pin 11; Leaves all others as-is;    delayMicroseconds(ToneLength);        // OFF BOTH    PORTB = (B11110011 & PORTB);   // -- turns off Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(OffLength);        // ON TONE & LIGHT    PORTB = (B00001100 | PORTB);   // -- turns on  Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(FlashLength);    // OFF LIGHT    PORTB = (B11110111 & PORTB);   // -- turns off Pin 11; Leaves all others as-is;    delayMicroseconds(ToneLength);        // OFF BOTH    PORTB = (B11110011 & PORTB);   // -- turns off Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(OffLength);        // ON TONE & LIGHT    PORTB = (B00001100 | PORTB);   // -- turns on  Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(FlashLength);    // OFF LIGHT    PORTB = (B11110111 & PORTB);   // -- turns off Pin 11; Leaves all others as-is;    delayMicroseconds(ToneLength);        // OFF BOTH    PORTB = (B11110011 & PORTB);   // -- turns off Pin 11 and Pin 10; Leaves all others as-is;    delayMicroseconds(OffLength);    // END SET OF 4 STROBES        //Check Input Pins    if ( (PIND & B11111100) != B11111100) {    // -- PIND is a register containing the state of pins 0-7 as a byte;    // -- i.e. B11111101 would signify that pins 1 and 5 were LOW and the rest were HIGH.    // -- the testing against B11111100 is to ignore inputs on pin 0 and pin 1 (RX and TX)    // -- so, the above code means that if any of pins 2-7 are low, we exit the loop.		return;	}      }  }void loop() {	playTone(input());}

I saved a bit of time in the inner loop with some hacked together bit operations, but overall the coding is pretty basic. Its also a bit of a hack, so please don't nag me about rogue style syntax laws. I know what they are, but when I'm rushing, I ignore them...

you can change the frequencies of each button by altering the declarations at the top.
« Previous StepDownload PDFView All StepsNext Step »

Pro

Get More Out of Instructables

Already have an Account?

close

All Steps Viewing
View all steps of an Instructable on the same page when you're a Pro Member.

Upgrade to Pro today!
23
Followers
12
Author:gschoppe
I'm a self proclaimed renaissance man. My goal in life is to have a conversational/practical knowledge of every subject known to man. I do graphics design in my spare time, along with make-ing.