![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
A program to automatically tune a guitar. Written by Justin Reidhead and Steven Swenson
Dependencies: FFT FrequencyFinder Motor NewTextLCD PinDetect mbed strings
Diff: main.cpp
- Revision:
- 14:fd59e7acf2e5
- Parent:
- 13:948c7d19acb9
--- 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; }