Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Committer:
JonaVonk
Date:
Thu Oct 31 16:56:37 2019 +0000
Revision:
9:57b261ee4127
Parent:
8:9b1bf2949a53
minder schokken

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobertoO 0:67c50348f842 1 #include "mbed.h"
RobertoO 0:67c50348f842 2 //#include "HIDScope.h"
JonaVonk 2:96e093a48314 3 #include "QEI.h"
RobertoO 1:b862262a9d14 4 #include "MODSERIAL.h"
RobertoO 0:67c50348f842 5 //#include "BiQuad.h"
RobertoO 1:b862262a9d14 6 //#include "FastPWM.h"
JonaVonk 2:96e093a48314 7 #include <vector>
RobertoO 0:67c50348f842 8
JonaVonk 2:96e093a48314 9 using std::vector;
JonaVonk 2:96e093a48314 10
JonaVonk 2:96e093a48314 11 double Pi = 3.14159265359;
JonaVonk 2:96e093a48314 12
JonaVonk 2:96e093a48314 13 QEI Enc1(D12, D13, NC, 32);
JonaVonk 2:96e093a48314 14 QEI Enc2(D10, D11, NC, 32);
JonaVonk 2:96e093a48314 15
JonaVonk 2:96e093a48314 16 DigitalOut M1(D4);
JonaVonk 2:96e093a48314 17 DigitalOut M2(D7);
JonaVonk 2:96e093a48314 18
JonaVonk 2:96e093a48314 19 PwmOut E1(D5);
JonaVonk 2:96e093a48314 20 PwmOut E2(D6);
JonaVonk 2:96e093a48314 21
JonaVonk 7:80baf171503c 22 double gearRatio = 40/9;
JonaVonk 7:80baf171503c 23
JonaVonk 2:96e093a48314 24 double initRot1 = 0;
JonaVonk 7:80baf171503c 25 double initRot2 = -gearRatio*(180 - 48.5)/360;
JonaVonk 2:96e093a48314 26
RobertoO 0:67c50348f842 27
RobertoO 1:b862262a9d14 28 MODSERIAL pc(USBTX, USBRX);
RobertoO 0:67c50348f842 29
JonaVonk 2:96e093a48314 30
JonaVonk 9:57b261ee4127 31 void moveMotorToPoint(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, double rotDes);
JonaVonk 2:96e093a48314 32 double calcRot1(double xDes, double yDes);
JonaVonk 2:96e093a48314 33 double calcRot2(double xDes, double yDes);
JonaVonk 2:96e093a48314 34 void plotPath(double xStart, double yStart, double xEnd, double yEnd, double *xPath[], double *yPath[]);
JonaVonk 7:80baf171503c 35 void moveAlongPath(double xStart, double yStart, double xEnd, double yEnd, double speed);
JonaVonk 7:80baf171503c 36 void moveMotorContinuously(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, vector<double> *pidInfo, Timer *t, double rotDes);
JonaVonk 9:57b261ee4127 37 void moveWithSpeed(double *xStart, double *yStart, double xSpeed, double ySpeed);
JonaVonk 2:96e093a48314 38
JonaVonk 2:96e093a48314 39 // main() runs in its own thread in the OS
RobertoO 0:67c50348f842 40 int main()
RobertoO 0:67c50348f842 41 {
RobertoO 0:67c50348f842 42 pc.baud(115200);
JonaVonk 9:57b261ee4127 43 pc.printf("Start\n\r");
JonaVonk 9:57b261ee4127 44
JonaVonk 9:57b261ee4127 45 double xStart = 0;
JonaVonk 9:57b261ee4127 46 double yStart = 20;
JonaVonk 9:57b261ee4127 47
JonaVonk 9:57b261ee4127 48 double rot1 = calcRot1(xStart, yStart);
JonaVonk 9:57b261ee4127 49 double rot2 = calcRot2(xStart, yStart);
JonaVonk 8:9b1bf2949a53 50
JonaVonk 8:9b1bf2949a53 51 moveMotorToPoint(&M1, &E1, &Enc1, initRot2, 1, -rot2);
JonaVonk 8:9b1bf2949a53 52 moveMotorToPoint(&M2, &E2, &Enc2, initRot1, -1, rot1);
JonaVonk 8:9b1bf2949a53 53
JonaVonk 9:57b261ee4127 54 while (true) {
JonaVonk 9:57b261ee4127 55 moveWithSpeed(&xStart, &yStart, 3, 3);
JonaVonk 7:80baf171503c 56 }
JonaVonk 2:96e093a48314 57 }
JonaVonk 2:96e093a48314 58
JonaVonk 2:96e093a48314 59
JonaVonk 2:96e093a48314 60 //function to mave a motor to a certain number of rotations, counted from the start of the program.
JonaVonk 2:96e093a48314 61 //parameters:
JonaVonk 2:96e093a48314 62 //DigitalOut *M = pointer to direction cpntol pin of motor
JonaVonk 2:96e093a48314 63 //PwmOut *E = pointer to speed contorl pin of motor
JonaVonk 2:96e093a48314 64 //QEI *Enc = pointer to encoder of motor
JonaVonk 5:5082d694e643 65 //double rotDes = desired rotation
JonaVonk 7:80baf171503c 66 void moveMotorToPoint(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, double rotDes)
JonaVonk 2:96e093a48314 67 {
JonaVonk 7:80baf171503c 68 double Kp = 30; //180 & 10 werkt zonder hulp
JonaVonk 7:80baf171503c 69 double Ki = 0;
JonaVonk 7:80baf171503c 70 double Kd = 2;
JonaVonk 7:80baf171503c 71
JonaVonk 5:5082d694e643 72 double pErrorC;
JonaVonk 5:5082d694e643 73 double pErrorP = 0;
JonaVonk 5:5082d694e643 74 double iError = 0;
JonaVonk 5:5082d694e643 75 double dError;
JonaVonk 2:96e093a48314 76
JonaVonk 5:5082d694e643 77 double U_p;
JonaVonk 5:5082d694e643 78 double U_i;
JonaVonk 5:5082d694e643 79 double U_d;
JonaVonk 2:96e093a48314 80
JonaVonk 5:5082d694e643 81 double rotC = Enc->getPulses()/(32*131.25) + initRot;
JonaVonk 5:5082d694e643 82 double MotorPWM;
JonaVonk 2:96e093a48314 83
JonaVonk 2:96e093a48314 84 Timer t;
JonaVonk 5:5082d694e643 85 double tieme = 0;
JonaVonk 2:96e093a48314 86
JonaVonk 2:96e093a48314 87 t.start();
JonaVonk 2:96e093a48314 88 do {
JonaVonk 2:96e093a48314 89 pErrorP = pErrorC;
JonaVonk 5:5082d694e643 90 rotC = Enc->getPulses()/(32*131.25) + initRot;
JonaVonk 2:96e093a48314 91 pErrorC = rotDes - rotC;
JonaVonk 5:5082d694e643 92 tieme = t.read();
JonaVonk 5:5082d694e643 93 t.reset();
JonaVonk 2:96e093a48314 94 iError = iError + pErrorC*tieme;
JonaVonk 2:96e093a48314 95 dError = (pErrorC - pErrorP)/tieme;
JonaVonk 7:80baf171503c 96
JonaVonk 5:5082d694e643 97 U_p = pErrorC*Kp;
JonaVonk 5:5082d694e643 98 U_i = iError*Ki;
JonaVonk 5:5082d694e643 99 U_d = dError*Kd;
JonaVonk 5:5082d694e643 100 MotorPWM = (U_p + U_i + U_d)*dir;
JonaVonk 2:96e093a48314 101
JonaVonk 2:96e093a48314 102 if(MotorPWM > 0) {
JonaVonk 2:96e093a48314 103 *M = 0;
JonaVonk 2:96e093a48314 104 *E = MotorPWM;
JonaVonk 2:96e093a48314 105 } else {
JonaVonk 2:96e093a48314 106 *M = 1;
JonaVonk 2:96e093a48314 107 *E = -MotorPWM;
JonaVonk 2:96e093a48314 108 }
JonaVonk 6:105b306350c6 109 wait(0.01);
JonaVonk 7:80baf171503c 110 printf("U_p: %f U_i: %f U_d: %f motorPWM: %f\n\r", pErrorC, iError, dError, MotorPWM);
JonaVonk 7:80baf171503c 111 } while (abs(MotorPWM) > 0.13|| abs(dError > 0.01));; //pErrorC > 0.02 || pErrorC < -0.02 ||dError > 0.01 || dError < -0.01);
JonaVonk 5:5082d694e643 112 *E = 0;
JonaVonk 6:105b306350c6 113 //pc.printf("U_p: %f U_i: %f U_d: %f motorPWM: %f\n\r", pErrorC, iError, dError, MotorPWM);
JonaVonk 2:96e093a48314 114 t.stop();
JonaVonk 4:55e6707949dd 115 }
JonaVonk 2:96e093a48314 116
JonaVonk 7:80baf171503c 117 void moveMotorContinuously(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, vector<double> *pidInfo, Timer *t, double rotDes)
JonaVonk 7:80baf171503c 118 {
JonaVonk 7:80baf171503c 119 double Kp = 61; //180 & 10 werkt zonder hulp
JonaVonk 7:80baf171503c 120 double Ki = 1;
JonaVonk 7:80baf171503c 121 double Kd = 7;
JonaVonk 7:80baf171503c 122
JonaVonk 7:80baf171503c 123 double rotC = Enc->getPulses()/(32*131.25) + initRot;
JonaVonk 7:80baf171503c 124
JonaVonk 7:80baf171503c 125 double pErrorC = rotDes - rotC;
JonaVonk 7:80baf171503c 126
JonaVonk 7:80baf171503c 127 double tieme = t->read();
JonaVonk 7:80baf171503c 128 double dt = tieme - pidInfo->at(2);
JonaVonk 7:80baf171503c 129
JonaVonk 7:80baf171503c 130 double iError = pidInfo->at(1) + pErrorC*dt;
JonaVonk 7:80baf171503c 131 double dError = (pErrorC - pidInfo->at(0))/dt;
JonaVonk 7:80baf171503c 132
JonaVonk 7:80baf171503c 133 double MotorPWM = (pErrorC*Kp + iError*Ki + dError*Kd)*dir;
JonaVonk 7:80baf171503c 134
JonaVonk 7:80baf171503c 135 if(MotorPWM > 0) {
JonaVonk 7:80baf171503c 136 *M = 0;
JonaVonk 7:80baf171503c 137 *E = MotorPWM;
JonaVonk 7:80baf171503c 138 } else {
JonaVonk 7:80baf171503c 139 *M = 1;
JonaVonk 7:80baf171503c 140 *E = -MotorPWM;
JonaVonk 7:80baf171503c 141 }
JonaVonk 7:80baf171503c 142 pidInfo->clear();
JonaVonk 7:80baf171503c 143 pidInfo->push_back(pErrorC);
JonaVonk 7:80baf171503c 144 pidInfo->push_back(iError);
JonaVonk 7:80baf171503c 145 pidInfo->push_back(tieme);
JonaVonk 9:57b261ee4127 146 pidInfo->push_back(Enc->getPulses()/(32*131.25) + initRot);
JonaVonk 7:80baf171503c 147 }
JonaVonk 7:80baf171503c 148
JonaVonk 2:96e093a48314 149
JonaVonk 2:96e093a48314 150 //double that calculates the rotation of one arm.
JonaVonk 2:96e093a48314 151 //parameters:
JonaVonk 2:96e093a48314 152 //double xDes = ofset of the arm's shaft in cm in the x direction
JonaVonk 2:96e093a48314 153 //double yDes = ofset of the arm's shaft in cm in the y direction
JonaVonk 2:96e093a48314 154 double calcRot1(double xDes, double yDes)
JonaVonk 2:96e093a48314 155 {
JonaVonk 7:80baf171503c 156 double alpha = atan(yDes/xDes);
JonaVonk 7:80baf171503c 157 if(alpha < 0) {
JonaVonk 7:80baf171503c 158 alpha = alpha+Pi;
JonaVonk 7:80baf171503c 159 }
JonaVonk 7:80baf171503c 160 //pc.printf("alpha: %f", alpha);
JonaVonk 7:80baf171503c 161 return gearRatio*((alpha - 0.5*(Pi - acos((pow(xDes, 2.0) + pow(yDes, 2.0) - 2*pow(20.0, 2.0))/(-2*pow(20.0, 2.0)))))/(2*Pi));
JonaVonk 7:80baf171503c 162 }
JonaVonk 2:96e093a48314 163
JonaVonk 2:96e093a48314 164 double calcRot2(double xDes, double yDes)
JonaVonk 2:96e093a48314 165 {
JonaVonk 7:80baf171503c 166 double alpha = atan(yDes/xDes);
JonaVonk 7:80baf171503c 167 if(alpha < 0) {
JonaVonk 7:80baf171503c 168 alpha = alpha+Pi;
JonaVonk 7:80baf171503c 169 }
JonaVonk 7:80baf171503c 170 return gearRatio*((alpha + 0.5*(Pi - acos((pow(xDes, 2.0) + pow(yDes, 2.0) - 2*pow(20.0, 2.0))/(-2*pow(20.0, 2.0)))))/(2*Pi));
JonaVonk 7:80baf171503c 171 }
JonaVonk 2:96e093a48314 172
JonaVonk 7:80baf171503c 173 void findDesiredLocation(double xStart, double yStart, double xEnd, double yEnd, double speed, Timer *t, vector<double> *desiredLocation)
JonaVonk 2:96e093a48314 174 {
JonaVonk 7:80baf171503c 175 double pathLength = sqrt(pow((xStart - xEnd), 2.0)+pow((yStart - yEnd), 2.0));
JonaVonk 7:80baf171503c 176 double traveledDistance = speed * t->read();
JonaVonk 7:80baf171503c 177 double ratio = traveledDistance/pathLength;
JonaVonk 7:80baf171503c 178
JonaVonk 7:80baf171503c 179 desiredLocation->clear();
JonaVonk 7:80baf171503c 180 desiredLocation->push_back(xStart + (xEnd - xStart)*ratio);
JonaVonk 7:80baf171503c 181 desiredLocation->push_back(yStart + (yEnd - yStart)*ratio);
JonaVonk 7:80baf171503c 182
RobertoO 0:67c50348f842 183 }
JonaVonk 2:96e093a48314 184
JonaVonk 7:80baf171503c 185 void moveAlongPath(double xStart, double yStart, double xEnd, double yEnd, double speed)
JonaVonk 2:96e093a48314 186 {
JonaVonk 7:80baf171503c 187 double rot1;
JonaVonk 7:80baf171503c 188 double rot2;
JonaVonk 7:80baf171503c 189
JonaVonk 7:80baf171503c 190 Timer t;
JonaVonk 7:80baf171503c 191
JonaVonk 7:80baf171503c 192 vector<double> desiredLocation;
JonaVonk 7:80baf171503c 193
JonaVonk 9:57b261ee4127 194 vector<double> pidInfo1 (4);
JonaVonk 9:57b261ee4127 195 vector<double> pidInfo2 (4);
JonaVonk 7:80baf171503c 196
JonaVonk 9:57b261ee4127 197 fill(pidInfo1.begin(), pidInfo1.begin()+4, 0);
JonaVonk 9:57b261ee4127 198 fill(pidInfo2.begin(), pidInfo2.begin()+4, 0);
JonaVonk 7:80baf171503c 199
JonaVonk 7:80baf171503c 200 double pathLength = sqrt(pow((xStart - xEnd), 2.0)+pow((yStart - yEnd), 2.0));
JonaVonk 2:96e093a48314 201
JonaVonk 7:80baf171503c 202 //Calculate the rotation of the motors at the start of the path
JonaVonk 7:80baf171503c 203 rot1 = calcRot1(xStart, yStart);
JonaVonk 7:80baf171503c 204 rot2 = calcRot2(xStart, yStart);
JonaVonk 7:80baf171503c 205 pc.printf("r1: %f r2: %f", rot1/6, rot2/6);
JonaVonk 7:80baf171503c 206
JonaVonk 7:80baf171503c 207 //Move arms to the start of the path
JonaVonk 7:80baf171503c 208 //moveMotorToPoint(&M1, &E1, &Enc1, initRot2, 1, -rot2);
JonaVonk 7:80baf171503c 209 //moveMotorToPoint(&M2, &E2, &Enc2, initRot1, -1, rot1);
JonaVonk 7:80baf171503c 210
JonaVonk 7:80baf171503c 211 //start the timer
JonaVonk 7:80baf171503c 212 t.start();
JonaVonk 7:80baf171503c 213 while(pathLength > speed * t.read()) {
JonaVonk 7:80baf171503c 214 findDesiredLocation(xStart, yStart, xEnd, yEnd, speed, &t, &desiredLocation);
JonaVonk 7:80baf171503c 215 rot1 = calcRot1(desiredLocation.at(0), desiredLocation.at(1));
JonaVonk 7:80baf171503c 216 //pc.printf("\n\r Rot1: %f", rot1);
JonaVonk 7:80baf171503c 217 moveMotorContinuously(&M1, &E1, &Enc1, initRot2, 1, &pidInfo2, &t, -rot2);
JonaVonk 7:80baf171503c 218 rot2 = calcRot2(desiredLocation.at(0), desiredLocation.at(1));
JonaVonk 7:80baf171503c 219 pc.printf("\n\r X: %f Y: %f Rot1: %f Rot2 %f", desiredLocation.at(0), desiredLocation.at(1), rot1, rot2);
JonaVonk 7:80baf171503c 220 moveMotorContinuously(&M2, &E2, &Enc2, initRot1, -1, &pidInfo1, &t, rot1);
JonaVonk 7:80baf171503c 221 wait(0.01);
JonaVonk 2:96e093a48314 222 }
JonaVonk 2:96e093a48314 223
JonaVonk 2:96e093a48314 224 }
JonaVonk 2:96e093a48314 225
JonaVonk 9:57b261ee4127 226 double calcX(double rot1, double rot2){
JonaVonk 9:57b261ee4127 227 return 20*cos((rot1/gearRatio)*2*Pi)+20*cos((-rot2/gearRatio)*2*Pi);
JonaVonk 9:57b261ee4127 228 }
JonaVonk 9:57b261ee4127 229
JonaVonk 9:57b261ee4127 230 double calcY(double rot1, double rot2){
JonaVonk 9:57b261ee4127 231 return 20*sin((rot1/gearRatio)*2*Pi)+20*sin((-rot2/gearRatio)*2*Pi);
JonaVonk 9:57b261ee4127 232 }
JonaVonk 9:57b261ee4127 233
JonaVonk 9:57b261ee4127 234 void moveWithSpeed(double *xStart, double *yStart, double xSpeed, double ySpeed){
JonaVonk 8:9b1bf2949a53 235 Timer t;
JonaVonk 8:9b1bf2949a53 236
JonaVonk 9:57b261ee4127 237 vector<double> pidInfo1 (4);
JonaVonk 9:57b261ee4127 238 vector<double> pidInfo2 (4);
JonaVonk 9:57b261ee4127 239
JonaVonk 9:57b261ee4127 240 fill(pidInfo1.begin(), pidInfo1.begin()+4, 0);
JonaVonk 9:57b261ee4127 241 fill(pidInfo2.begin(), pidInfo2.begin()+4, 0);
JonaVonk 8:9b1bf2949a53 242
JonaVonk 9:57b261ee4127 243 double xC = *xStart;
JonaVonk 9:57b261ee4127 244 double yC = *yStart;
JonaVonk 8:9b1bf2949a53 245
JonaVonk 8:9b1bf2949a53 246 double rot1;
JonaVonk 8:9b1bf2949a53 247 double rot2;
JonaVonk 9:57b261ee4127 248
JonaVonk 9:57b261ee4127 249 double tiemeP;
JonaVonk 9:57b261ee4127 250 double tiemeC;
JonaVonk 9:57b261ee4127 251 double dt;
JonaVonk 9:57b261ee4127 252
JonaVonk 8:9b1bf2949a53 253 t.start();
JonaVonk 9:57b261ee4127 254
JonaVonk 8:9b1bf2949a53 255 tiemeP = t.read();
JonaVonk 8:9b1bf2949a53 256 while(t.read() < 0.1){
JonaVonk 9:57b261ee4127 257 tiemeC = t.read();
JonaVonk 8:9b1bf2949a53 258 dt = tiemeC - tiemeP;
JonaVonk 9:57b261ee4127 259 xC = xC+xSpeed*dt;
JonaVonk 8:9b1bf2949a53 260 yC = yC+ySpeed*dt;
JonaVonk 8:9b1bf2949a53 261 rot1 = calcRot1(xC, yC);
JonaVonk 8:9b1bf2949a53 262 rot2 = calcRot2(xC, yC);
JonaVonk 8:9b1bf2949a53 263 moveMotorContinuously(&M1, &E1, &Enc1, initRot2, 1, &pidInfo2, &t, -rot2);
JonaVonk 8:9b1bf2949a53 264 moveMotorContinuously(&M2, &E2, &Enc2, initRot1, -1, &pidInfo1, &t, rot1);
JonaVonk 8:9b1bf2949a53 265 tiemeP = tiemeC;
JonaVonk 9:57b261ee4127 266 wait(0.01);
JonaVonk 8:9b1bf2949a53 267 }
JonaVonk 8:9b1bf2949a53 268
JonaVonk 9:57b261ee4127 269 *xStart = calcX(pidInfo1.at(3), pidInfo2.at(3));
JonaVonk 9:57b261ee4127 270 *yStart = calcY(pidInfo1.at(3), pidInfo2.at(3));
JonaVonk 8:9b1bf2949a53 271 }
JonaVonk 8:9b1bf2949a53 272