Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BCEmotor Battery_Linear_Actuator_ Controller_ IMU_code_ LTC1298_7_14 MODSERIAL PosVelFilter_7_14 System_ mbed
Fork of 7_14_17_FSG_working by
Diff: main.cpp
- Revision:
- 4:3c22d85a94a8
- Parent:
- 3:1257a7d2eb3a
- Child:
- 5:7421776f6b08
diff -r 1257a7d2eb3a -r 3c22d85a94a8 main.cpp
--- a/main.cpp Fri Jun 30 18:39:25 2017 +0000
+++ b/main.cpp Fri Jul 07 21:23:19 2017 +0000
@@ -39,8 +39,11 @@
Ticker LA_ticker; //new 6/22/17
float positionCmd = 250.0;
+
/* ************************************************************************* */
+float pi = 3.14159265359;
+
/* PID LOOP STUFF */
float la_setPoint = 0.00; //the IMU pitch angle we want (setpoint)
@@ -58,12 +61,13 @@
{
led1 = !led1; //flash the IMU LED
- PC.printf("%s\n", IMU_STRING.c_str()); //if there's something there, print it
+ //PC.printf("%s\n", IMU_STRING.c_str()); //if there's something there, print it
+ // PC.printf("\t pitch angle... %f set pitch angle: %f\n", IMU_pitch_angle, la_setPoint);
}
void PRESSURE_ticking()
{
- PC.printf("pressure: %f mm \r", (0.00122*(adc().ch1_filt)*14.931)-0.0845); //read the analog pin
+ //PC.printf("pressure: %f mm \r", (0.00122*(adc().ch1_filt)*14.931)-0.0845); //read the analog pin
//this voltage has been checked and scaled properly (6/28/2017)
}
@@ -110,8 +114,20 @@
float count = 0.0;
//char userInput; //from Trent's code?
- int la_step = 1;
- int la_setPoint_temp = 0;
+ float la_step = 1.0;
+ float la_setPoint_temp = 0.0;
+
+ bool BCE_auto = true;
+ bool LA_auto = true;
+
+ float bce_auto_step_raw = 1.0;
+ float bce_auto_step_l;
+ float convert = 10000;
+ float bce_auto_step_ml = bce_auto_step_raw * convert;
+ int bce_man_step = 1;
+ float volume_bce = 90.0*convert;
+ float positionCmd_temp;
+ float ml_to_l= 0.000000001;
hBridge().run(motor_cmd);
@@ -129,10 +145,14 @@
/* *************************** LED *************************** */
PC.printf("Program Started 6/5/17\n");
+ int cases = 0;
+ int count_while = 0;
+ //hBridge().reset();
+ PC.printf("\n```````````Linear Actuator in IMU controlled mode````````````\n\n");
//PC.printf("Hit shift + \"H\" to home the battery Linear Actuator\n");
/* *************************** Potentiometer *************************** */
- //PRESSURE_ticker.attach(&PRESSURE_ticking, 1.0);
+ PRESSURE_ticker.attach(&PRESSURE_ticking, 3.0);
/* *************************** Potentiometer *************************** */
/* *************************** MOTOR CONTROLLER *************************** */
@@ -141,12 +161,12 @@
/* *************************** IMU *************************** */
IMU_code IMU_object; //create the IMU object from the imported class
- //IMU_ticker.attach(&IMU_ticking, 5.0);
+ IMU_ticker.attach(&IMU_ticking, 3.0);
/* *************************** IMU *************************** */
/* *************************** BCE *************************** */
//float previous_positionCmd = -1;
- //BCE_ticker.attach(&BCE_ticking, 5.0);
+ BCE_ticker.attach(&BCE_ticking, 3.0);
/* *************************** BCE *************************** */
while(1)
@@ -176,44 +196,269 @@
//led4 != led4;
//PC.printf("DEBUG: PC IS READABLE\n"); //DEBUG
- Key=PC.getc();
- if(Key=='w' or Key =='W')
+ Key=PC.getc();
+ //Universal MBED Controls
+ if(Key=='!') //RESET THE MBED
{
- PC.printf("\nW received!\n");
-
- posCon().writeSetPoint(positionCmd);
- //posCon().setPgain(P);
- //posCon().setIgain(I);
- //posCon().setDgain(D);
- hBridge().run(posCon().getOutput());
-
- hBridge().reset();
-
- count = 0;
-
+ PC.printf("MBED RESET KEY (!) PRESSED\n");
+ PC.printf("Linear Actuator Motor disabled!\n");
+ //disable the motor
+ BLA_object.Keyboard_Q(); //DISABLE THE MOTOR
+ wait(0.5); //500 milliseconds
+ mbed_reset(); //reset the mbed!
}
-
- /*else if (Key == 'k' or Key=='K')
- PC.printf("%s\n", BLA_object.Keyboard_K().c_str());
- else if (Key == 'l' or Key == 'L')
- PC.printf("%s\n", BLA_object.Keyboard_L().c_str());*/
-
- /*else if(Key =='Q' or Key == 'q') //motor disabled
+ else if(Key =='H') //homing sequence
{
- PC.printf("%s\n", BLA_object.Keyboard_Q());
- }
-
- else if(Key =='E' or Key == 'e') //motor enabled
- {
- PC.printf("%s\n", BLA_object.Keyboard_E());
- }*/
-
+ PC.printf("### homing the device ###");
+ BLA_object.Keyboard_H();
+ wait(5); //for debugging
+
+ PC.printf("### position is %d ###\n", BLA_object.get_pos().c_str()); //flip this back and forth
+ wait(1); //for debugging
+ }
else if(Key=='p' or Key == 'P')
{
PC.printf("### position is %s ###\n", BLA_object.get_pos().c_str()); //flip this back and forth
- wait(10); //for debugging
+ wait(1); //for debugging
// "-999999" means it is not working
}
+
+ //Buoyancy Engine Controls
+ else if (Key == ',' or Key == '<')
+ {
+ if (BCE_auto == false)
+ {
+ PC.printf("BCE: Now in Automatic Mode\n");
+ BCE_auto = true;
+ }
+ else
+ {
+ PC.printf("BCE: Still in Manual Mode\n");
+ }
+ }
+ else if (Key == '.' or Key == '>')
+ {
+ if (BCE_auto == true)
+ {
+ PC.printf("BCE: Now in Manual Mode\n");
+ BCE_auto = false;
+ }
+ else
+ {
+ PC.printf("BCE: Still in Automatic Mode\n");
+ }
+ }
+ //BCE Automatic Controls
+ else if (Key == 's' or Key == 'S')
+ {
+ if (BCE_auto == true)
+ {
+ //PC.printf("BCE Automatic Step Size Change\n");
+ if (bce_auto_step_raw == 1.0)
+ {
+ bce_auto_step_raw = 5.0;
+ }
+ else if (bce_auto_step_raw == 5.0)
+ {
+ bce_auto_step_raw = 10.0;
+ }
+ else if (bce_auto_step_raw == 10.0)
+ {
+ bce_auto_step_raw = 1.0;
+ }
+ bce_auto_step_ml = bce_auto_step_raw * convert;
+ PC.printf("BCE Auto Step Size Now %7.0f milliliters\n", bce_auto_step_ml);
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Manual Mode, this is a auto command\n");
+
+ }
+ }
+ else if(Key =='d' or Key == 'D')
+ {
+ if (BCE_auto == true)
+ {
+ volume_bce -= bce_auto_step_ml;
+ PC.printf("The volume for the buoyancy motor is\nVBE: %1.5f liters\n", volume_bce*ml_to_l); //to read in MATLAB
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Manual Mode, this is a auto command\n");
+ }
+ }
+ else if(Key == 'f' or Key == 'F')
+ {
+ if (BCE_auto == true)
+ {
+ volume_bce += bce_auto_step_ml;
+ PC.printf("The volume for the buoyancy motor is\nVBE: %1.5f liters\n", volume_bce*ml_to_l); //to read in MATLAB
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Manual Mode, this is a auto command\n");
+ }
+ }
+ else if(Key == 'r' or Key == 'R')
+ {
+ if (BCE_auto == true)
+ {
+ PC.printf("\nR received!\n");
+ positionCmd=(volume_bce-(pi*40.64*40.64*377))/(-1*pi*40.64*40.64);
+ //positionCmd= positionCmd_temp*0.000000001;
+ //PC.printf("BCE engine going to position: %3.2f\n", positionCmd);
+ PC.printf("\nBASETP: %3.0f\n", positionCmd);
+ posCon().writeSetPoint(positionCmd);
+ //posCon().setPgain(P);
+ //posCon().setIgain(I);
+ //posCon().setDgain(D);
+ hBridge().run(posCon().getOutput());
+
+ hBridge().reset();
+
+ count = 0;
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Manual Mode, this is a auto command\n");
+ }
+ }
+ //BCE Manual Controls
+ else if (Key == '2' or Key == '@')
+ {
+ if (BCE_auto == false)
+ {
+ PC.printf("BCE Manual Step Size Change\n");
+ if (bce_man_step == 1)
+ {
+ bce_man_step = 10;
+ }
+ else if (bce_man_step == 10)
+ {
+ bce_man_step = 25;
+ }
+ else if (bce_man_step == 25)
+ {
+ bce_man_step = 50;
+ }
+ else if (bce_man_step == 50)
+ {
+ bce_man_step = 1;
+ }
+
+ PC.printf("BCE Manual Step Size Now %d\n", bce_man_step);
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Auto Mode, this is a manual command\n");
+ }
+ }
+ else if (Key == 'z' or Key =='Z')
+ {
+ if (BCE_auto == false)
+ {
+ //increment the duty cycle
+ positionCmd -= bce_man_step;
+ PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Auto Mode, this is a manual command\n");
+ }
+ }
+ else if (Key == 'x' or Key == 'X')
+ {
+ if (BCE_auto == false)
+ {
+ //decrement the duty cycle
+ positionCmd += bce_man_step;
+ PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Auto Mode, this is a manual command\n");
+ }
+ }
+ else if(Key=='w' or Key =='W')
+ {
+ if (BCE_auto == false)
+ {
+ PC.printf("\nW received!\n");
+ PC.printf("BASETP: %3.0f\n", positionCmd);
+ posCon().writeSetPoint(positionCmd);
+ //posCon().setPgain(P);
+ //posCon().setIgain(I);
+ //posCon().setDgain(D);
+ hBridge().run(posCon().getOutput());
+
+ hBridge().reset();
+
+ count = 0;
+
+ }
+ else
+ {
+ PC.printf("ERROR: In BCE Auto Mode, this is a manual command\n");
+ }
+ }
+
+ //Linear Actuator Controls
+ else if(Key == 'c' or Key == 'C')
+ {
+ if (LA_auto == true)
+ {
+ PC.printf("ERROR: LA already in auto mode\n");
+ }
+ else
+ {
+ LA_auto = true;
+ PC.printf("```````````Now in IMU Controlled Mode```````````````\n");
+ cases = 0;
+ count_while = 0;
+ }
+ }
+ else if (Key == 'v' or Key == 'V')
+ {
+ if (LA_auto == true)
+ {
+ LA_auto = false;
+ //Change cases: go from imu controlled to manual
+ PC.printf("```````````Now in Manual Mode````````````````````\n");
+ cases = 1;
+ count_while = 0;
+ }
+ else
+ {
+ PC.printf("ERROR: LA already in manual mode\n");
+ }
+ }
+ else if (Key == '0' or Key == ')')
+ {
+ PC.printf(") recieved\n");
+ if (la_step == 0.5)
+ {
+ la_step = 1.0;
+ }
+ else if (la_step == 1.0)
+ {
+ la_step = 5.0;
+ }
+ else if (la_step == 5.0)
+ {
+ la_step = 10.0;
+ }
+ else if (la_step == 10.0)
+ {
+ la_step = 15.0;
+ }
+ else if (la_step == 15.0)
+ {
+ la_step = 0.5;
+ }
+ PC.printf("LA Step Size Now %f\n", la_step);
+ }
+
+
else if (Key == 'A' or Key == 'a')
{
PC.printf("A recieved\n");
@@ -224,35 +469,15 @@
{
la_setPoint_temp -= la_step; //IMU_pitch_angle -= 1.0;
PC.printf("- recieved\n");
- PC.printf("LA angle changed to: %d la_step: %d\n", la_setPoint_temp, la_step);
+ PC.printf("LA angle changed to: %d la_step: %f\n", la_setPoint_temp, la_step);
}
else if (Key =='=' or Key == '+')
{
la_setPoint_temp += la_step; //IMU_pitch_angle += 1.0;
PC.printf("+ recieved\n");
- PC.printf("LA angle changed to: %d\n", la_setPoint_temp);
+ PC.printf("LA angle changed to: %f\n", la_setPoint_temp);
}
- else if (Key == '0' or Key == ')')
- {
- PC.printf(") recieved\n");
- if (la_step == 1)
- {
- la_step = 5;
- }
- else if (la_step == 5)
- {
- la_step = 10;
- }
- else if (la_step == 10)
- {
- la_step = 15;
- }
- else if (la_step == 15)
- {
- la_step = 1;
- }
- PC.printf("LA Step Size Now %d\n", la_step);
- }
+
else if (Key=='[' or Key == '{')
{
la_P_gain -= 0.1;
@@ -270,48 +495,51 @@
else if (Key==';')
{
la_I_gain -= 0.1;
- PC.printf("[ key pressed\n");
- PC.printf("P gain is now %f\n", la_P_gain);
+ PC.printf("; key pressed\n");
+ PC.printf("I gain is now %f\n", la_I_gain);
}
else if (Key=='\'')
+ {
la_I_gain += 0.1;
+ PC.printf("\ key pressed\n");
+ PC.printf("I gain is now %f\n", la_I_gain);
+ }
else if (Key=='.')
- la_D_gain -= 0.1;
- else if (Key=='/')
- la_D_gain += 0.1;
-
- else if(Key=='!') //RESET THE MBED
{
- PC.printf("MBED RESET KEY (!) PRESSED\n");
- PC.printf("Linear Actuator Motor disabled! Please re-enable.\n");
- //disable the motor
- BLA_object.Keyboard_Q(); //DISABLE THE MOTOR
- wait(0.5); //500 milliseconds
- mbed_reset(); //reset the mbed!
- }
-
- else if(Key =='H') //homing sequence
+ la_D_gain -= 0.1;
+ PC.printf(". key pressed\n");
+ PC.printf("D gain is now %f\n", la_D_gain);
+ }
+ else if (Key=='/')
+ {
+ la_D_gain += 0.1;
+ PC.printf("/ key pressed\n");
+ PC.printf("D gain is now %f\n", la_D_gain);
+ }
+
+ else if(Key == 'n' or Key == 'N')
{
- PC.printf("### homing the device ###");
- BLA_object.Keyboard_H();
- wait(10); //for debugging
-
- PC.printf("### position is %d ###\n", BLA_object.get_pos().c_str()); //flip this back and forth
- wait(10); //for debugging
+ PC.printf("N key pressed. \n");
+ PC.printf("%s\n", BLA_object.Keyboard_DASH_KEY());
+ }
+ else if(Key == 'm' or Key == 'M')
+ {
+ PC.printf("M key pressed. \n");
+ PC.printf("%s\n", BLA_object.Keyboard_EQUAL_KEY());
}
- //check command against desired control buttons
- else if (Key == 'z' or Key =='Z') {
- //increment the duty cycle
- positionCmd += 10.0 ;
- PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB
- }
- else if (Key == 'x' or Key == 'X') {
- //decrement the duty cycle
- positionCmd -= 10.0 ;
- PC.printf("The position for the buoyancy motor is\nBEP: %3.0f\n", positionCmd); //to read in MATLAB
+ else if(Key == 'j' or Key == 'J')
+ {
+ PC.printf("J key pressed. \n");
+ PC.printf("%s\n", BLA_object.Keyboard_A());
}
+ else if(Key == 'k' or Key == 'K')
+ {
+ PC.printf("K key pressed. \n");
+ PC.printf("%s\n", BLA_object.Keyboard_D());
+ }
+
else
{
@@ -324,10 +552,28 @@
//BLA_object.PID_velocity_control(la_setPoint, IMU_pitch_angle, la_P_gain, la_I_gain, la_D_gain).c_str();
}
- //PC.printf("%s\n", BLA_object.PID_velocity_control(la_setPoint, IMU_pitch_angle, la_P_gain, la_I_gain, la_D_gain).c_str()); //get output string
- BLA_object.PID_velocity_control(la_setPoint, IMU_pitch_angle, la_P_gain, la_I_gain, la_D_gain).c_str();
- wait_us(100); //for PC readable (0.1 ms)
-
+ if (cases==0)
+ {
+ //PC.printf("Case is 0; IMU control\n");
+ //PC.printf("%s\n", BLA_object.PID_velocity_control(la_setPoint, IMU_pitch_angle, la_P_gain, la_I_gain, la_D_gain).c_str()); //get output string
+ BLA_object.PID_velocity_control(la_setPoint, IMU_pitch_angle, la_P_gain, la_I_gain, la_D_gain).c_str();
+ //wait_us(100); //for PC readable (0.1 ms)
+ }
+ else if (cases==1)
+ {
+
+ while (count_while==0)
+ {
+ PC.printf("%s\n", BLA_object.Keyboard_U().c_str()); //velocity = 0, motor disabled
+ PC.printf("%s\n", BLA_object.Keyboard_Q().c_str()); //turn off motor
+ wait(1);
+ PC.printf("%s\n", BLA_object.Keyboard_E().c_str()); //turn on motor
+ wait(1);
+ PC.printf("\n```````````Linear Actuator in Manual controlled mode````````````\n\n");
+ count_while++;
+ }
+ }
+
/*if(BLA_object.MC_readable()) //if you can read the motor controller do this...
{
//PC.printf("BATTERY LINEAR ACTUATOR");
@@ -339,7 +585,7 @@
// PC.putc(MC.getc()); //this is a pass-through of the MC (getc) to the PC (putc)
// wait_ms(1); //1000, 10, 20, 100 (needed at least 1 ms, verified through testing)
// }
- }
+ }*/
if ((abs(pvf().getVelocity())<0.1) && (posCon().getOutput()>0.0))
{
count ++;
@@ -347,7 +593,7 @@
if(count==10)
{
pc().printf("Bad pot issue\n");
- hBridge().stop();
+ //hBridge().stop();
}
}
@@ -362,7 +608,7 @@
{
//hBridge().stop();
pc().printf("********** String broke? *********\n");
- }*/
+ }
}
}
\ No newline at end of file
