
verslag
Dependencies: Encoder HIDScope MODSERIAL- mbed-dsp mbed
Fork of PROJECT_FINAL by
Revision 4:697d5a806cc4, committed 2014-11-03
- Comitter:
- Hooglugt
- Date:
- Mon Nov 03 10:49:21 2014 +0000
- Parent:
- 3:2b2710b8b02e
- Child:
- 5:e5ca53305b87
- Commit message:
- script zonder while(1)'s aan te passen, nog D-regelar toevoegen, richtingen controleren motoren en juiste setpoints aanpassen;
Changed in this revision
PROJECT_main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/PROJECT_main.cpp Fri Oct 31 19:38:07 2014 +0000 +++ b/PROJECT_main.cpp Mon Nov 03 10:49:21 2014 +0000 @@ -10,7 +10,6 @@ #define TSAMP_EMG 0.002 //sample frequency emg #define KALIBRATIONTIME 1000 // 10 sec voor bepalen van maximale biceps/triceps waarde #define FACTOR 0.6 //factor*max_waarde = threshold emg - //Define objects AnalogIn emg0(PTB1); //Analog input biceps AnalogIn emg1(PTB2); //Analog input triceps @@ -92,8 +91,8 @@ PwmOut pwm_motor2(PTA5); float integral = 0; -uint8_t batjeset = 0; //een if statement wordt "true" wanneer batje voor een bepaalde tijd de juiste hoek heeft behouden -uint8_t balhit = 0; //balhit wordt 1 wanneer arm een bepaalde hoek heeft afgelegd +float batjeset = 0; //een if statement wordt "true" wanneer batje voor een bepaalde tijd de juiste hoek heeft behouden +float balhit = 0; //balhit wordt 1 wanneer arm een bepaalde hoek heeft afgelegd float controlerror = 0; float pwm = 0; @@ -275,30 +274,35 @@ //calibration motor 2 pwm_motor2.write(0.6); //lage PWM - motor2dir = 1; + motor2dir = 0; wait(1); // anders wordt de while(1) meteen onderbroken - while(motor2.getSpeed()*omrekenfactor2>0) { - if(motor2.getSpeed()*omrekenfactor2 < 0.70) { //0.70 is nog aan te passen + while(1) { + if(motor2.getSpeed()*omrekenfactor2 > -0.70 && motor2.getSpeed()*omrekenfactor2 < 0.70) { // ik weet niet of het rechtsom of linksom zal gaan en misschien is de speed bij de gekozen pwm wel binnen dit bereik pwm_motor2.write(0); - motor2.setPosition(0); + motor2.setPosition(0); + goto motor1cal; } wait(0.01); } +motor1cal: //calibration motor 1 pwm_motor1.write(0.55); //lage PWM - motor1dir = 0; + motor1dir = 1; wait(1); // anders wordt de while(1) meteen onderbroken - while(motor1.getSpeed()*omrekenfactor1<0) { - if(motor1.getSpeed()*omrekenfactor1 > -0.20 ) { // 0.20 is nog aan te passen + while(1) { + if(motor1.getSpeed()*omrekenfactor1 > -0.20 && motor1.getSpeed()*omrekenfactor1 < 0.20) { // ik weet niet of het rechtsom of linksom zal gaan en misschien is de speed bij de gekozen pwm wel binnen dit bereik pwm_motor1.write(0); - motor1.setPosition(0); + motor1.setPosition(0); + goto emgcal; } wait(0.01); } +emgcal: blink.detach(); blink2.detach(); dir1 = dir2 = dir3 = 1; - for1 = for2 = for3 = 1; + for1 = for2 = for3 = 1; + pc.printf("kalmoarm "); wait (1); for1 = for2 = for3 = 0; @@ -312,6 +316,7 @@ } blink.detach(); dir1 = dir2 = dir3 = 1; + pc.printf("kalbi "); wait (1); //triceps kalibratie @@ -324,63 +329,14 @@ } blink.detach(); for1 = for2 = for3 = 1; + pc.printf("kaltri "); wait (1); for1 = for2 = for3 = 0; - - while(1) { //Loop van directiekeuze, naar slag en naar nulpositie +directionchoice: log_timer.attach(looper, TSAMP_EMG); - if(direction==0) { - ledtimer.attach(directionchoice, 1); - } - while(direction==0) { //Loop keuze DIRECTION - if(bi_result>FACTOR*bi_max) { - switch(ledburning){ - case 1: - direction = 1; - break; - case 2: - direction = 2; - break; - case 3: - direction = 3; - break; - } - } else { - wait(0.01); - } - } - - ledtimer.detach(); - - if(force==0) { - ledtimer.attach(forcechoice, 1); - } - while(force==0||balhit!=0) {//Loop keuze FORCE - if(bi_result>FACTOR*bi_max) { - switch(ledburning){ - case 1: - force = 1; - break; - case 2: - force = 2; - break; - case 3: - force = 3; - break; - } - } else { - if(tri_result>FACTOR*tri_max) { - balhit = 3; - } else - wait(0.01); - } - } - } - - ledtimer.detach(); - + while(1) { //Loop keuze DIRECTION for(int i=1; i<4; i++) { if(i==1) { //red dir1=1; @@ -389,6 +345,7 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(bi_result>FACTOR*bi_max) { direction = 1; + pc.printf("links "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om cyaan lampje aan te zetten ter controle selectie goto forcechoice; // goes to second while(1) for the deciding the force } else { @@ -403,6 +360,7 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(bi_result>FACTOR*bi_max) { direction = 2; + pc.printf("mid "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om paars lampje aan te zetten ter controle selectie goto forcechoice; } else { @@ -417,6 +375,7 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(bi_result>FACTOR*bi_max) { direction = 3; + pc.printf("rechts "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om oranje lampje aan te zetten ter controle selectie goto forcechoice; } else { @@ -426,9 +385,8 @@ } } } - - while(force==0) { //Loop keuze FORCE - //dit kan ook een while(force==0) {} zijn, maar dan moet er een ticker gemaakt worden die de lampjes aan en uit laat gaan +forcechoice: + while(1) { //Loop keuze FORCE for(int j=1; j<4; j++) { if(j==1) { //red for1=1; @@ -437,10 +395,12 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(tri_result>FACTOR*tri_max) { for1 = for2 = for3 = 0; + pc.printf("reset "); goto directionchoice; } else { if(bi_result>FACTOR*bi_max) { force = 1; + pc.printf("zwak "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om cyaan lampje aan te zetten ter controle selectie goto choicesmade; } else { @@ -456,10 +416,12 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(tri_result>FACTOR*tri_max) { for1 = for2 = for3 = 0; + pc.printf("reset "); goto directionchoice; } else { if(bi_result>FACTOR*bi_max) { force = 2; + pc.printf("normaal "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om paars lampje aan te zetten ter controle selectie goto choicesmade; } else { @@ -475,10 +437,12 @@ for (int lag=0; lag<TIMEBETWEENBLINK; lag++) { if(tri_result>FACTOR*tri_max) { for1 = for2 = for3 = 0; + pc.printf("reset "); goto directionchoice; } else { if(bi_result>FACTOR*bi_max) { force = 3; + pc.printf("sterk "); wait(TIMEB4NEXTCHOICE); // Tijdelijke wait om oranje lampje aan te zetten ter controle selectie goto choicesmade; } else { @@ -492,9 +456,10 @@ choicesmade: blink.attach(okay, 0.2); - while(balhit==0) { //balhit is gewoon een variabele die gebruikt wordt om uit de while te komen, naam kan verwarring veroorzaken - if(tri_result>FACTOR*tri_max) { + while(1) { + if(tri_result>FACTOR*tri_max) { blink.detach(); + pc.printf("reset "); switch (direction) { case 1: dir1 = 1; @@ -512,31 +477,30 @@ for2 = for3 = 0; break; } - balhit = 2; //zodat het de motorcontrol overslaat - force = 0; - wait(1); // 1 sec wait, anders reset je meteen ook de biceps keuze + + wait(1); // 1 sec wait, anders reset je meteen ook de biceps keuze + goto forcechoice; } else { if(bi_result>FACTOR*bi_max && (dir1==1||dir2==1||dir3==1)) { - balhit = 1; + blink.detach(); + log_timer.detach(); + goto motorcontrol; } else { wait(0.01); // not sure of de wait noodzakelijk is (nu toegevoegd zodat het niet teveel strain levert op bordje) } } } - - log_timer.detach(); - blink.detach(); - wait(1); - - if(balhit!=2){ + +motorcontrol: + /* Vanaf hier komt de aansturing van de motor */ switch (direction) { case 1: - setpoint2 = -2*0.197222205; + setpoint2 = 2*0.11; break; case 2: - setpoint2 = -1*0.197222205; + setpoint2 = 0.11; break; case 3: setpoint2 = 0; @@ -545,17 +509,17 @@ switch (force) { case 1: - setpoint1 = 6.8; + setpoint1 = 8; break; case 2: - setpoint1 = 7.4; + setpoint1 = 8; break; case 3: setpoint1 = 8; break; } - while(batjeset<200) { // loop voor het goed plaatsen van motor2 (batje hoek) + while(1) { // loop voor het goed plaatsen van motor2 (batje hoek) while(!looptimerflag); looptimerflag = false; //clear flag @@ -572,27 +536,37 @@ motor2dir = 0; } - //controleert of batje positie heeft bepaald - if (motor2.getPosition()*omrekenfactor2 > setpoint2*1.01 || motor2.getPosition()*omrekenfactor2 < setpoint2*0.99) { - // dit is nog te bepalen, op dit moment als binnen marge van 1% voor 2 seconde, dan naar volgende motorcontrol - batjeset = 0; + //controleert of batje positie heeft bepaald + if(batjeset < 200) { // dit is nog te bepalen, op dit moment als binnen marge van 1% voor 2 seconde, dan naar volgende motorcontrol + if (motor2.getPosition()*omrekenfactor2 > setpoint2*1.01 || motor2.getPosition()*omrekenfactor2 < setpoint2*0.99) { + batjeset = 0; + } else { + batjeset++; + } } else { - batjeset++; + pwm_motor2.write(0); + batjeset = integral = 0; + wait(1); + goto motor1control; } } - pwm_motor2.write(0); - batjeset = integral = 0; - wait(1); - - while(balhit==0) { // loop voor het slaan mbv motor1 (batje snelheid) + +motor1control: + while(1) { // loop voor het slaan mbv motor1 (batje snelheid) while(!looptimerflag); looptimerflag = false; //clear flag - //regelaar motor1, bepaalt snelheid - controlerror = setpoint1 - motor1.getSpeed()*omrekenfactor1; - integral = integral + controlerror*TSAMP; - pwm = Kp1*controlerror + Ki1*integral; - + if (balhit == 0) { //regelaar motor1, bepaalt snelheid + controlerror = setpoint1 - motor1.getSpeed()*omrekenfactor1; + integral = integral + controlerror*TSAMP; + pwm = Kp1*controlerror + Ki1*integral; + } else { //regelaar motor1, bepaalt positie + pwm_motor1.write(0); + balhit = integral = 0; + wait(1); // wait voordat arm weer naar beginpositie terugkeert + goto resetpositionmotor1; + } + keep_in_range(&pwm, -1,1); pwm_motor1.write(abs(pwm)); @@ -608,11 +582,9 @@ balhit = 1; } } -pwm_motor1.write(0); -balhit = integral = 0; -wait(1); // wait voordat arm weer naar beginpositie terugkeert - - while(batjeset < 200) { // slagarm wordt weer in oorspronkelijke positie geplaatst + +resetpositionmotor1: + while(1) { // slagarm wordt weer in oorspronkelijke positie geplaatst while(!looptimerflag); looptimerflag = false; //clear flag @@ -631,17 +603,22 @@ pwm_motor1.write(abs(pwm)); //controleert of arm terug in positie is - if (motor1.getPosition()*omrekenfactor1 > 0.03 || motor1.getPosition()*omrekenfactor1 < -0.03) { - batjeset = 0; + if(batjeset < 200) { + if (motor1.getPosition()*omrekenfactor1 > 0.03 || motor1.getPosition()*omrekenfactor1 < -0.03) { + batjeset = 0; + } else { + batjeset++; + } } else { - batjeset++; + pwm_motor1.write(0); + batjeset = integral = 0; + wait(1); + goto resetpositionmotor2; } } - pwm_motor1.write(0); - batjeset = integral = 0; - wait(1); - - while(batjeset < 200) { // loop voor het goed plaatsen van motor2 (batje hoek) + +resetpositionmotor2: + while(1) { // loop voor het goed plaatsen van motor2 (batje hoek) while(!looptimerflag); looptimerflag = false; //clear flag @@ -661,18 +638,18 @@ pwm_motor2.write(abs(pwm)); //controleert of batje positie heeft bepaald - if (motor2.getPosition()*omrekenfactor2 > 0.03 || motor2.getPosition()*omrekenfactor2 < -0.03) { - // dit is nog te bepalen, op dit moment als binnen marge van 1% voor 2 seconde, dan naar volgende motorcontrol - batjeset = 0; + if(batjeset < 200) { // dit is nog te bepalen, op dit moment als binnen marge van 1% voor 2 seconde, dan naar volgende motorcontrol + if (motor2.getPosition()*omrekenfactor2 > 0.03 || motor2.getPosition()*omrekenfactor2 < -0.03) { + batjeset = 0; + } else { + batjeset++; + } } else { - batjeset++; - } + pwm_motor2.write(0); + batjeset = integral = 0; + wait(1); + direction = force = 0; + goto directionchoice; + } } - pwm_motor2.write(0); - batjeset = integral = 0; - direction = force = 0; - wait(1); - } - - } } // end main \ No newline at end of file