
Minor BioRobotics BMT Hierbij publish ik mijn code public ter inspiratie voor komende jaarlagen. Het gaat om een serial robot met twee links en een haak als end-effector. Veel plezier ermee!
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
Diff: main.cpp
- Revision:
- 28:94da9cdc1f16
- Parent:
- 27:f5b33cbd3c22
- Child:
- 29:55547603475e
--- a/main.cpp Thu Oct 31 18:54:29 2019 +0000 +++ b/main.cpp Fri Nov 01 14:07:32 2019 +0000 @@ -44,26 +44,7 @@ HIDScope scope(2); // Amount of HIDScope servers - double theta_motor1; - double theta_motor2; - double pi=3.14159265358979323846; - double length_link1=18; - double length_link2=15; - double x = 0; // (of -2?) 8.5 < x < 30.5 - double x_max= 100; //30.5; - double x_min= -100; //8.5; - double x_home=8.5; - double x_vergroting=0.02; - - double y = 0; // 7.5 < y < 27 - double y_max=100; //27; - double y_min=-100; //7.5; - double y_home=7.5; - double y_vergroting=0.02; - double a; - double b; - double c; - double d; + bool emg0_active; bool emg1_active; @@ -136,7 +117,7 @@ int demo_tijd=0; // 3.5 Motor 1 variables *************************************************************** - //3.5a PID-controller motor 1 + double counts_per_rad_motor1 = (131.25*32)/(2*3.14159265359); // (gear ratio * counts per revolution) / (2* pi) = ~668.45 counts per rad static double error_integral_motor1 = 0; double Yref_motor1; @@ -158,7 +139,7 @@ double positie_prev_motor1; // 3.5 Motor 2 variables *************************************************************** - //3.5b PID-controller motor 2 + double counts_per_rad_motor2 = (131.25*32)/(2*3.14159265359); // (gear ratio * counts per revolution) / (2* pi) = ~668.45 counts per rad static double error_integral_motor2 = 0; double Yref_motor2; @@ -178,6 +159,29 @@ double positie_verschil_motor2; double positie_prev_motor2; + +// 3.6 RKI Variables *********************************************************** + + double theta_motor1; //Hoek motor 1 + double theta_motor2; //Hoek motor2 + double pi=3.14159265358979323846; + double length_link1=16.25; + double length_link2=15; + double x = 0; // X positie in het begin, workspace max: 8.5 < x < 30.5 + double x_max= 100; //Maximale workspace waarde X, zou 30.5 moeten zijn + double x_min= -100; //Minimale workspace waarde X, zou 8.5 moeten zijn; + double x_home=3.0; //Home positie, waar de x heen gaat bij homing + double x_vergroting=0.02; //De stap waarmee de x groter wordt bij elke keer als de emg actief is. EMG wordt elke 1 miliseconde gerund. Dus als je 1 seconde lang een emg signaal geeft, krijg je een vergroting van 100. + + double y = 0; // Y positie in het begin, workspace max:7.5 < y < 27 + double y_max=100; //Minimale workspace waarde y, zou 27 moeten zijn + double y_min=-100; // Minimale workspace waarde y, zou 7.5 moeten zijn; + double y_home=0; //Home positie, waar de y heen gaat bij homing + double y_vergroting=0.02; //De stap waarmee de y groter wordt bij elke keer als de emg actief is. EMG wordt elke 1 miliseconde gerund. Dus als je 1 seconde lang een emg signaal geeft, krijg je een vergroting van 100. + double a; //Constante voor de deel van de formules voor RKI + double b; //Constante voor de deel van de formules voor RKI + double c; //Constante voor de deel van de formules voor RKI + double d; //Constante voor de deel van de formules voor RKI //****************************************************************************** // 4. Functions **************************************************************** @@ -198,28 +202,29 @@ scope.send(); } - // 4.x Encoder motor1 **************************************************************** + // 4.2a Encoder motor1 **************************************************************** double fencoder_motor1() // bepaalt de positie van de motor { positie_motor1 = encoder_motor1.getPulses()/counts_per_rad_motor1; // haalt encoder waardes op - positie_verschil_motor1 = (positie_motor1-positie_prev_motor1)/Ts; + positie_verschil_motor1 = (positie_motor1-positie_prev_motor1)/Ts; //voor de motorcalibratie positie_prev_motor1 = positie_motor1; return positie_motor1; //geeft positie van motor } - // 4.x Encoder motor2 **************************************************************** + // 4.2b Encoder motor2 **************************************************************** double fencoder_motor2() // bepaalt de positie van de motor { positie_motor2 = encoder_motor2.getPulses()/counts_per_rad_motor2; // haalt encoder waardes op - positie_verschil_motor2 = (positie_motor2-positie_prev_motor2)/Ts; + positie_verschil_motor2 = (positie_motor2-positie_prev_motor2)/Ts; //voor de motorcalibratie positie_prev_motor2 = positie_motor2; return positie_motor2; //geeft positie van motor } - // 4.xa Calibration motors + // 4.3 Calibration motors **************************************************************** - void motor_calibration() + // 4.3a Calibration motors **************************************************************** + void motor_calibration() { // Calibration motor 1 motor1DirectionPin=0; //direction of the motor @@ -235,7 +240,7 @@ // pc.printf("\r\n Motor1 kalibratie = %s", motor1_calibrated ? "true" : "false"); - + // 4.3b Calibration motors ******************************************** // Calibration motor 2 motor2DirectionPin=0; //direction of the motor motor2=1.0; @@ -254,7 +259,7 @@ } - // 4.2a PID-Controller motor 1************************************************** + // 4.4a PID-Controller motor 1************************************************** double PID_controller_motor1(double &error_integral_motor1, double &error1_prev_motor1) { //Proportional part @@ -278,7 +283,7 @@ return P_motor1; } - // 4.2b PID-Controller motor 2************************************************** + // 4.4b PID-Controller motor 2************************************************** double PID_controller_motor2(double &error_integral_motor2, double &error1_prev_motor2) { //Proportional part @@ -301,7 +306,7 @@ return P_motor2; } - + // 4.5a Motor 1 direction******************************************** double motor1_pwm() { @@ -323,6 +328,8 @@ motor1 = fabs(P_motor1); } } + + // 4.5b Motor 1 direction ******************************************** double motor2_pwm() { @@ -344,6 +351,29 @@ motor2 = fabs(P_motor2); } } + + // 4.6a Motor 1 controller ******************************************** + void motor1_controller(void) + { + error1_motor1 = (theta_motor1 - positie_motor1); + + if (motor1_calibrated==true&&motor2_calibrated==true) + { + motor1_pwm(); + } + + } + + // 4.3a Motor 2 controller ******************************************** + void motor2_controller(void) + { + error1_motor2 = (theta_motor2 - positie_motor2); + if (motor1_calibrated==true&&motor2_calibrated==true) + { + motor2_pwm(); + } + } + void emg0_processing() { emg0_raw_signal=emg0.read(); @@ -460,25 +490,7 @@ Angle_motor2(); } - void motor1_controller(void) - { - error1_motor1 = (theta_motor1 - positie_motor1); - - if (motor1_calibrated==true&&motor2_calibrated==true) - { - motor1_pwm(); - } - - } - - void motor2_controller(void) - { - error1_motor2 = (theta_motor2 - positie_motor2); - if (motor1_calibrated==true&&motor2_calibrated==true) - { - motor2_pwm(); - } - } + // 4.3 State-Machine ******************************************************* @@ -496,8 +508,7 @@ if (motor1_calibrated==true&&motor2_calibrated==true) { pc.printf("\r\n Motor Calibration is done!"); - // x=28; aangeven wat de huidige positie is - // y=11; + encoder_motor1.reset(); encoder_motor2.reset(); @@ -554,7 +565,7 @@ else if (6000<emg_tijd) {led_green.write(1); - calibration_done=true; // later verplaatsen + if(button1==0) {State=StartWait;} if(button2==0) {State=Homing;} } @@ -581,6 +592,7 @@ case Operating: // pc.printf("\r\n State: Operating"); + calibration_done=true; led_blue.write(1); led_red.write(1); led_green.write(0); @@ -600,6 +612,7 @@ // emg2_threshhold=100; // emg3_threshhold=100; + calibration_done=false; if (button1==0) { led1=1; @@ -673,14 +686,17 @@ fencoder_motor1() ; fencoder_motor2() ; + // 5.2 Run state-machine(s) **************************************************** state_machine() ; + // 5.3 Run controller(s) ******************************************************* RKI(); PID_controller_motor1(error_integral_motor1, error1_prev_motor1); PID_controller_motor2(error_integral_motor2, error1_prev_motor2); + // 5.4 Send output signals to digital and PWM output pins ********************** motor1_controller(); motor2_controller();