A program to automatically tune a guitar. Written by Justin Reidhead and Steven Swenson

Dependencies:   FFT FrequencyFinder Motor NewTextLCD PinDetect mbed strings

Files at this revision

API Documentation at this revision

Comitter:
melangeaddict
Date:
Thu Apr 26 22:20:53 2012 +0000
Parent:
13:948c7d19acb9
Child:
15:bb2bc286f44b
Commit message:
98% Completed; Good step numbers up and down;

Changed in this revision

FrequencyFinder/FrequencyFinder.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/FrequencyFinder/FrequencyFinder.cpp	Thu Apr 26 21:22:56 2012 +0000
+++ b/FrequencyFinder/FrequencyFinder.cpp	Thu Apr 26 22:20:53 2012 +0000
@@ -47,7 +47,7 @@
             signal_array[j]=0;
         else if (j<400)//~97Hz
             signal_array[j]=signal_array[j]*3;
-        else if (j<600)//~146Hz
+        else if (j<550)//~
             signal_array[j]=signal_array[j]*6;
         else if (j<900)//~219Hz
             signal_array[j]=signal_array[j]*10;
--- a/main.cpp	Thu Apr 26 21:22:56 2012 +0000
+++ b/main.cpp	Thu Apr 26 22:20:53 2012 +0000
@@ -66,7 +66,8 @@
 bool check_threshold(float);//check to make sure the frequency is valid (frequency to check)
 void LED_initialize();//Initialization sequence for LEDs, called at start-up
 void set_LED(int led, int value);//sets or clears an LED: Blue=1(in tune), Red=2(flat), Green=3(sharp). Value=1(off), 0(on);
-int get_steps(float desired, float current);
+int get_up_steps(float desired, float current);
+int get_down_steps(float desired, float current);
 //*************************************************
 //*********************main************************
 int main() {
@@ -78,7 +79,7 @@
     device_init();//Setup buttons and set global variables
 
 
-    float freq_acc[6] = {.7,.7,.6,.6,.5,.5};//Values to be between when tuning i.e., the first string is +-.7 to desired
+    float freq_acc[6] = {.7,.7,.7,.6,.5,.5};//Values to be between when tuning i.e., the first string is +-.7 to desired
     int state=0,next_state=0;
     int num_steps=0;
     //float old_freq=0;
@@ -127,7 +128,18 @@
 
                 if (check_threshold(new_freq)) {//The check_threshold function makes sure the frequency is valid (less than 500 Hz)
 
-                    num_steps=get_steps(desired_freq, new_freq);
+                    lcd.cls();
+                    lcd.locate(9,0);
+                    lcd.printf("%f",new_freq);
+                    lcd.locate(9,1);
+                    lcd.printf("%f",desired_freq);
+
+                    lcd.locate(0,1);
+                    lcd.printf("Desired");
+                    lcd.locate(0,0);
+                    lcd.printf("Detected");
+
+                    // num_up_steps=get_steps(desired_freq, new_freq);
 
                     if ((desired_freq-freq_acc[selected_string])<new_freq && (desired_freq+freq_acc[selected_string])>new_freq) {//We are within .5Hz of the desired frequency
 
@@ -147,9 +159,9 @@
                         start_tuning=false;
                         output_menu();
                         setup_buttons();
-                        new_freq=0;//Just to reset
                         next_state=0;
-                    } else if ((desired_freq-.5)>new_freq) {//We are too low, and need to turn the string tigher
+                    } else if ((desired_freq-freq_acc[selected_string])>new_freq) {//We are too low, and need to turn the string tigher
+                        num_steps=get_up_steps(desired_freq, new_freq);
                         if (current_direction==down) {
                             num_steps+=10;//For deadband
                             current_direction=up;
@@ -170,6 +182,7 @@
                         next_state=3;
 
                     } else {//We are too high, and need to loosen the string
+                        num_steps=get_down_steps(desired_freq, new_freq);
                         if (current_direction==up) {
                             num_steps+=10;//For deadband
                             current_direction=down;
@@ -206,11 +219,11 @@
 
                 if (current_mode==winding_mode) {
                     if (wind_up) {
-                        motor.motor_turn(up,5);//TODO:Adjust number of turns
+                        motor.motor_turn(up,10);//TODO:Adjust number of turns
                     }
 
                     if (wind_down) {
-                        motor.motor_turn(down,5);//TODO:Adjust number of turns
+                        motor.motor_turn(down,10);//TODO:Adjust number of turns
                     }
                     next_state=4;
                 } else {
@@ -224,8 +237,8 @@
                 break;
             default:
                 break;
-        }//end switch
-        wait_ms(5);
+        }//end switch  end of state machine
+        //wait_ms(5);
 
         if (start_tuning==false) {//If the stop button is pressed, the state machine returns to user input
             next_state=0;
@@ -239,16 +252,7 @@
 
         if (start_tuning) {
             if (check_threshold(new_freq)) {
-                lcd.cls();
-                lcd.locate(9,0);
-                lcd.printf("%f",new_freq);
-                lcd.locate(9,1);
-                lcd.printf("%f",desired_freq);
 
-                lcd.locate(0,1);
-                lcd.printf("Desired");
-                lcd.locate(0,0);
-                lcd.printf("Detected");
             }
         }
     }//end while
@@ -349,7 +353,7 @@
         set_LED(2,0);//red off
         set_LED(1,0);//blue on
         set_LED(3,1);//green on
-        
+
         current_mode=winding_mode;
         lcd.cls();
         lcd.printf("Winding Mode");
@@ -360,7 +364,7 @@
         set_LED(2,1);//red off
         set_LED(1,0);//blue on
         set_LED(3,1);//green off
-        
+
         current_mode=tuning_mode;
         lcd.cls();
         lcd.printf("Tuning Mode");
@@ -631,9 +635,10 @@
     return;
 
 }
+
 //***********************************
-//********get_steps*****************
-int get_steps(float desired, float current) {
+//********get_down_steps*****************
+int get_down_steps(float desired, float current) {
 
     float difference=abs(desired-current);
 
@@ -687,17 +692,6 @@
                 return 8;
             }
         case 1:
-            if (difference>5) {
-                return 35;
-            } else if (difference>3) {
-                return 25;
-            } else if (difference>2) {
-                return 20;
-            } else if (difference>1) {
-                return 10;
-            } else {
-                return 5;
-            }
         case 0:
             if (difference>8) {
                 return 30;
@@ -708,7 +702,92 @@
             } else if (difference>1) {
                 return 10;
             } else {
-                return 5;
+                return 10;
+            }
+
+
+        default:
+            return 0;
+    }//end switch
+}
+//***********************************
+//********get_up_steps*****************
+int get_up_steps(float desired, float current) {
+
+    float difference=abs(desired-current);
+
+    switch (selected_string) {
+        case 5:
+            if (difference>10) {
+                return 60;
+            } else if (difference>3) {
+                return 35;
+            } else if (difference>2) {
+                return 20;
+            } else if (difference>1) {
+                return 15;
+            } else {
+                return 10;
+            }
+        case 4:
+            if (difference>5) {
+                return 100;
+            } else if (difference>4) {
+                return 60;
+            } else if (difference>2) {
+                return 50;
+            } else if (difference>1) {
+                return 30;
+            } else {
+                return 10;
+            }
+        case 3:
+            if (difference>5) {
+                return 80;
+            } else if (difference>4) {
+                return 60;
+            } else if (difference>2) {
+                return 50;
+            } else if (difference>1) {
+                return 25;
+            } else {
+                return 10;
+            }
+        case 2:
+            if (difference>5) {
+                return 45;
+            } else if (difference>3) {
+                return 30;
+            } else if (difference>2) {
+                return 25;
+            } else if (difference>1) {
+                return 20;
+            } else {
+                return 10;
+            }
+        case 1:
+            if (difference>8) {
+                return 35;
+            } else if (difference>6) {
+                return 25;
+            } else if (difference>4) {
+                return 20;
+            } else if (difference>1) {
+                return 13;
+            } else {
+                return 10;
+            }
+        case 0:
+            if (difference>8) {
+                return 30;
+            } else if (difference>6) {
+                return 25;
+            } else if (difference>4) {
+                return 20;
+            } else if (difference>1) {
+                return 15;
+            } else {
+                return 10;
             }