Jitse Giesen / Mbed 2 deprecated master

Dependencies:   biquadFilter mbed MODSERIAL

Committer:
Jitse_Giesen
Date:
Thu Oct 26 13:05:51 2017 +0000
Revision:
2:bf1c9d7afabd
Parent:
1:9e871647a074
Child:
3:edfc159b024e
EMG en motor samengevoegd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jitse_Giesen 0:51a6e38a4d4a 1 #include "mbed.h"
Jitse_Giesen 0:51a6e38a4d4a 2 #include "math.h"
Jitse_Giesen 0:51a6e38a4d4a 3 #include "encoder.h"
Jitse_Giesen 0:51a6e38a4d4a 4 #include "QEI.h"
Jitse_Giesen 0:51a6e38a4d4a 5 #include "BiQuad.h"
Jitse_Giesen 0:51a6e38a4d4a 6
Jitse_Giesen 0:51a6e38a4d4a 7 Serial pc(USBTX, USBRX);
Jitse_Giesen 0:51a6e38a4d4a 8
Jitse_Giesen 0:51a6e38a4d4a 9 //Defining all in- and outputs
Jitse_Giesen 0:51a6e38a4d4a 10 //EMG input
Jitse_Giesen 0:51a6e38a4d4a 11 AnalogIn emgBR( A0 ); //Right Biceps
Jitse_Giesen 0:51a6e38a4d4a 12 AnalogIn emgBL( A1 ); //Left Biceps
Jitse_Giesen 0:51a6e38a4d4a 13
Jitse_Giesen 0:51a6e38a4d4a 14 //Output motor 1 and reading Encoder motor 1
Jitse_Giesen 0:51a6e38a4d4a 15 DigitalOut motor1DirectionPin(D4);
Jitse_Giesen 0:51a6e38a4d4a 16 PwmOut motor1MagnitudePin(D5);
Jitse_Giesen 0:51a6e38a4d4a 17 QEI Encoder1(D12,D13,NC,32);
Jitse_Giesen 0:51a6e38a4d4a 18
Jitse_Giesen 0:51a6e38a4d4a 19
Jitse_Giesen 0:51a6e38a4d4a 20 //Output motor 2 and reading Encoder motor 2
Jitse_Giesen 0:51a6e38a4d4a 21 DigitalOut motor2DirectionPin(D7);
Jitse_Giesen 0:51a6e38a4d4a 22 PwmOut motor2MagnitudePin(D6);
Jitse_Giesen 0:51a6e38a4d4a 23 QEI Encoder2(D10,D11,NC,32);
Jitse_Giesen 0:51a6e38a4d4a 24
Jitse_Giesen 0:51a6e38a4d4a 25 //LED output, needed for feedback
Jitse_Giesen 0:51a6e38a4d4a 26 DigitalOut led_R(LED_RED);
Jitse_Giesen 0:51a6e38a4d4a 27 DigitalOut led_G(LED_GREEN);
Jitse_Giesen 0:51a6e38a4d4a 28 DigitalOut led_B(LED_BLUE);
Jitse_Giesen 0:51a6e38a4d4a 29
Jitse_Giesen 0:51a6e38a4d4a 30 //Setting Tickers for sampling EMG and determing if the threshold is met
Jitse_Giesen 2:bf1c9d7afabd 31 Ticker sample_timer;
Jitse_Giesen 2:bf1c9d7afabd 32 Ticker threshold_timerR;
Jitse_Giesen 2:bf1c9d7afabd 33 Ticker threshold_timerL;
Jitse_Giesen 2:bf1c9d7afabd 34
Jitse_Giesen 2:bf1c9d7afabd 35 Timer t_thresholdR;
Jitse_Giesen 2:bf1c9d7afabd 36 Timer t_thresholdL;
Jitse_Giesen 2:bf1c9d7afabd 37
Jitse_Giesen 2:bf1c9d7afabd 38 double currentTimeTR;
Jitse_Giesen 2:bf1c9d7afabd 39 double currentTimeTL;
Jitse_Giesen 0:51a6e38a4d4a 40
Jitse_Giesen 0:51a6e38a4d4a 41 InterruptIn button(SW2); // Wordt uiteindelijk vervangen door EMG
Jitse_Giesen 0:51a6e38a4d4a 42
Jitse_Giesen 0:51a6e38a4d4a 43 Timer t;
Jitse_Giesen 2:bf1c9d7afabd 44 double speedfactor; // = 0.01; snelheid in, zonder potmeter gebruik <- waarom is dit zo?
Jitse_Giesen 2:bf1c9d7afabd 45
Jitse_Giesen 0:51a6e38a4d4a 46 // Getting the counts from the Encoder
Jitse_Giesen 0:51a6e38a4d4a 47 int counts1 = Encoder1.getPulses();
Jitse_Giesen 0:51a6e38a4d4a 48 int counts2 = Encoder2.getPulses();
Jitse_Giesen 0:51a6e38a4d4a 49
Jitse_Giesen 0:51a6e38a4d4a 50 // Defining variables delta (the difference between position and desired position) <- Is dit zo?
Jitse_Giesen 0:51a6e38a4d4a 51 int delta1;
Jitse_Giesen 0:51a6e38a4d4a 52 int delta2;
Jitse_Giesen 0:51a6e38a4d4a 53
Jitse_Giesen 2:bf1c9d7afabd 54 bool Move_done = false;
Jitse_Giesen 2:bf1c9d7afabd 55
Jitse_Giesen 0:51a6e38a4d4a 56 /* Defining all the different BiQuad filters, which contain a Notch filter,
Jitse_Giesen 0:51a6e38a4d4a 57 High-pass filter and Low-pass filter. The Notch filter cancels all frequencies
Jitse_Giesen 0:51a6e38a4d4a 58 between 49 and 51 Hz, the High-pass filter cancels all frequencies below 20 Hz
Jitse_Giesen 2:bf1c9d7afabd 59 and the Low-pass filter cancels out all frequencies below 4 Hz. The filters are
Jitse_Giesen 2:bf1c9d7afabd 60 declared four times, so that they can be used for sampling of right and left
Jitse_Giesen 2:bf1c9d7afabd 61 biceps, during measurements and calibration. */
Jitse_Giesen 0:51a6e38a4d4a 62
Jitse_Giesen 0:51a6e38a4d4a 63 /* Defining all the normalized values of b and a in the Notch filter for the
Jitse_Giesen 0:51a6e38a4d4a 64 creation of the Notch BiQuad */
Jitse_Giesen 0:51a6e38a4d4a 65
Jitse_Giesen 2:bf1c9d7afabd 66 BiQuad bqNotch1( 0.9876, -1.5981, 0.9876, -1.5981, 0.9752 );
Jitse_Giesen 2:bf1c9d7afabd 67 BiQuad bqNotch2( 0.9876, -1.5981, 0.9876, -1.5981, 0.9752 );
Jitse_Giesen 2:bf1c9d7afabd 68
Jitse_Giesen 2:bf1c9d7afabd 69 BiQuad bqNotchTR( 0.9876, -1.5981, 0.9876, -1.5981, 0.9752 );
Jitse_Giesen 2:bf1c9d7afabd 70 BiQuad bqNotchTL( 0.9876, -1.5981, 0.9876, -1.5981, 0.9752 );
Jitse_Giesen 2:bf1c9d7afabd 71
Jitse_Giesen 2:bf1c9d7afabd 72 /* Defining all the normalized values of b and a in the High-pass filter for the
Jitse_Giesen 2:bf1c9d7afabd 73 creation of the High-pass BiQuad */
Jitse_Giesen 2:bf1c9d7afabd 74
Jitse_Giesen 2:bf1c9d7afabd 75 BiQuad bqHigh1( 0.8371, -1.6742, 0.8371, -1.6475, 0.7009 );
Jitse_Giesen 2:bf1c9d7afabd 76 BiQuad bqHigh2( 0.8371, -1.6742, 0.8371, -1.6475, 0.7009 );
Jitse_Giesen 2:bf1c9d7afabd 77
Jitse_Giesen 2:bf1c9d7afabd 78 BiQuad bqHighTR( 0.8371, -1.6742, 0.8371, -1.6475, 0.7009 );
Jitse_Giesen 2:bf1c9d7afabd 79 BiQuad bqHighTL( 0.8371, -1.6742, 0.8371, -1.6475, 0.7009 );
Jitse_Giesen 2:bf1c9d7afabd 80
Jitse_Giesen 2:bf1c9d7afabd 81 /* Defining all the normalized values of b and a in the Low-pass filter for the
Jitse_Giesen 2:bf1c9d7afabd 82 creation of the Low-pass BiQuad */
Jitse_Giesen 2:bf1c9d7afabd 83
Jitse_Giesen 2:bf1c9d7afabd 84 BiQuad bqLow1( 6.0985e-4, 0.0012, 6.0985e-4, -1.9289, 0.9314 );
Jitse_Giesen 2:bf1c9d7afabd 85 BiQuad bqLow2( 6.0985e-4, 0.0012, 6.0985e-4, -1.9289, 0.9314 );
Jitse_Giesen 2:bf1c9d7afabd 86
Jitse_Giesen 2:bf1c9d7afabd 87 BiQuad bqLowTR( 6.0985e-4, 0.0012, 6.0985e-4, -1.9289, 0.9314 );
Jitse_Giesen 2:bf1c9d7afabd 88 BiQuad bqLowTL( 6.0985e-4, 0.0012, 6.0985e-4, -1.9289, 0.9314 );
Jitse_Giesen 2:bf1c9d7afabd 89
Jitse_Giesen 2:bf1c9d7afabd 90 // Creating a variable needed for the creation of the BiQuadChain
Jitse_Giesen 2:bf1c9d7afabd 91 BiQuadChain bqChain1;
Jitse_Giesen 2:bf1c9d7afabd 92 BiQuadChain bqChain2;
Jitse_Giesen 2:bf1c9d7afabd 93
Jitse_Giesen 2:bf1c9d7afabd 94 BiQuadChain bqChainTR;
Jitse_Giesen 2:bf1c9d7afabd 95 BiQuadChain bqChainTL;
Jitse_Giesen 2:bf1c9d7afabd 96
Jitse_Giesen 2:bf1c9d7afabd 97 //Defining all doubles needed in the filtering process
Jitse_Giesen 2:bf1c9d7afabd 98 double emgBRfiltered; //Right biceps Notch+High pass filter
Jitse_Giesen 2:bf1c9d7afabd 99 double emgBRrectified; //Right biceps rectified
Jitse_Giesen 2:bf1c9d7afabd 100 double emgBRcomplete; //Right biceps low-pass filter, filtering complete
Jitse_Giesen 2:bf1c9d7afabd 101
Jitse_Giesen 2:bf1c9d7afabd 102 double emgBLfiltered; //Left biceps Notch+High pass filter
Jitse_Giesen 2:bf1c9d7afabd 103 double emgBLrectified; //Left biceps rectified
Jitse_Giesen 2:bf1c9d7afabd 104 double emgBLcomplete; //Left biceps low-pass filter, filtering complete
Jitse_Giesen 2:bf1c9d7afabd 105
Jitse_Giesen 2:bf1c9d7afabd 106 int countBR = 0;
Jitse_Giesen 2:bf1c9d7afabd 107 int countBL = 0;
Jitse_Giesen 2:bf1c9d7afabd 108
Jitse_Giesen 2:bf1c9d7afabd 109 //double threshold = 0.03;
Jitse_Giesen 2:bf1c9d7afabd 110
Jitse_Giesen 2:bf1c9d7afabd 111 double numsamples = 500;
Jitse_Giesen 2:bf1c9d7afabd 112 double emgBRsum = 0;
Jitse_Giesen 2:bf1c9d7afabd 113 double emgBRmeanMVC;
Jitse_Giesen 2:bf1c9d7afabd 114 double thresholdBR;
Jitse_Giesen 2:bf1c9d7afabd 115
Jitse_Giesen 2:bf1c9d7afabd 116 double emgBLsum = 0;
Jitse_Giesen 2:bf1c9d7afabd 117 double emgBLmeanMVC;
Jitse_Giesen 2:bf1c9d7afabd 118 double thresholdBL;
Jitse_Giesen 2:bf1c9d7afabd 119
Jitse_Giesen 2:bf1c9d7afabd 120 /* Function to sample the EMG and get a Threshold value from it,
Jitse_Giesen 2:bf1c9d7afabd 121 which can be used throughout the process */
Jitse_Giesen 2:bf1c9d7afabd 122
Jitse_Giesen 2:bf1c9d7afabd 123 void Threshold_samplingBR() {
Jitse_Giesen 2:bf1c9d7afabd 124 t_thresholdR.start();
Jitse_Giesen 2:bf1c9d7afabd 125 currentTimeTR = t_thresholdR.read();
Jitse_Giesen 2:bf1c9d7afabd 126
Jitse_Giesen 2:bf1c9d7afabd 127 if (currentTimeTR <= 1) {
Jitse_Giesen 2:bf1c9d7afabd 128
Jitse_Giesen 2:bf1c9d7afabd 129 emgBRfiltered = bqChainTR.step( emgBR.read() ); //Notch+High-pass
Jitse_Giesen 2:bf1c9d7afabd 130 emgBRrectified = fabs(emgBRfiltered); //Rectification
Jitse_Giesen 2:bf1c9d7afabd 131 emgBRcomplete = bqLowTR.step(emgBRrectified); //Low-pass
Jitse_Giesen 2:bf1c9d7afabd 132
Jitse_Giesen 2:bf1c9d7afabd 133 emgBRsum = emgBRsum + emgBRcomplete;
Jitse_Giesen 2:bf1c9d7afabd 134 }
Jitse_Giesen 2:bf1c9d7afabd 135 emgBRmeanMVC = emgBRsum/numsamples;
Jitse_Giesen 2:bf1c9d7afabd 136 thresholdBR = emgBRmeanMVC * 0.20;
Jitse_Giesen 2:bf1c9d7afabd 137
Jitse_Giesen 2:bf1c9d7afabd 138
Jitse_Giesen 2:bf1c9d7afabd 139
Jitse_Giesen 2:bf1c9d7afabd 140 //pc.printf("ThresholdBR = %f \n", thresholdBR);
Jitse_Giesen 2:bf1c9d7afabd 141 }
Jitse_Giesen 2:bf1c9d7afabd 142 void Threshold_samplingBL() {
Jitse_Giesen 2:bf1c9d7afabd 143 t_thresholdL.start();
Jitse_Giesen 2:bf1c9d7afabd 144 currentTimeTL = t_thresholdL.read();
Jitse_Giesen 2:bf1c9d7afabd 145
Jitse_Giesen 2:bf1c9d7afabd 146 if (currentTimeTL <= 1) {
Jitse_Giesen 2:bf1c9d7afabd 147
Jitse_Giesen 2:bf1c9d7afabd 148 emgBLfiltered = bqChain2.step( emgBL.read() ); //Notch+High-pass
Jitse_Giesen 2:bf1c9d7afabd 149 emgBLrectified = fabs( emgBLfiltered ); //Rectification
Jitse_Giesen 2:bf1c9d7afabd 150 emgBLcomplete = bqLow2.step( emgBLrectified ); //Low-pass
Jitse_Giesen 2:bf1c9d7afabd 151
Jitse_Giesen 2:bf1c9d7afabd 152 emgBLsum = emgBLsum + emgBLcomplete;
Jitse_Giesen 2:bf1c9d7afabd 153 }
Jitse_Giesen 2:bf1c9d7afabd 154
Jitse_Giesen 2:bf1c9d7afabd 155 emgBLmeanMVC = emgBLsum/numsamples;
Jitse_Giesen 2:bf1c9d7afabd 156 thresholdBL = emgBLmeanMVC * 0.20;
Jitse_Giesen 2:bf1c9d7afabd 157
Jitse_Giesen 2:bf1c9d7afabd 158 }
Jitse_Giesen 2:bf1c9d7afabd 159
Jitse_Giesen 2:bf1c9d7afabd 160 // EMG functions
Jitse_Giesen 2:bf1c9d7afabd 161 void EMG_sample()
Jitse_Giesen 2:bf1c9d7afabd 162 {
Jitse_Giesen 2:bf1c9d7afabd 163 //Filtering steps for the Right Biceps EMG
Jitse_Giesen 2:bf1c9d7afabd 164 emgBRfiltered = bqChain1.step( emgBR.read() ); //Notch+High-pass
Jitse_Giesen 2:bf1c9d7afabd 165 emgBRrectified = fabs(emgBRfiltered); //Rectification
Jitse_Giesen 2:bf1c9d7afabd 166 emgBRcomplete = bqLow1.step(emgBRrectified); //Low-pass
Jitse_Giesen 2:bf1c9d7afabd 167
Jitse_Giesen 2:bf1c9d7afabd 168 //Filtering steps for the Left Biceps EMG
Jitse_Giesen 2:bf1c9d7afabd 169 emgBLfiltered = bqChain2.step( emgBL.read() ); //Notch+High-pass
Jitse_Giesen 2:bf1c9d7afabd 170 emgBLrectified = fabs( emgBLfiltered ); //Rectification
Jitse_Giesen 2:bf1c9d7afabd 171 emgBLcomplete = bqLow2.step( emgBLrectified ); //Low-pass
Jitse_Giesen 2:bf1c9d7afabd 172
Jitse_Giesen 2:bf1c9d7afabd 173 }
Jitse_Giesen 2:bf1c9d7afabd 174 // Function to make the BiQuadChain for the Notch and High pass filter for all three filters
Jitse_Giesen 2:bf1c9d7afabd 175 void getbqChain()
Jitse_Giesen 2:bf1c9d7afabd 176 {
Jitse_Giesen 2:bf1c9d7afabd 177 bqChain1.add(&bqNotch1).add(&bqHigh1); //Making the BiQuadChain
Jitse_Giesen 2:bf1c9d7afabd 178 bqChain2.add(&bqNotch2).add(&bqHigh2);
Jitse_Giesen 2:bf1c9d7afabd 179
Jitse_Giesen 2:bf1c9d7afabd 180 bqChainTR.add(&bqNotchTR).add(&bqHighTR);
Jitse_Giesen 2:bf1c9d7afabd 181 bqChainTL.add(&bqNotchTR).add(&bqHighTL);
Jitse_Giesen 2:bf1c9d7afabd 182 }
Jitse_Giesen 2:bf1c9d7afabd 183
Jitse_Giesen 0:51a6e38a4d4a 184 // Initial input value for X
Jitse_Giesen 0:51a6e38a4d4a 185 int Xin=0;
Jitse_Giesen 0:51a6e38a4d4a 186 int Xin_new;
Jitse_Giesen 0:51a6e38a4d4a 187 double huidigetijdX;
Jitse_Giesen 0:51a6e38a4d4a 188
Jitse_Giesen 0:51a6e38a4d4a 189 // Feedback system for counting values of X
Jitse_Giesen 0:51a6e38a4d4a 190 void ledtX(){
Jitse_Giesen 0:51a6e38a4d4a 191 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 192 Xin++;
Jitse_Giesen 0:51a6e38a4d4a 193 pc.printf("Xin is %i\n",Xin);
Jitse_Giesen 0:51a6e38a4d4a 194 led_G=0;
Jitse_Giesen 0:51a6e38a4d4a 195 led_R=1;
Jitse_Giesen 0:51a6e38a4d4a 196 wait(0.2);
Jitse_Giesen 0:51a6e38a4d4a 197 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 198 led_R=0;
Jitse_Giesen 0:51a6e38a4d4a 199 wait(0.5);
Jitse_Giesen 0:51a6e38a4d4a 200 }
Jitse_Giesen 0:51a6e38a4d4a 201
Jitse_Giesen 0:51a6e38a4d4a 202 // Couting system for values of X
Jitse_Giesen 0:51a6e38a4d4a 203 int tellerX(){
Jitse_Giesen 0:51a6e38a4d4a 204 if (Move_done == true) {
Jitse_Giesen 0:51a6e38a4d4a 205 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 206 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 207 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 208 led_R=0;
Jitse_Giesen 0:51a6e38a4d4a 209 while(true){
Jitse_Giesen 0:51a6e38a4d4a 210 button.fall(ledtX);
Jitse_Giesen 0:51a6e38a4d4a 211 t.start();
Jitse_Giesen 0:51a6e38a4d4a 212 huidigetijdX=t.read();
Jitse_Giesen 0:51a6e38a4d4a 213 if (huidigetijdX>2){
Jitse_Giesen 0:51a6e38a4d4a 214 led_R=1; //Go to the next program (counting values for Y)
Jitse_Giesen 0:51a6e38a4d4a 215 Xin_new = Xin;
Jitse_Giesen 0:51a6e38a4d4a 216 Xin = 0;
Jitse_Giesen 0:51a6e38a4d4a 217
Jitse_Giesen 0:51a6e38a4d4a 218 return Xin_new;
Jitse_Giesen 0:51a6e38a4d4a 219 }
Jitse_Giesen 0:51a6e38a4d4a 220
Jitse_Giesen 0:51a6e38a4d4a 221 }
Jitse_Giesen 0:51a6e38a4d4a 222
Jitse_Giesen 0:51a6e38a4d4a 223 }
Jitse_Giesen 0:51a6e38a4d4a 224 return 0;
Jitse_Giesen 0:51a6e38a4d4a 225 }
Jitse_Giesen 0:51a6e38a4d4a 226
Jitse_Giesen 0:51a6e38a4d4a 227 // Initial values needed for Y (see comments at X function)
Jitse_Giesen 0:51a6e38a4d4a 228 int Yin=0;
Jitse_Giesen 0:51a6e38a4d4a 229 int Yin_new;
Jitse_Giesen 0:51a6e38a4d4a 230 double huidigetijdY;
Jitse_Giesen 0:51a6e38a4d4a 231
Jitse_Giesen 0:51a6e38a4d4a 232 //Feedback system for couting values of Y
Jitse_Giesen 0:51a6e38a4d4a 233 void ledtY(){
Jitse_Giesen 0:51a6e38a4d4a 234 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 235 Yin++;
Jitse_Giesen 0:51a6e38a4d4a 236 pc.printf("Yin is %i\n",Yin);
Jitse_Giesen 0:51a6e38a4d4a 237 led_G=0;
Jitse_Giesen 0:51a6e38a4d4a 238 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 239 wait(0.2);
Jitse_Giesen 0:51a6e38a4d4a 240 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 241 led_B=0;
Jitse_Giesen 0:51a6e38a4d4a 242 wait(0.5);
Jitse_Giesen 0:51a6e38a4d4a 243 }
Jitse_Giesen 0:51a6e38a4d4a 244
Jitse_Giesen 0:51a6e38a4d4a 245 // Couting system for values of Y
Jitse_Giesen 0:51a6e38a4d4a 246 int tellerY(){
Jitse_Giesen 0:51a6e38a4d4a 247 if (Move_done == true) {
Jitse_Giesen 0:51a6e38a4d4a 248 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 249 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 250 led_B=0;
Jitse_Giesen 0:51a6e38a4d4a 251 led_R=1;
Jitse_Giesen 0:51a6e38a4d4a 252 while(true){
Jitse_Giesen 0:51a6e38a4d4a 253 button.fall(ledtY);
Jitse_Giesen 0:51a6e38a4d4a 254 t.start();
Jitse_Giesen 0:51a6e38a4d4a 255 huidigetijdY=t.read();
Jitse_Giesen 0:51a6e38a4d4a 256 if (huidigetijdY>2){
Jitse_Giesen 0:51a6e38a4d4a 257 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 258 Yin_new = Yin;
Jitse_Giesen 0:51a6e38a4d4a 259 Yin = 0;
Jitse_Giesen 0:51a6e38a4d4a 260
Jitse_Giesen 0:51a6e38a4d4a 261 Move_done = false;
Jitse_Giesen 0:51a6e38a4d4a 262 return Yin_new;
Jitse_Giesen 0:51a6e38a4d4a 263
Jitse_Giesen 0:51a6e38a4d4a 264 }
Jitse_Giesen 0:51a6e38a4d4a 265 }
Jitse_Giesen 0:51a6e38a4d4a 266 }
Jitse_Giesen 0:51a6e38a4d4a 267 return 0; // ga door naar het volgende programma
Jitse_Giesen 0:51a6e38a4d4a 268 }
Jitse_Giesen 0:51a6e38a4d4a 269
Jitse_Giesen 0:51a6e38a4d4a 270
Jitse_Giesen 0:51a6e38a4d4a 271
Jitse_Giesen 0:51a6e38a4d4a 272
Jitse_Giesen 0:51a6e38a4d4a 273 /*---------------------------------------------------------------------------------
Jitse_Giesen 0:51a6e38a4d4a 274 // Initial input value for X
Jitse_Giesen 0:51a6e38a4d4a 275 int Xin=0; //<- Hoe zit het met deze als we de robot daadwerkelijk gebruiken
Jitse_Giesen 0:51a6e38a4d4a 276 double huidigetijdX;
Jitse_Giesen 0:51a6e38a4d4a 277
Jitse_Giesen 0:51a6e38a4d4a 278 // Feedback system for counting values of X
Jitse_Giesen 0:51a6e38a4d4a 279 void ledtX(){
Jitse_Giesen 0:51a6e38a4d4a 280 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 281 Xin++;
Jitse_Giesen 0:51a6e38a4d4a 282 pc.printf("Xin is %i\n",Xin);
Jitse_Giesen 0:51a6e38a4d4a 283 led_G=0;
Jitse_Giesen 0:51a6e38a4d4a 284 led_R=1;
Jitse_Giesen 0:51a6e38a4d4a 285 wait(0.2);
Jitse_Giesen 0:51a6e38a4d4a 286 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 287 led_R=0;
Jitse_Giesen 0:51a6e38a4d4a 288 wait(0.5);
Jitse_Giesen 0:51a6e38a4d4a 289 }
Jitse_Giesen 0:51a6e38a4d4a 290
Jitse_Giesen 0:51a6e38a4d4a 291
Jitse_Giesen 0:51a6e38a4d4a 292 // Couting system for values of X
Jitse_Giesen 0:51a6e38a4d4a 293 int tellerX(){
Jitse_Giesen 0:51a6e38a4d4a 294 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 295 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 296 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 297 led_R=0;
Jitse_Giesen 0:51a6e38a4d4a 298 while(true){
Jitse_Giesen 0:51a6e38a4d4a 299 button.fall(ledtX); //This has to be replaced by EMG
Jitse_Giesen 0:51a6e38a4d4a 300 t.start();
Jitse_Giesen 0:51a6e38a4d4a 301 huidigetijdX=t.read();
Jitse_Giesen 0:51a6e38a4d4a 302 if (huidigetijdX>2){
Jitse_Giesen 0:51a6e38a4d4a 303 led_R=1; //Go to the next program (couting values for Y)
Jitse_Giesen 0:51a6e38a4d4a 304 return 0;
Jitse_Giesen 0:51a6e38a4d4a 305 }
Jitse_Giesen 0:51a6e38a4d4a 306 }
Jitse_Giesen 0:51a6e38a4d4a 307 }
Jitse_Giesen 0:51a6e38a4d4a 308
Jitse_Giesen 0:51a6e38a4d4a 309 // Initial values needed for Y (see comments at X function)
Jitse_Giesen 0:51a6e38a4d4a 310 int Yin=0;
Jitse_Giesen 0:51a6e38a4d4a 311 double huidigetijdY;
Jitse_Giesen 0:51a6e38a4d4a 312
Jitse_Giesen 0:51a6e38a4d4a 313 //Feedback system for couting values of Y
Jitse_Giesen 0:51a6e38a4d4a 314 void ledtY(){
Jitse_Giesen 0:51a6e38a4d4a 315 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 316 Yin++;
Jitse_Giesen 0:51a6e38a4d4a 317 pc.printf("Yin is %i\n",Yin);
Jitse_Giesen 0:51a6e38a4d4a 318 led_G=0;
Jitse_Giesen 0:51a6e38a4d4a 319 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 320 wait(0.2);
Jitse_Giesen 0:51a6e38a4d4a 321 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 322 led_B=0;
Jitse_Giesen 0:51a6e38a4d4a 323 wait(0.5);
Jitse_Giesen 0:51a6e38a4d4a 324 }
Jitse_Giesen 0:51a6e38a4d4a 325
Jitse_Giesen 0:51a6e38a4d4a 326 // Couting system for values of Y
Jitse_Giesen 0:51a6e38a4d4a 327 int tellerY(){
Jitse_Giesen 0:51a6e38a4d4a 328 t.reset();
Jitse_Giesen 0:51a6e38a4d4a 329 led_G=1;
Jitse_Giesen 0:51a6e38a4d4a 330 led_B=0;
Jitse_Giesen 0:51a6e38a4d4a 331 led_R=1;
Jitse_Giesen 0:51a6e38a4d4a 332 while(true){
Jitse_Giesen 0:51a6e38a4d4a 333 button.fall(ledtY); //See comments at X
Jitse_Giesen 0:51a6e38a4d4a 334
Jitse_Giesen 0:51a6e38a4d4a 335 t.start();
Jitse_Giesen 0:51a6e38a4d4a 336 huidigetijdY=t.read();
Jitse_Giesen 0:51a6e38a4d4a 337 if (huidigetijdY>2){
Jitse_Giesen 0:51a6e38a4d4a 338 led_B=1;
Jitse_Giesen 0:51a6e38a4d4a 339
Jitse_Giesen 0:51a6e38a4d4a 340 //button.fall(0); // Wat is deze?
Jitse_Giesen 0:51a6e38a4d4a 341 return 0; // ga door naar het volgende programma
Jitse_Giesen 0:51a6e38a4d4a 342 }
Jitse_Giesen 0:51a6e38a4d4a 343 }
Jitse_Giesen 0:51a6e38a4d4a 344 }
Jitse_Giesen 0:51a6e38a4d4a 345 */
Jitse_Giesen 0:51a6e38a4d4a 346
Jitse_Giesen 0:51a6e38a4d4a 347 // Declaring all variables needed for calculating rope lengths,
Jitse_Giesen 0:51a6e38a4d4a 348 double Pox = 0;
Jitse_Giesen 0:51a6e38a4d4a 349 double Poy = 0;
Jitse_Giesen 0:51a6e38a4d4a 350 double Pbx = 0;
Jitse_Giesen 0:51a6e38a4d4a 351 double Pby = 887;
Jitse_Giesen 0:51a6e38a4d4a 352 double Prx = 768;
Jitse_Giesen 0:51a6e38a4d4a 353 double Pry = 443;
Jitse_Giesen 0:51a6e38a4d4a 354 double Pex=121;
Jitse_Giesen 0:51a6e38a4d4a 355 double Pey=308;
Jitse_Giesen 0:51a6e38a4d4a 356 double diamtrklosje=20;
Jitse_Giesen 0:51a6e38a4d4a 357 double pi=3.14159265359;
Jitse_Giesen 0:51a6e38a4d4a 358 double omtrekklosje=diamtrklosje*pi;
Jitse_Giesen 0:51a6e38a4d4a 359 double Lou;
Jitse_Giesen 0:51a6e38a4d4a 360 double Lbu;
Jitse_Giesen 0:51a6e38a4d4a 361 double Lru;
Jitse_Giesen 0:51a6e38a4d4a 362 double dLod;
Jitse_Giesen 0:51a6e38a4d4a 363 double dLbd;
Jitse_Giesen 0:51a6e38a4d4a 364 double dLrd;
Jitse_Giesen 0:51a6e38a4d4a 365
Jitse_Giesen 0:51a6e38a4d4a 366 // Declaring variables needed for calculating motor counts
Jitse_Giesen 0:51a6e38a4d4a 367 double roto;
Jitse_Giesen 0:51a6e38a4d4a 368 double rotb;
Jitse_Giesen 0:51a6e38a4d4a 369 double rotr;
Jitse_Giesen 0:51a6e38a4d4a 370 double rotzo;
Jitse_Giesen 0:51a6e38a4d4a 371 double rotzb;
Jitse_Giesen 0:51a6e38a4d4a 372 double rotzr;
Jitse_Giesen 0:51a6e38a4d4a 373 double counto;
Jitse_Giesen 0:51a6e38a4d4a 374 double countb;
Jitse_Giesen 0:51a6e38a4d4a 375 double countr;
Jitse_Giesen 0:51a6e38a4d4a 376 double countzo;
Jitse_Giesen 0:51a6e38a4d4a 377 double countzb;
Jitse_Giesen 0:51a6e38a4d4a 378 double countzr;
Jitse_Giesen 0:51a6e38a4d4a 379
Jitse_Giesen 0:51a6e38a4d4a 380 double hcounto;
Jitse_Giesen 0:51a6e38a4d4a 381 double dcounto;
Jitse_Giesen 0:51a6e38a4d4a 382 double hcountb;
Jitse_Giesen 0:51a6e38a4d4a 383 double dcountb;
Jitse_Giesen 0:51a6e38a4d4a 384 double hcountr;
Jitse_Giesen 0:51a6e38a4d4a 385 double dcountr;
Jitse_Giesen 0:51a6e38a4d4a 386
Jitse_Giesen 0:51a6e38a4d4a 387 // Declaring variables neeeded for calculating motor movements to get to a certain point <- klopt dit?
Jitse_Giesen 0:51a6e38a4d4a 388 double Psx;
Jitse_Giesen 0:51a6e38a4d4a 389 double Psy;
Jitse_Giesen 0:51a6e38a4d4a 390 double Vex;
Jitse_Giesen 0:51a6e38a4d4a 391 double Vey;
Jitse_Giesen 0:51a6e38a4d4a 392 double Kz=0.7; // nadersnelheid instellen
Jitse_Giesen 0:51a6e38a4d4a 393 double modVe;
Jitse_Giesen 0:51a6e38a4d4a 394 double Vmax=20;
Jitse_Giesen 0:51a6e38a4d4a 395 double Pstx;
Jitse_Giesen 0:51a6e38a4d4a 396 double Psty;
Jitse_Giesen 0:51a6e38a4d4a 397 double T=0.02;//seconds
Jitse_Giesen 0:51a6e38a4d4a 398
Jitse_Giesen 2:bf1c9d7afabd 399 double speedfactor1;
Jitse_Giesen 2:bf1c9d7afabd 400 double speedfactor2;
Jitse_Giesen 0:51a6e38a4d4a 401
Jitse_Giesen 0:51a6e38a4d4a 402
Jitse_Giesen 0:51a6e38a4d4a 403 //Deel om motor(en) aan te sturen--------------------------------------------
Jitse_Giesen 0:51a6e38a4d4a 404
Jitse_Giesen 2:bf1c9d7afabd 405
Jitse_Giesen 0:51a6e38a4d4a 406
Jitse_Giesen 0:51a6e38a4d4a 407 void calcdelta1() {
Jitse_Giesen 0:51a6e38a4d4a 408 delta1 = (dcounto - Encoder1.getPulses());
Jitse_Giesen 0:51a6e38a4d4a 409 }
Jitse_Giesen 0:51a6e38a4d4a 410
Jitse_Giesen 0:51a6e38a4d4a 411 void calcdelta2() {
Jitse_Giesen 0:51a6e38a4d4a 412 delta2 = (dcountb - Encoder2.getPulses()); // <------- de reden dat de delta negatief is (jitse)
Jitse_Giesen 0:51a6e38a4d4a 413 }
Jitse_Giesen 0:51a6e38a4d4a 414
Jitse_Giesen 0:51a6e38a4d4a 415 double referenceVelocity1;
Jitse_Giesen 0:51a6e38a4d4a 416 double motorValue1;
Jitse_Giesen 0:51a6e38a4d4a 417
Jitse_Giesen 0:51a6e38a4d4a 418 double referenceVelocity2;
Jitse_Giesen 0:51a6e38a4d4a 419 double motorValue2;
Jitse_Giesen 0:51a6e38a4d4a 420
Jitse_Giesen 0:51a6e38a4d4a 421 Ticker controlmotor1; // één ticker van maken?
Jitse_Giesen 0:51a6e38a4d4a 422 Ticker calculatedelta1;
Jitse_Giesen 0:51a6e38a4d4a 423 Ticker printdata1; //aparte ticker om print pc aan te kunnen spreken zonder get te worden van hoeveelheid geprinte waardes
Jitse_Giesen 0:51a6e38a4d4a 424
Jitse_Giesen 0:51a6e38a4d4a 425 Ticker controlmotor2; // één ticker van maken?
Jitse_Giesen 0:51a6e38a4d4a 426 Ticker calculatedelta2;
Jitse_Giesen 0:51a6e38a4d4a 427 Ticker printdata2; //aparte ticker om print pc aan te kunnen spreken zonder get te worden van hoeveelheid geprinte waardes
Jitse_Giesen 0:51a6e38a4d4a 428
Jitse_Giesen 0:51a6e38a4d4a 429 double GetReferenceVelocity1()
Jitse_Giesen 0:51a6e38a4d4a 430 {
Jitse_Giesen 0:51a6e38a4d4a 431 // Returns reference velocity in rad/s. Positive value means clockwise rotation.
Jitse_Giesen 0:51a6e38a4d4a 432 double maxVelocity1=Vex*25+Vey*25; // max 8.4 in rad/s of course!
Jitse_Giesen 0:51a6e38a4d4a 433 referenceVelocity1 = (-1)*speedfactor1 * maxVelocity1;
Jitse_Giesen 0:51a6e38a4d4a 434
Jitse_Giesen 1:9e871647a074 435 if (dcounto < (10))
Jitse_Giesen 0:51a6e38a4d4a 436 { speedfactor1 = 0.01;
Jitse_Giesen 1:9e871647a074 437 if (dcounto > (-10))
Jitse_Giesen 0:51a6e38a4d4a 438 { printf("kleiner111111111");
Jitse_Giesen 0:51a6e38a4d4a 439 speedfactor1=0;
Jitse_Giesen 0:51a6e38a4d4a 440 }
Jitse_Giesen 0:51a6e38a4d4a 441 }
Jitse_Giesen 1:9e871647a074 442 else if (dcounto > (-10))
Jitse_Giesen 0:51a6e38a4d4a 443 { speedfactor1 = -0.01;
Jitse_Giesen 1:9e871647a074 444 if (dcounto < (10))
Jitse_Giesen 0:51a6e38a4d4a 445 { printf("groter");
Jitse_Giesen 0:51a6e38a4d4a 446 speedfactor1=0;
Jitse_Giesen 0:51a6e38a4d4a 447 }
Jitse_Giesen 0:51a6e38a4d4a 448 }
Jitse_Giesen 0:51a6e38a4d4a 449 else
Jitse_Giesen 0:51a6e38a4d4a 450 { speedfactor1 = 0;
Jitse_Giesen 0:51a6e38a4d4a 451 pc.printf("speedfactor nul;");
Jitse_Giesen 0:51a6e38a4d4a 452 }
Jitse_Giesen 0:51a6e38a4d4a 453
Jitse_Giesen 0:51a6e38a4d4a 454 return referenceVelocity1;
Jitse_Giesen 0:51a6e38a4d4a 455 }
Jitse_Giesen 0:51a6e38a4d4a 456
Jitse_Giesen 0:51a6e38a4d4a 457 double GetReferenceVelocity2()
Jitse_Giesen 0:51a6e38a4d4a 458 {
Jitse_Giesen 0:51a6e38a4d4a 459 // Returns reference velocity in rad/s. Positive value means clockwise rotation.
Jitse_Giesen 0:51a6e38a4d4a 460 double maxVelocity2=Vex*25+Vey*25; // max 8.4 in rad/s of course!
Jitse_Giesen 0:51a6e38a4d4a 461 referenceVelocity2 = (-1)*speedfactor2 * maxVelocity2;
Jitse_Giesen 0:51a6e38a4d4a 462
Jitse_Giesen 0:51a6e38a4d4a 463 if (Encoder2.getPulses() < (dcountb+10))
Jitse_Giesen 0:51a6e38a4d4a 464 { speedfactor2 = -0.01;
Jitse_Giesen 0:51a6e38a4d4a 465 if (Encoder2.getPulses() > (dcountb-10))
Jitse_Giesen 0:51a6e38a4d4a 466 { //printf("kleiner22222222222");
Jitse_Giesen 0:51a6e38a4d4a 467 speedfactor2=0;
Jitse_Giesen 0:51a6e38a4d4a 468 }
Jitse_Giesen 0:51a6e38a4d4a 469 }
Jitse_Giesen 0:51a6e38a4d4a 470 else if (Encoder2.getPulses() > (dcountb-10))
Jitse_Giesen 0:51a6e38a4d4a 471 { speedfactor2 = 0.01;
Jitse_Giesen 0:51a6e38a4d4a 472 if (Encoder2.getPulses() < (dcountb+10))
Jitse_Giesen 0:51a6e38a4d4a 473 { //printf("groter");
Jitse_Giesen 0:51a6e38a4d4a 474 speedfactor2=0;
Jitse_Giesen 0:51a6e38a4d4a 475 }
Jitse_Giesen 0:51a6e38a4d4a 476 }
Jitse_Giesen 0:51a6e38a4d4a 477 else
Jitse_Giesen 0:51a6e38a4d4a 478 { speedfactor2 = 0;
Jitse_Giesen 0:51a6e38a4d4a 479 //pc.printf("speedfactor nul;");
Jitse_Giesen 0:51a6e38a4d4a 480 }
Jitse_Giesen 0:51a6e38a4d4a 481
Jitse_Giesen 0:51a6e38a4d4a 482 return referenceVelocity2;
Jitse_Giesen 0:51a6e38a4d4a 483 }
Jitse_Giesen 0:51a6e38a4d4a 484
Jitse_Giesen 0:51a6e38a4d4a 485 void SetMotor1(double motorValue1)
Jitse_Giesen 0:51a6e38a4d4a 486 {
Jitse_Giesen 0:51a6e38a4d4a 487 // Given -1<=motorValue<=1, this sets the PWM and direction bits for motor 1. Positive value makes
Jitse_Giesen 0:51a6e38a4d4a 488 // motor rotating clockwise. motorValues outside range are truncated to within range
Jitse_Giesen 0:51a6e38a4d4a 489 if (motorValue1 >=0) motor1DirectionPin=1;
Jitse_Giesen 0:51a6e38a4d4a 490 else motor1DirectionPin=0;
Jitse_Giesen 0:51a6e38a4d4a 491 if (fabs(motorValue1)>1) motor1MagnitudePin = 1;
Jitse_Giesen 0:51a6e38a4d4a 492 else motor1MagnitudePin = fabs(motorValue1);
Jitse_Giesen 0:51a6e38a4d4a 493
Jitse_Giesen 0:51a6e38a4d4a 494 }
Jitse_Giesen 0:51a6e38a4d4a 495
Jitse_Giesen 0:51a6e38a4d4a 496 void SetMotor2(double motorValue2)
Jitse_Giesen 0:51a6e38a4d4a 497 {
Jitse_Giesen 0:51a6e38a4d4a 498 // Given -1<=motorValue<=1, this sets the PWM and direction bits for motor 1. Positive value makes
Jitse_Giesen 0:51a6e38a4d4a 499 // motor rotating clockwise. motorValues outside range are truncated to within range
Jitse_Giesen 0:51a6e38a4d4a 500 if (motorValue2 >=0) motor2DirectionPin=1;
Jitse_Giesen 0:51a6e38a4d4a 501 else motor2DirectionPin=0;
Jitse_Giesen 0:51a6e38a4d4a 502 if (fabs(motorValue2)>1) motor2MagnitudePin = 1;
Jitse_Giesen 0:51a6e38a4d4a 503 else motor2MagnitudePin = fabs(motorValue2);
Jitse_Giesen 0:51a6e38a4d4a 504
Jitse_Giesen 0:51a6e38a4d4a 505 }
Jitse_Giesen 0:51a6e38a4d4a 506
Jitse_Giesen 0:51a6e38a4d4a 507 double FeedForwardControl1(double referenceVelocity1)
Jitse_Giesen 0:51a6e38a4d4a 508 {
Jitse_Giesen 0:51a6e38a4d4a 509 // very simple linear feed-forward control
Jitse_Giesen 0:51a6e38a4d4a 510 const double MotorGain=8.4; // unit: (rad/s) / PWM, max 8.4
Jitse_Giesen 0:51a6e38a4d4a 511 double motorValue1 = referenceVelocity1 / MotorGain;
Jitse_Giesen 0:51a6e38a4d4a 512 return motorValue1;
Jitse_Giesen 0:51a6e38a4d4a 513 }
Jitse_Giesen 0:51a6e38a4d4a 514
Jitse_Giesen 0:51a6e38a4d4a 515 double FeedForwardControl2(double referenceVelocity2)
Jitse_Giesen 0:51a6e38a4d4a 516 {
Jitse_Giesen 0:51a6e38a4d4a 517 // very simple linear feed-forward control
Jitse_Giesen 0:51a6e38a4d4a 518 const double MotorGain=8.4; // unit: (rad/s) / PWM, max 8.4
Jitse_Giesen 0:51a6e38a4d4a 519 double motorValue2 = referenceVelocity2 / MotorGain;
Jitse_Giesen 0:51a6e38a4d4a 520 return motorValue2;
Jitse_Giesen 0:51a6e38a4d4a 521 }
Jitse_Giesen 0:51a6e38a4d4a 522
Jitse_Giesen 0:51a6e38a4d4a 523 void MeasureAndControl1()
Jitse_Giesen 0:51a6e38a4d4a 524 {
Jitse_Giesen 0:51a6e38a4d4a 525 // This function measures the potmeter position, extracts a reference velocity from it,
Jitse_Giesen 0:51a6e38a4d4a 526 // and controls the motor with a simple FeedForward controller. Call this from a Ticker.
Jitse_Giesen 0:51a6e38a4d4a 527 double referenceVelocity1 = GetReferenceVelocity1();
Jitse_Giesen 0:51a6e38a4d4a 528 double motorValue1 = FeedForwardControl1(referenceVelocity1);
Jitse_Giesen 0:51a6e38a4d4a 529 SetMotor1(motorValue1);
Jitse_Giesen 0:51a6e38a4d4a 530 }
Jitse_Giesen 0:51a6e38a4d4a 531
Jitse_Giesen 0:51a6e38a4d4a 532 void MeasureAndControl2()
Jitse_Giesen 0:51a6e38a4d4a 533 {
Jitse_Giesen 0:51a6e38a4d4a 534 // This function measures the potmeter position, extracts a reference velocity from it,
Jitse_Giesen 0:51a6e38a4d4a 535 // and controls the motor with a simple FeedForward controller. Call this from a Ticker.
Jitse_Giesen 0:51a6e38a4d4a 536 double referenceVelocity2 = GetReferenceVelocity2();
Jitse_Giesen 0:51a6e38a4d4a 537 double motorValue2 = FeedForwardControl2(referenceVelocity2);
Jitse_Giesen 0:51a6e38a4d4a 538 SetMotor2(motorValue2);
Jitse_Giesen 0:51a6e38a4d4a 539 }
Jitse_Giesen 0:51a6e38a4d4a 540
Jitse_Giesen 0:51a6e38a4d4a 541 void readdata1()
Jitse_Giesen 0:51a6e38a4d4a 542 { //pc.printf("CurrentState = %i \r\n",Encoder.getCurrentState());
Jitse_Giesen 0:51a6e38a4d4a 543 //pc.printf("Pulses_M1 = %i \r\n",Encoder1.getPulses());
Jitse_Giesen 0:51a6e38a4d4a 544 //pc.printf("Revolutions = %i \r\n",Encoder.getRevolutions());
Jitse_Giesen 0:51a6e38a4d4a 545 //pc.printf("Delta_M1 = %i \r\n",delta1);
Jitse_Giesen 0:51a6e38a4d4a 546 }
Jitse_Giesen 0:51a6e38a4d4a 547
Jitse_Giesen 0:51a6e38a4d4a 548 void readdata2()
Jitse_Giesen 0:51a6e38a4d4a 549 { //pc.printf("CurrentState = %i \r\n",Encoder.getCurrentState());
Jitse_Giesen 0:51a6e38a4d4a 550 //pc.printf("Pulses_M2 = %i \r\n",Encoder2.getPulses());
Jitse_Giesen 0:51a6e38a4d4a 551 //pc.printf("Revolutions = %i \r\n",Encoder.getRevolutions());
Jitse_Giesen 0:51a6e38a4d4a 552 //pc.printf("Delta_M2 = %i \r\n",delta2);
Jitse_Giesen 0:51a6e38a4d4a 553 }
Jitse_Giesen 0:51a6e38a4d4a 554
Jitse_Giesen 0:51a6e38a4d4a 555 // einde deel motor------------------------------------------------------------------------------------
Jitse_Giesen 0:51a6e38a4d4a 556
Jitse_Giesen 0:51a6e38a4d4a 557 Ticker loop;
Jitse_Giesen 0:51a6e38a4d4a 558
Jitse_Giesen 0:51a6e38a4d4a 559 /*Calculates ropelengths that are needed to get to new positions, based on the
Jitse_Giesen 0:51a6e38a4d4a 560 set coordinates and the position of the poles */
Jitse_Giesen 0:51a6e38a4d4a 561 double touwlengtes(){
Jitse_Giesen 0:51a6e38a4d4a 562 Lou=sqrt(pow((Pstx-Pox),2)+pow((Psty-Poy),2));
Jitse_Giesen 0:51a6e38a4d4a 563 Lbu=sqrt(pow((Pstx-Pbx),2)+pow((Psty-Pby),2));
Jitse_Giesen 0:51a6e38a4d4a 564 Lru=sqrt(pow((Pstx-Prx),2)+pow((Psty-Pry),2));
Jitse_Giesen 0:51a6e38a4d4a 565 return 0;
Jitse_Giesen 0:51a6e38a4d4a 566 }
Jitse_Giesen 0:51a6e38a4d4a 567
Jitse_Giesen 0:51a6e38a4d4a 568 /* Calculates rotations (and associated counts) of the motor to get to the
Jitse_Giesen 0:51a6e38a4d4a 569 desired new position*/
Jitse_Giesen 0:51a6e38a4d4a 570 double turns(){
Jitse_Giesen 0:51a6e38a4d4a 571
Jitse_Giesen 0:51a6e38a4d4a 572 roto=Lou/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 573 rotb=Lbu/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 574 rotr=Lru/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 575 counto=roto*4200;
Jitse_Giesen 0:51a6e38a4d4a 576 dcounto=counto-hcounto;
Jitse_Giesen 0:51a6e38a4d4a 577 pc.printf("dcounto = %f \n\r",dcounto);
Jitse_Giesen 0:51a6e38a4d4a 578 countb=rotb*4200;
Jitse_Giesen 0:51a6e38a4d4a 579 dcountb=countb-hcountb;
Jitse_Giesen 0:51a6e38a4d4a 580 pc.printf("dcountb = %f \n\r",dcountb);
Jitse_Giesen 0:51a6e38a4d4a 581 countr=rotr*4200;
Jitse_Giesen 0:51a6e38a4d4a 582 dcountr=countr-hcountr;
Jitse_Giesen 0:51a6e38a4d4a 583
Jitse_Giesen 0:51a6e38a4d4a 584 return 0;
Jitse_Giesen 0:51a6e38a4d4a 585 }
Jitse_Giesen 0:51a6e38a4d4a 586
Jitse_Giesen 0:51a6e38a4d4a 587 // Waar komen Pstx en Psty vandaan en waar staan ze voor? En is dit maar voor een paal?
Jitse_Giesen 0:51a6e38a4d4a 588 double Pst(){
Jitse_Giesen 0:51a6e38a4d4a 589 Pstx=Pex+Vex*T;
Jitse_Giesen 0:51a6e38a4d4a 590 Psty=Pey+Vey*T;
Jitse_Giesen 0:51a6e38a4d4a 591 touwlengtes();
Jitse_Giesen 0:51a6e38a4d4a 592 Pex=Pstx;
Jitse_Giesen 0:51a6e38a4d4a 593 Pey=Psty;
Jitse_Giesen 0:51a6e38a4d4a 594 pc.printf("een stappie verder\n\r x=%.2f\n\r y=%.2f\n\r",Pstx,Psty);
Jitse_Giesen 0:51a6e38a4d4a 595 //pc.printf("met lengtes:\n\r Lo=%.2f Lb=%.2f Lr=%.2f\n\r",Lou,Lbu,Lru);
Jitse_Giesen 0:51a6e38a4d4a 596 turns();
Jitse_Giesen 0:51a6e38a4d4a 597 //pc.printf("rotatie per motor:\n\r o=%.2f b=%.2f r=%.2f\n\r",roto,rotb,rotr);
Jitse_Giesen 0:51a6e38a4d4a 598 pc.printf("counts per motor:\n\r o=%.2f b=%.2f r=%.2f\n\r",counto,countb,countr);
Jitse_Giesen 0:51a6e38a4d4a 599 /*float R;
Jitse_Giesen 0:51a6e38a4d4a 600 R=Vex/Vey; // met dit stukje kan je zien dat de verhouding tussen Vex en Vey constant is en de end efector dus een rechte lijn maakt
Jitse_Giesen 0:51a6e38a4d4a 601 pc.printf("\n\r R=%f",R);*/
Jitse_Giesen 0:51a6e38a4d4a 602 return 0;
Jitse_Giesen 0:51a6e38a4d4a 603 }
Jitse_Giesen 0:51a6e38a4d4a 604
Jitse_Giesen 0:51a6e38a4d4a 605 //Calculating desired end position based on the EMG input <- Waarom maar voor een paal?
Jitse_Giesen 0:51a6e38a4d4a 606 double Ps(){
Jitse_Giesen 0:51a6e38a4d4a 607 if (Move_done==true);
Jitse_Giesen 0:51a6e38a4d4a 608 Psx=(Xin_new)*30+121;
Jitse_Giesen 0:51a6e38a4d4a 609 Psy=(Yin_new)*30+308;
Jitse_Giesen 0:51a6e38a4d4a 610 pc.printf("x=%.2f \n\r y=%.2f \n\r",Psx,Psy);
Jitse_Giesen 0:51a6e38a4d4a 611 hcounto=4200*((sqrt(pow((Pex-Pox),2)+pow((Pey-Poy),2)))/omtrekklosje);
Jitse_Giesen 0:51a6e38a4d4a 612 hcountb=4200*((sqrt(pow((Pex-Pbx),2)+pow((Pey-Pby),2)))/omtrekklosje);
Jitse_Giesen 0:51a6e38a4d4a 613 hcountr=4200*((sqrt(pow((Pex-Prx),2)+pow((Pey-Pry),2)))/omtrekklosje);
Jitse_Giesen 0:51a6e38a4d4a 614 return 0;
Jitse_Giesen 0:51a6e38a4d4a 615 }
Jitse_Giesen 0:51a6e38a4d4a 616
Jitse_Giesen 0:51a6e38a4d4a 617 // Rekent dit de snelheid uit waarmee de motoren bewegen?
Jitse_Giesen 0:51a6e38a4d4a 618 void Ve(){
Jitse_Giesen 0:51a6e38a4d4a 619 Vex=Kz*(Psx-Pex);
Jitse_Giesen 0:51a6e38a4d4a 620 Vey=Kz*(Psy-Pey);
Jitse_Giesen 0:51a6e38a4d4a 621 modVe=sqrt(pow(Vex,2)+pow(Vey,2));
Jitse_Giesen 0:51a6e38a4d4a 622 if(modVe>Vmax){
Jitse_Giesen 0:51a6e38a4d4a 623 Vex=(Vex/modVe)*Vmax;
Jitse_Giesen 0:51a6e38a4d4a 624 Vey=(Vey/modVe)*Vmax;
Jitse_Giesen 0:51a6e38a4d4a 625 }
Jitse_Giesen 0:51a6e38a4d4a 626 Pst();
Jitse_Giesen 0:51a6e38a4d4a 627 //pc.printf("Vex=%.2f \r\n Vey=%.2f \r\n",Vex,Vey);
Jitse_Giesen 0:51a6e38a4d4a 628 if((abs(Vex)<0.01f)&&(abs(Vey)<0.01f)){
Jitse_Giesen 0:51a6e38a4d4a 629 Move_done=true;
Jitse_Giesen 0:51a6e38a4d4a 630 loop.detach();
Jitse_Giesen 0:51a6e38a4d4a 631 }
Jitse_Giesen 0:51a6e38a4d4a 632 }
Jitse_Giesen 0:51a6e38a4d4a 633
Jitse_Giesen 0:51a6e38a4d4a 634 // Calculating the desired position, so that the motors can go here
Jitse_Giesen 0:51a6e38a4d4a 635 int calculator(){
Jitse_Giesen 0:51a6e38a4d4a 636 Ps();
Jitse_Giesen 0:51a6e38a4d4a 637 loop.attach(&Ve,0.02);
Jitse_Giesen 0:51a6e38a4d4a 638 return 0;
Jitse_Giesen 0:51a6e38a4d4a 639 }
Jitse_Giesen 0:51a6e38a4d4a 640
Jitse_Giesen 0:51a6e38a4d4a 641 // Function which makes it possible to lower the end-effector to pick up a piece
Jitse_Giesen 0:51a6e38a4d4a 642 void zakker(){
Jitse_Giesen 0:51a6e38a4d4a 643 while(1){
Jitse_Giesen 0:51a6e38a4d4a 644 wait(1);
Jitse_Giesen 0:51a6e38a4d4a 645 if(Move_done==true){ //misschien moet je hier als voorwaarden een delta is 1 zetten // hierdoor wacht dit programma totdat de beweging klaar is
Jitse_Giesen 0:51a6e38a4d4a 646 dLod=sqrt(pow(Lou,2)+pow(397.85,2))-Lou; //dit is wat je motoren moeten doen om te zakken
Jitse_Giesen 0:51a6e38a4d4a 647 dLbd=sqrt(pow(Lbu,2)+pow(397.85,2))-Lbu;
Jitse_Giesen 0:51a6e38a4d4a 648 dLrd=sqrt(pow(Lru,2)+pow(397.85,2))-Lru;
Jitse_Giesen 0:51a6e38a4d4a 649 rotzo=dLod/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 650 rotzb=dLbd/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 651 rotzr=dLrd/omtrekklosje;
Jitse_Giesen 0:51a6e38a4d4a 652 countzo=rotzo*4200;
Jitse_Giesen 0:51a6e38a4d4a 653 countzb=rotzb*4200;
Jitse_Giesen 0:51a6e38a4d4a 654 countzr=rotzr*4200;
Jitse_Giesen 0:51a6e38a4d4a 655
Jitse_Giesen 0:51a6e38a4d4a 656 //pc.printf("o=%.2fb=%.2fr=%.2f",countzo,countzb,countzr); // hier moet komen te staan hoe het zakken gaat
Jitse_Giesen 0:51a6e38a4d4a 657 }
Jitse_Giesen 0:51a6e38a4d4a 658 }
Jitse_Giesen 0:51a6e38a4d4a 659 }
Jitse_Giesen 0:51a6e38a4d4a 660
Jitse_Giesen 0:51a6e38a4d4a 661 int main()
Jitse_Giesen 0:51a6e38a4d4a 662 {
Jitse_Giesen 0:51a6e38a4d4a 663 pc.baud(115200);
Jitse_Giesen 2:bf1c9d7afabd 664 getbqChain();
Jitse_Giesen 2:bf1c9d7afabd 665 threshold_timerR.attach(&Threshold_samplingBR, 0.002);
Jitse_Giesen 2:bf1c9d7afabd 666 threshold_timerL.attach(&Threshold_samplingBL, 0.002);
Jitse_Giesen 0:51a6e38a4d4a 667 while(true){
Jitse_Giesen 0:51a6e38a4d4a 668 // sample_timer.attach(&EMG_sample, 0.002);
Jitse_Giesen 0:51a6e38a4d4a 669 //wait(2.5f);
Jitse_Giesen 0:51a6e38a4d4a 670
Jitse_Giesen 0:51a6e38a4d4a 671 tellerX();
Jitse_Giesen 0:51a6e38a4d4a 672 tellerY();
Jitse_Giesen 0:51a6e38a4d4a 673 calculator();
Jitse_Giesen 0:51a6e38a4d4a 674 controlmotor1.attach(&MeasureAndControl1, 0.01);
Jitse_Giesen 0:51a6e38a4d4a 675 calculatedelta1.attach(&calcdelta1, 0.01);
Jitse_Giesen 0:51a6e38a4d4a 676 printdata1.attach(&readdata1, 0.5);
Jitse_Giesen 0:51a6e38a4d4a 677 // controlmotor2.attach(&MeasureAndControl2, 0.01);
Jitse_Giesen 0:51a6e38a4d4a 678 //calculatedelta2.attach(&calcdelta2, 0.01);
Jitse_Giesen 0:51a6e38a4d4a 679 //printdata2.attach(&readdata2, 0.5);
Jitse_Giesen 0:51a6e38a4d4a 680 //zakker();
Jitse_Giesen 0:51a6e38a4d4a 681 wait(5.0f);
Jitse_Giesen 0:51a6e38a4d4a 682 }
Jitse_Giesen 0:51a6e38a4d4a 683 return 0;
Jitse_Giesen 0:51a6e38a4d4a 684 }