g
Dependencies: MODSERIAL mbed Encoder
Diff: begintotaalscript.cpp
- Revision:
- 7:5380d17310e8
- Parent:
- 6:d4f355d72f66
--- a/begintotaalscript.cpp Wed Nov 06 16:37:36 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,500 +0,0 @@ -/* - - - - - - - - - - - - - - - - - - - - - - */ -/* */ -/* BRONCODE TEKENROBOT GROEP2: THE DRAWESOME */ -/* ----------------------------------------- */ -/* Belinda Brandwacht s1226290 */ -/* Esther Keulers s1255444 */ -/* Maaike Schotman s1274104 */ -/* Gerjan Wolterink s1197797 */ -/* Roelof van Zwol s1240811 */ -/* */ -/* - - - - - - - - - - - - - - - - - - - - - - */ - -//libraries aanroepen. -#include "mbed.h" -#include "MODSERIAL.h" -#include "encoder.h" - -// Looptimerflag instellen - -volatile bool looptimerflag; - -void setlooptimerflag(void) -{ - looptimerflag=true; -} - - -int main() -{ - //Communicatie met de pc - MODSERIAL pc(USBTX,USBRX,64,1024); - pc.baud(115200); //zet de baud in realterm ook op dit nummer. - - //Benoemen inputs van de drie rode knoppen op de robot - DigitalIn knop1(PTC2); - DigitalIn knop2(PTB3); - DigitalIn knop3(PTB2); - - //Input mode van de knoppen instellen. - knop1.mode(PullUp); - knop2.mode(PullUp); - knop3.mode(PullUp); - - AnalogIn emg1(PTB0); //Analog input emg1 - AnalogIn emg2(PTB1); //Analog input emg2 - - //Benoemen pinnen waarop de encoder van de motoren is aangeloten. - Encoder motor1(PTD0,PTC9); - Encoder motor2(PTD2,PTC8); - - /* PWM control to motor */ - PwmOut pwm_motor1(PTA12); - PwmOut pwm_motor2(PTA5); - - /* Direction pin */ - DigitalOut motor1dir(PTD3); - DigitalOut motor2dir(PTD1); - - - //Variabelen voor menu - int state = 1; - - // Met bool wordt gezegd dat variablen 'true' of 'false' kunnen zijn. - bool calibratie_rust = false; - bool calibratie_max = false; - bool calibratie_motor = false; - bool meting = false; - - //Variabelen EMG/motoren - double yy,z,zabs,w,y1,z1,zabs1,w1,y2,z2,zabs2,w2,e1,e2,e3,f1,f2,g1,g2,g3,h1,h2,byy,bz,bzabs,bw,by1,bz1,bzabs1,bw1,by2,bz2,bzabs2,bw2,be1,be2,be3,bf1,bf2,bg1,bg2,bg3,bh1,bh2; - double MaxsnelheidV,MaxsnelheidD,GrenswaardeD,GrenswaardeV,MaxwaardeD,MaxwaardeV,BereikD,BereikV,SnelheidV,SnelheidD,xbegin,ybegin,qbegin,x,y,q,deltas,deltaq,deltax,deltay; - - // Variabelen benoemen voor regelaar motor. - double theta, theta_pen, up_theta, kp_theta, kd_theta, dtheta, ei_theta, ui_theta, ki_theta, ed_theta, u_theta, ud_theta, theta_pwm,pi; - double r, r_pen, up_r, kp_r, kd_r, dr, ei_r, ui_r, ki_r, ed_r, u_r, ud_r, r_pwm, dri, dri_1, utot_r, inputsinus; - double motor1_maxu, motor2_maxu; - - - pi=3.14159265359; - - e1= 0.855930601814815; - e2= -1.711861203629630; - e3= 0.855930601814815; - f1=-1.690996376887443; - f2= 0.732726030371816; - - g1= 0.098259168204717*pow(10.0,-4.0); - g2= 0.196518336409435*pow(10.0,-4.0); - g3=0.098259168204717*pow(10.0,-4.0); - h1= -1.991114292201654; - h2=0.991153595868935; - - be1=0.914969144113083; - be2= -1.829938288226165; - be3= 0.914969144113083; - bf1=-1.822694925196308; - bf2=0.837181651256022; - - bg1= 0.246193004641015*pow(10.0,-5.0); - bg2= 0.492386009282031 *pow(10.0,-5.0); - bg3= 0.246193004641015*pow(10.0,-5.0); - bh1= -1.995557124345789; - bh2= 0.995566972065975; - - - y1 = 0; /*Initialize y(n-1) = 0*/ - y2 = 0; /*Initialize y(n-2) = 0*/ - z1 = 0; /*Initialize z(n-1) = 0*/ - z2 = 0; /*Initialize z(n-2) = 0*/ - zabs1 = 0; /*Initialize zabs(n-1) = 0*/ - zabs2 = 0; /*Initialize zabs(n-2) = 0*/ - w1 = 0; /*Initialize w(n-1) = 0*/ - w2 = 0; /*Initialize w(n-2) = 0*/ - - by1 = 0; /*Initialize by(n-1) = 0*/ - by2 = 0; /*Initialize by(n-2) = 0*/ - bz1 = 0; /*Initialize bz(n-1) = 0*/ - bz2 = 0; /*Initialize bz(n-2) = 0*/ - bzabs1 = 0; /*Initialize bzabs(n-1) = 0*/ - bzabs2 = 0; /*Initialize bzabs(n-2) = 0*/ - bw1 = 0; /*Initialize bw(n-1) = 0*/ - bw2 = 0; /*Initialize bw(n-2) = 0*/ - const float Ts = 0.001; /*Sample Time, const(ant)*/ - -//Constanten voor tekening: EMGdeel - xbegin= 0; //beginpositie - ybegin=0; //beginpositie - qbegin=5.50; //beginhoek (in rad) vanaf de y-as, rechtsom gedraaid is positief - MaxsnelheidV=150.0; //in mm/s - MaxsnelheidD=0.5*pi; //in rad/s eerst 0.26 rad/s (15 deg/sec) - -//constanten regelaar - kp_r = 0.006; - ki_r = 0.005; - - Ticker looptimer; - looptimer.attach(setlooptimerflag,Ts); - - while (true) { //oneindige while loop - - //Loop die allen gestart wordt als de looptimer is verlopen. - while(looptimerflag != true); - looptimerflag = false; - - -// state 1 RUST - if (state == 1) { - - pc.printf("state 1 RUST | knop1 = cal_motor knop2 = MENU EMG knop3 = Tekenen \n\r"); - - - if (knop1 == false ) { //als knop 1 is ingedrukt - state=2; - wait(0.05); //wacht goed contact knopje - - while(knop1 == false) {} //wacht tot knop is losgelaten - wait(0.05); // wacht goed contact knopje - - } - - if (knop2 == false ) { //als knop 2 wordt ingedrukt: state is 3 - state=3; - wait(0.05); - - while(knop2 == false) {} - wait(0.05); - } - if (knop3 == false && calibratie_rust == true && calibratie_max == true && calibratie_motor == true) { - state=6; //state 6 kan alleen uitgevoerd worden wanneer alle calibraties gedaan zijn. - wait(0.05); - - while(knop3 == false) {} - wait(0.05); - meting=true; - - } - if (knop3 == false && state !=6) { - wait(0.05); - pc.printf("Niet alle calibraties uitgevoerd! \n"); - wait(1); - } - - - } - - -//state2 CAL MOTOR - if (state == 2) { - pc.printf("state 2 cal_motor | knop1 = terug naar rust \n\r"); - - //Als de robot arm met pen met de hand op de begin posisie gezet is moet knop 1 weer worden ingedrukt. - if (knop1 == false ) { - state=1; - wait(0.05); - - while(knop1 == false) {} - wait(0.05); - - motor1.setPosition(200.0); //Zeg dat de motor die de arm verplaatst 200 counts heeft, dit komt overeen met (200/CPR)/gearatio = (200/CPR)/50=0.125 dat komt overeen met een hoek van .25 pi - motor2.setPosition(597.15); // - - x=0; - y=0; - - dri_1=0; - - calibratie_motor = true; - - - - - } - } -// state 3 MENU EMG - if (state == 3) { - pc.printf("state 3 MENU EMG | knop1= cal EMG rust knop2= rust knop3= cal EMG max \n\r"); - - - if (knop2 == false ) { // terug naar state 1 - state=1; - wait(0.05); - - while(knop2 == false) {} - wait(0.05); - } - - if (knop1 == false ) { // naar state 4 - state=4; - wait(0.05); - - while(knop1 == false) {} - wait(0.05); - - // begingrenswaarden stellen: - GrenswaardeV=0; - GrenswaardeD=0; - meting=true; - } - - if (knop3 == false ) { // naar state 5 - state=5; - wait(0.05); - - while(knop3 == false) {} - wait(0.05); - - // begingrenswaarden stellen: - MaxwaardeV=0; - MaxwaardeD=0; - meting=true; - - } - - - } - - - //METEN VAN EMG - if (meting == true) { - // pc.printf("TEST CODE: Meting in gang\n"); - yy = emg1.read(); //<measurement function, read from pin> - byy= emg2.read(); - - z=-f1*z1-f2*z2+e1*yy+e2*y1+e3*y2; /*hoogdoorlaatfilteroverdacht*/ - bz=-bf1*bz1-bf2*bz2+be1*byy+be2*by1+be3*by2; /*hoogdoorlaatfilteroverdacht van biceps*/ - - y2 = y1; /*y(n-1) will be y(n-2) on next loop*/ - y1= yy; /*y(n) will be y(n-1) on next loop*/ - z2 = z1; /*z(n-1) will be z(n-2) on next loop*/ - z1 = z; /*z(n) will be z(n-1) on next loop*/ - - by2 = by1; /*y(n-1) will be y(n-2) on next loop*/ - by1= byy; /*y(n) will be y(n-1) on next loop*/ - bz2 = bz1; /*z(n-1) will be z(n-2) on next loop*/ - bz1 = bz; /*z(n) will be z(n-1) on next loop*/ - - zabs=abs(z);/*rectify*/ - bzabs=abs(bz);/*rectify*/ - - w=-h1*w1-h2*w2+g1*zabs+g2*zabs1+g3*zabs2; /*laagdoorlaatfilteroverdracht*/ - bw=-bh1*bw1-bh2*bw2+bg1*bzabs+bg2*bzabs1+bg3*bzabs2; /*laagdoorlaatfilteroverdracht van biceps*/ - - zabs2 = zabs1; /*z(n-1) will be z(n-2) on next loop*/ - zabs1 = zabs; /*z(n) will be z(n-1) on next loop*/ - w2 = w1; /*w(n-1) will be w(n-2) on next loop*/ - w1 = w; /*w(n) will be w(n-1) on next loop*/ - - bzabs2 = bzabs1; /*z(n-1) will be z(n-2) on next loop*/ - bzabs1 = bzabs; /*z(n) will be z(n-1) on next loop*/ - bw2 = bw1; /*w(n-1) will be w(n-2) on next loop*/ - bw1 = bw; /*w(n) will be w(n-1) on next loop*/ - - //pc.printf("%f,%f\n",w,bw); - - wait(Ts); /*When finished wait (maybe a bit shorter?)*/ - - if (w>1.0) { - w=1.0; - } - if (bw>1.0) { - bw=1.0; - } - - } - - - -// state 4 EMG CAL IN RUST - if (state == 4) { - pc.printf("state 4 cal EMG RUST | knop1= MEMNU EMG \n\r"); - pc.printf("%f,%f\n",GrenswaardeV,GrenswaardeD); - // Nieuwe grenswaarden bepalen - if (w > GrenswaardeV) { - GrenswaardeV = w; - } - if (bw > GrenswaardeD) { - GrenswaardeD = bw; - } - if (knop1 == false ) { // terug naar state 1 - state=3; - wait(0.05); - - while(knop1 == false) {} - wait(0.05); - calibratie_rust = true; - meting=false; - - } - } -// state 5 EMG CAL MAX - if (state == 5) { - pc.printf("state 5 cal EMG MAX | knop3= EMG MENU \n\r"); - pc.printf("%f,%f\n",MaxwaardeV,MaxwaardeD); - // Nieuwe maxwaarden bepalen - if (w > MaxwaardeV) { - MaxwaardeV = w; - } - if (bw > MaxwaardeD) { - MaxwaardeD = bw; - } - - // einde maxwaarde bepalen: - if (knop3 == false ) { // terug naar state 3 - state=3; - wait(0.05); - - while(knop3 == false) {} - wait(0.05); - calibratie_max = true; - meting=false; - - } - - } - -// state 6 TEKENEN - - if (state == 6) { - // pc.printf("state 6 tekenen | knop3= rust \n\r"); - - // EMG - BereikD = MaxwaardeD-GrenswaardeD; //Bereik van grafiek EMG (Voltage t.o.v. tijd) - BereikV = MaxwaardeV-GrenswaardeV; //Bereik van grafiek EMG (Voltage t.o.v. tijd) - - SnelheidV = (MaxsnelheidV/BereikV)*(w-GrenswaardeV); // Snelheid van pen (in cm/sec), lineair verband met het Bereik - SnelheidD = (MaxsnelheidD/BereikD)*(bw-GrenswaardeD); //Draaisnelheid pen (in graden/sec), lineair verband met het Bereik - - if (SnelheidV<0) { - SnelheidV=0; - } - if (SnelheidD<0) { - SnelheidD=0; - } - if (SnelheidV>MaxsnelheidV) { - SnelheidV=MaxsnelheidV; - } - if (SnelheidD>MaxsnelheidV) { - SnelheidD=MaxsnelheidV; - } - - deltas = SnelheidV*Ts; //afstand tussen twee meetpunten - deltaq = SnelheidD*Ts; //verandering hoek tov. de rechtdoor - q = deltaq+qbegin; // hoekverandering tov. het assenstelsel - - deltay = deltas*cos(q); //veranding van pen in de y-richting - deltax = deltas*sin(q); // verandering van pen in de x-richting - - x = xbegin+deltax; // nieuwe postie pen, x-coördinaat - y = ybegin+deltay; // nieuwe positie pen, y-coöridnaat - - if (x>297) { //grenzen A4 - x=297; - } - if (y>210) { - y=210; - } - - if (x<0) { //grenzen A4 - x=0; - } - if (y<0) { - y=0; - } - - xbegin=x; // x zal xbegin worden in de volgende loop oftewel:(x(n) will be x(n-1) on next loop) - ybegin=y; // y zal ybgin worden in de volgende loop oftewel:(y(n) will be y(n-1) on next loop) - qbegin=q; // q zal qbegin worden in de volgende loop oftewel:(q(n) will be q(n-1) on next loop) - - pc.printf("bV=%f, bD=%f, sV=%f, sD=%f, x=%f, y=%f, hoek=%f\n",BereikV,BereikD,SnelheidV,SnelheidD,x,y,(q*57.3)); - - -// motoren - - if (y>210.0) { - y=210.0; - } - if(y<=0.0) { - y=0.0; - } - if(x>297.0) { - x=297.0; - } - if(x<=0.0) { - x=0.0; - } - - // Omzetten hoek en straal - //theta = atan(y/x)+0.25*pi; - //r = (sqrt(x*x+y*y)) ;// * (2577/461.335); - - theta = atan((x+69.80)/(y+69.80)); - r = sqrt( ((x + 69.8)*(x + 69.8))+ ((y + 69.8)*(y + 69.8)) ); - - - theta_pen = motor1.getPosition() * ((.5*pi)/400.0); - r_pen = motor2.getPosition() * (461.34/2790.13); - - - dtheta = (theta - theta_pen); - dr = (r - r_pen); - - //REGELAAR - up_r = kp_r * dr; //P-actie - dri = dri_1 + dr*Ts; - ui_r = dri_1 * ki_r; //I-actie - utot_r = up_r + ui_r; // - - dri_1 = dri; //nieuwe waardes oud maken. - - theta_pwm = (dtheta)*3.0; - r_pwm = (utot_r/1.0); - - //NAAR MOTOR - - //Zorgen dat pwm tussen -1 en 1 blijft. - if(theta_pwm > 1) { - theta_pwm=1; - } - if(theta_pwm < -1) { - theta_pwm=-1; - } - if(r_pwm > 1) { - r_pwm=1; - } - if(r_pwm < -1) { - r_pwm=-1; - } - - // Bepaal richting waarin motoren moeten draaien - if(theta_pwm > 0) - motor1dir.write(1); - else - motor1dir.write(0); - if(r_pwm > 0) - motor2dir.write(1); - else - motor2dir.write(0); - - // print naar pc - //pc.printf("t=%.3f dt=%.3f tpwm=%.3f | r=%.3f dr=%.3f rpwm=%.3f inputsin=%0.3f\n", theta, dtheta, theta_pwm, r, dr, r_pwm, inputsinus); - - //schrijf PWM naar motor - pwm_motor1.write(abs(theta_pwm)); - pwm_motor2.write(abs(r_pwm)); - - // terug naar state 1 knop - if (knop3 == false ) { // terug naar state 1 - state=1; - meting=false; - wait(0.05); - - while(knop3 == false) {} - wait(0.05); - } - - } - - } //sluiten oneindige while loop - -} //afsluiten main \ No newline at end of file