Motor aansturen met mbed

Dependencies:   FastPWM mbed QEI biquadFilter HIDScope MODSERIAL

Committer:
efvanmarrewijk
Date:
Thu Nov 01 08:46:58 2018 +0000
Revision:
50:522bb6eebda6
Parent:
49:48363ca21a15
Latest version just before merge, without calibration code and with code for movement of 3 motors, 3rd motor is TURNED OFF (after calibration it can be turned on again)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
efvanmarrewijk 16:720365110953 1 // Inclusion of libraries
efvanmarrewijk 31:91ad5b188bd9 2 #include "mbed.h"
efvanmarrewijk 31:91ad5b188bd9 3 #include "FastPWM.h"
efvanmarrewijk 31:91ad5b188bd9 4 #include "QEI.h" // Includes library for encoder
efvanmarrewijk 31:91ad5b188bd9 5 #include "MODSERIAL.h"
efvanmarrewijk 31:91ad5b188bd9 6 #include "HIDScope.h"
efvanmarrewijk 31:91ad5b188bd9 7 #include "BiQuad.h"
Ramonwaninge 0:3ea1bbfbeaae 8
efvanmarrewijk 14:e21cb701ccb8 9 // Input
efvanmarrewijk 27:3430dfb4c9fb 10 AnalogIn pot1(A1);
efvanmarrewijk 27:3430dfb4c9fb 11 AnalogIn pot2(A2);
efvanmarrewijk 21:363271dcfe1f 12 InterruptIn button1(D0);
efvanmarrewijk 21:363271dcfe1f 13 InterruptIn button2(D1);
efvanmarrewijk 31:91ad5b188bd9 14 InterruptIn emergencybutton(SW2); //The button SW2 on the K64F is the emergency button: if you press this, everything will abort as soon as possible
efvanmarrewijk 21:363271dcfe1f 15
efvanmarrewijk 32:a5b411833d1e 16 DigitalIn pin8(D8); // Encoder 1 B
efvanmarrewijk 32:a5b411833d1e 17 DigitalIn pin9(D9); // Encoder 1 A
efvanmarrewijk 32:a5b411833d1e 18 DigitalIn pin10(D10); // Encoder 2 B
efvanmarrewijk 32:a5b411833d1e 19 DigitalIn pin11(D11); // Encoder 2 A
efvanmarrewijk 32:a5b411833d1e 20 DigitalIn pin12(D12); // Encoder 3 B
efvanmarrewijk 32:a5b411833d1e 21 DigitalIn pin13(D13); // Encoder 3 A
efvanmarrewijk 9:65c52c1f4a57 22
efvanmarrewijk 14:e21cb701ccb8 23 // Output
efvanmarrewijk 35:ba556f2d0fcc 24 DigitalOut pin2(D2); // Motor 3 direction = motor flip
efvanmarrewijk 43:e8f2193822b7 25 FastPWM pin3(A5); // Motor 3 pwm = motor flip
efvanmarrewijk 35:ba556f2d0fcc 26 DigitalOut pin4(D4); // Motor 2 direction = motor right
efvanmarrewijk 35:ba556f2d0fcc 27 FastPWM pin5(D5); // Motor 2 pwm = motor right
efvanmarrewijk 35:ba556f2d0fcc 28 FastPWM pin6(D6); // Motor 1 pwm = motor left
efvanmarrewijk 35:ba556f2d0fcc 29 DigitalOut pin7(D7); // Motor 1 direction = motor left
efvanmarrewijk 26:b48708ed51ff 30
efvanmarrewijk 26:b48708ed51ff 31 DigitalOut greenled(LED_GREEN,1);
efvanmarrewijk 26:b48708ed51ff 32 DigitalOut redled(LED_RED,1);
efvanmarrewijk 26:b48708ed51ff 33 DigitalOut blueled(LED_BLUE,1);
Ramonwaninge 2:d8a552d1d33a 34
efvanmarrewijk 16:720365110953 35 // Utilisation of libraries
efvanmarrewijk 16:720365110953 36 MODSERIAL pc(USBTX, USBRX);
efvanmarrewijk 35:ba556f2d0fcc 37 QEI Encoderl(D9,D8,NC,4200); // Counterclockwise motor rotation is the positive direction
efvanmarrewijk 39:dcf3e5019a63 38 QEI Encoderr(D10,D11,NC,4200); // Counterclockwise motor rotation is the positive direction
efvanmarrewijk 43:e8f2193822b7 39 QEI Encoderf(D12,D13,NC,4200); // Counterclockwise motor rotation is the positive direction
efvanmarrewijk 43:e8f2193822b7 40 Ticker motorl;
efvanmarrewijk 43:e8f2193822b7 41 Ticker motorr;
efvanmarrewijk 43:e8f2193822b7 42 Ticker motorf;
efvanmarrewijk 24:d255752065d1 43 Ticker encoders;
efvanmarrewijk 9:65c52c1f4a57 44
efvanmarrewijk 16:720365110953 45 // Global variables
efvanmarrewijk 50:522bb6eebda6 46 const float PI = 3.14159265358979f;
efvanmarrewijk 32:a5b411833d1e 47 float u3 = 0.0f; // Normalised variable for the movement of motor 3
efvanmarrewijk 32:a5b411833d1e 48 const float fCountsRad = 4200.0f;
efvanmarrewijk 49:48363ca21a15 49 const float dt = 0.002f;
efvanmarrewijk 16:720365110953 50
efvanmarrewijk 43:e8f2193822b7 51 float currentanglel;
efvanmarrewijk 43:e8f2193822b7 52 float errorl;
efvanmarrewijk 43:e8f2193822b7 53 float currentangler;
efvanmarrewijk 43:e8f2193822b7 54 float errorr;
efvanmarrewijk 43:e8f2193822b7 55 float currentanglef;
efvanmarrewijk 43:e8f2193822b7 56 float errorf;
efvanmarrewijk 49:48363ca21a15 57 float Kp;
efvanmarrewijk 49:48363ca21a15 58 float Kd;
efvanmarrewijk 43:e8f2193822b7 59
efvanmarrewijk 16:720365110953 60 // Functions
efvanmarrewijk 32:a5b411833d1e 61 void Emergency() // Emgergency, if SW2 on biorobotics is pressed, everything will instantly abort and a red light goes on
efvanmarrewijk 32:a5b411833d1e 62 { greenled = 1; // Red light on
efvanmarrewijk 30:c4a3e868ef04 63 blueled = 1;
efvanmarrewijk 30:c4a3e868ef04 64 redled = 0;
efvanmarrewijk 32:a5b411833d1e 65 pin3 = 0; // All motor forces to zero
efvanmarrewijk 30:c4a3e868ef04 66 pin5 = 0;
efvanmarrewijk 30:c4a3e868ef04 67 pin6 = 0;
efvanmarrewijk 32:a5b411833d1e 68 exit (0); // Abort mission!!
efvanmarrewijk 30:c4a3e868ef04 69 }
efvanmarrewijk 30:c4a3e868ef04 70
efvanmarrewijk 31:91ad5b188bd9 71 // Subfunctions
efvanmarrewijk 35:ba556f2d0fcc 72 int Countslinput() // Gets the counts from encoder 1
efvanmarrewijk 35:ba556f2d0fcc 73 { int countsl;
efvanmarrewijk 35:ba556f2d0fcc 74 countsl = Encoderl.getPulses();
efvanmarrewijk 35:ba556f2d0fcc 75 return countsl;
efvanmarrewijk 27:3430dfb4c9fb 76 }
efvanmarrewijk 35:ba556f2d0fcc 77 int Countsrinput() // Gets the counts from encoder 2
efvanmarrewijk 35:ba556f2d0fcc 78 { int countsr;
efvanmarrewijk 35:ba556f2d0fcc 79 countsr = Encoderr.getPulses();
efvanmarrewijk 35:ba556f2d0fcc 80 return countsr;
efvanmarrewijk 27:3430dfb4c9fb 81 }
efvanmarrewijk 35:ba556f2d0fcc 82 int Countsfinput() // Gets the counts from encoder 3
efvanmarrewijk 35:ba556f2d0fcc 83 { int countsf;
efvanmarrewijk 35:ba556f2d0fcc 84 countsf = Encoderf.getPulses();
efvanmarrewijk 35:ba556f2d0fcc 85 return countsf;
efvanmarrewijk 27:3430dfb4c9fb 86 }
efvanmarrewijk 27:3430dfb4c9fb 87
efvanmarrewijk 50:522bb6eebda6 88 float CurrentAngle(float counts) // Calculates the current angle of the motor (between -2*PI to 2*PI) based on the counts from the encoder
efvanmarrewijk 50:522bb6eebda6 89 { float angle = ((float)counts*2.0f*PI)/fCountsRad;
efvanmarrewijk 50:522bb6eebda6 90 while (angle > 2.0f*PI)
efvanmarrewijk 50:522bb6eebda6 91 { angle = angle-2.0f*PI;
efvanmarrewijk 27:3430dfb4c9fb 92 }
efvanmarrewijk 50:522bb6eebda6 93 while (angle < -2.0f*PI)
efvanmarrewijk 50:522bb6eebda6 94 { angle = angle+2.0f*PI;
efvanmarrewijk 30:c4a3e868ef04 95 }
efvanmarrewijk 30:c4a3e868ef04 96 return angle;
efvanmarrewijk 27:3430dfb4c9fb 97 }
efvanmarrewijk 27:3430dfb4c9fb 98
efvanmarrewijk 32:a5b411833d1e 99 float ErrorCalc(float refvalue,float CurAngle) // Calculates the error of the system, based on the current angle and the reference value
efvanmarrewijk 32:a5b411833d1e 100 { float error = refvalue - CurAngle;
efvanmarrewijk 30:c4a3e868ef04 101 return error;
efvanmarrewijk 30:c4a3e868ef04 102 }
efvanmarrewijk 30:c4a3e868ef04 103
efvanmarrewijk 32:a5b411833d1e 104 float Kpcontr() // Sets the Kp value for the controller dependent on the scaled angle of potmeter 2
efvanmarrewijk 49:48363ca21a15 105 { float Kp = 40.0f*pot2;
efvanmarrewijk 30:c4a3e868ef04 106 return Kp;
efvanmarrewijk 30:c4a3e868ef04 107 }
efvanmarrewijk 30:c4a3e868ef04 108
efvanmarrewijk 32:a5b411833d1e 109 float Kdcontr() // Sets the Kd value for the controller dependent on the scaled angle of potmeter 1
efvanmarrewijk 49:48363ca21a15 110 { float Kd = 10.0f*pot1;
efvanmarrewijk 30:c4a3e868ef04 111 return Kd;
efvanmarrewijk 30:c4a3e868ef04 112 }
efvanmarrewijk 43:e8f2193822b7 113
efvanmarrewijk 43:e8f2193822b7 114 float PIDcontrollerl(float refvalue,float CurAngle) // PID controller for the motors, based on the reference value and the current angle of the motor
efvanmarrewijk 50:522bb6eebda6 115 { //Kp = Kpcontr();
efvanmarrewijk 50:522bb6eebda6 116 float Kp = 19.24f;
efvanmarrewijk 49:48363ca21a15 117 float Ki = 1.02f;
efvanmarrewijk 50:522bb6eebda6 118 float Kd = 0.827f;
efvanmarrewijk 50:522bb6eebda6 119 //Kd = Kdcontr();
efvanmarrewijk 43:e8f2193822b7 120 float error = ErrorCalc(refvalue,CurAngle);
efvanmarrewijk 43:e8f2193822b7 121 static float error_integrall = 0.0;
efvanmarrewijk 43:e8f2193822b7 122 static float error_prevl = error; // initialization with this value only done once!
efvanmarrewijk 43:e8f2193822b7 123 static BiQuad PIDfilterl(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
efvanmarrewijk 43:e8f2193822b7 124 // Proportional part:
efvanmarrewijk 43:e8f2193822b7 125 float u_k = Kp * error;
efvanmarrewijk 43:e8f2193822b7 126 // Integral part
efvanmarrewijk 43:e8f2193822b7 127 error_integrall = error_integrall + error * dt;
efvanmarrewijk 43:e8f2193822b7 128 float u_i = Ki * error_integrall;
efvanmarrewijk 43:e8f2193822b7 129 // Derivative part
efvanmarrewijk 43:e8f2193822b7 130 float error_derivative = (error - error_prevl)/dt;
efvanmarrewijk 43:e8f2193822b7 131 float filtered_error_derivative = PIDfilterl.step(error_derivative);
efvanmarrewijk 43:e8f2193822b7 132 float u_d = Kd * filtered_error_derivative;
efvanmarrewijk 43:e8f2193822b7 133 error_prevl = error;
efvanmarrewijk 43:e8f2193822b7 134 // Sum all parts and return it
efvanmarrewijk 43:e8f2193822b7 135 return u_k + u_i + u_d;
efvanmarrewijk 43:e8f2193822b7 136 }
efvanmarrewijk 43:e8f2193822b7 137
efvanmarrewijk 43:e8f2193822b7 138 float DesiredAnglel() // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
efvanmarrewijk 50:522bb6eebda6 139 { float angle = (pot1*2.0f*PI)-PI;
efvanmarrewijk 43:e8f2193822b7 140 return angle;
efvanmarrewijk 43:e8f2193822b7 141 }
efvanmarrewijk 43:e8f2193822b7 142
efvanmarrewijk 43:e8f2193822b7 143 void turnl() // main function for movement of motor 1, all above functions with an extra tab are called
efvanmarrewijk 43:e8f2193822b7 144 {
efvanmarrewijk 50:522bb6eebda6 145 //float refvaluel = 0.5f*PI;
efvanmarrewijk 50:522bb6eebda6 146 float refvaluel = -DesiredAnglel(); // different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 147 int countsl = Countslinput(); // different encoder pins per motor
efvanmarrewijk 50:522bb6eebda6 148 currentanglel = CurrentAngle(countsl); // different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 149 float PIDcontroll = PIDcontrollerl(refvaluel,currentanglel); // same for every motor
efvanmarrewijk 50:522bb6eebda6 150 errorl = ErrorCalc(refvaluel,currentanglel); // same for every motor
efvanmarrewijk 43:e8f2193822b7 151
efvanmarrewijk 50:522bb6eebda6 152 pin6 = fabs(PIDcontroll); // different pins for every motor
efvanmarrewijk 50:522bb6eebda6 153 pin7 = PIDcontroll > 0.0f; // different pins for every motor
efvanmarrewijk 43:e8f2193822b7 154 }
efvanmarrewijk 43:e8f2193822b7 155
efvanmarrewijk 43:e8f2193822b7 156 float PIDcontrollerr(float refvalue,float CurAngle) // PID controller for the motors, based on the reference value and the current angle of the motor
efvanmarrewijk 50:522bb6eebda6 157 { //Kp = Kpcontr();
efvanmarrewijk 50:522bb6eebda6 158 float Kp = 19.24f;
efvanmarrewijk 50:522bb6eebda6 159 float Ki = 1.02f;
efvanmarrewijk 50:522bb6eebda6 160 float Kd = 0.827f;
efvanmarrewijk 50:522bb6eebda6 161 //Kd = Kdcontr();
efvanmarrewijk 32:a5b411833d1e 162 float error = ErrorCalc(refvalue,CurAngle);
efvanmarrewijk 43:e8f2193822b7 163 static float error_integralr = 0.0;
efvanmarrewijk 43:e8f2193822b7 164 static float error_prevr = error; // initialization with this value only done once!
efvanmarrewijk 43:e8f2193822b7 165 static BiQuad PIDfilterr(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
efvanmarrewijk 27:3430dfb4c9fb 166 // Proportional part:
efvanmarrewijk 30:c4a3e868ef04 167 float u_k = Kp * error;
efvanmarrewijk 27:3430dfb4c9fb 168 // Integral part
efvanmarrewijk 43:e8f2193822b7 169 error_integralr = error_integralr + error * dt;
efvanmarrewijk 43:e8f2193822b7 170 float u_i = Ki * error_integralr;
efvanmarrewijk 30:c4a3e868ef04 171 // Derivative part
efvanmarrewijk 43:e8f2193822b7 172 float error_derivative = (error - error_prevr)/dt;
efvanmarrewijk 43:e8f2193822b7 173 float filtered_error_derivative = PIDfilterr.step(error_derivative);
efvanmarrewijk 30:c4a3e868ef04 174 float u_d = Kd * filtered_error_derivative;
efvanmarrewijk 43:e8f2193822b7 175 error_prevr = error;
efvanmarrewijk 27:3430dfb4c9fb 176 // Sum all parts and return it
efvanmarrewijk 30:c4a3e868ef04 177 return u_k + u_i + u_d;
efvanmarrewijk 27:3430dfb4c9fb 178 }
efvanmarrewijk 43:e8f2193822b7 179
efvanmarrewijk 43:e8f2193822b7 180 float DesiredAngler() // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
efvanmarrewijk 50:522bb6eebda6 181 { float angle = (pot2*2.0f*PI)-PI;
efvanmarrewijk 43:e8f2193822b7 182 return angle;
efvanmarrewijk 43:e8f2193822b7 183 }
efvanmarrewijk 30:c4a3e868ef04 184
efvanmarrewijk 43:e8f2193822b7 185 void turnr() // main function for movement of motor 1, all above functions with an extra tab are called
efvanmarrewijk 26:b48708ed51ff 186 {
efvanmarrewijk 50:522bb6eebda6 187 //float refvaluer = PI/4.0f;
efvanmarrewijk 50:522bb6eebda6 188 float refvaluer = -DesiredAngler(); // DONT CHANGE THIS MINUS SIGN: different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 189 int countsr = Countsrinput(); // different encoder pins per motor
efvanmarrewijk 50:522bb6eebda6 190 currentangler = CurrentAngle(countsr); // different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 191 float PIDcontrolr = PIDcontrollerr(refvaluer,currentangler); // same for every motor
efvanmarrewijk 50:522bb6eebda6 192 errorr = ErrorCalc(refvaluer,currentangler); // same for every motor
efvanmarrewijk 30:c4a3e868ef04 193
efvanmarrewijk 50:522bb6eebda6 194 pin5 = fabs(PIDcontrolr); // different pins for every motor
efvanmarrewijk 50:522bb6eebda6 195 pin4 = PIDcontrolr > 0.0f; // different pins for every motor
efvanmarrewijk 35:ba556f2d0fcc 196 }
efvanmarrewijk 35:ba556f2d0fcc 197
efvanmarrewijk 43:e8f2193822b7 198 float PIDcontrollerf(float refvalue,float CurAngle) // PID controller for the motors, based on the reference value and the current angle of the motor
efvanmarrewijk 50:522bb6eebda6 199 { //Kp = Kpcontr();
efvanmarrewijk 50:522bb6eebda6 200 float Kp = 19.24f;
efvanmarrewijk 50:522bb6eebda6 201 float Ki = 1.02f;
efvanmarrewijk 50:522bb6eebda6 202 float Kd = 0.827f;
efvanmarrewijk 50:522bb6eebda6 203 //Kd = Kdcontr();
efvanmarrewijk 43:e8f2193822b7 204 float error = ErrorCalc(refvalue,CurAngle);
efvanmarrewijk 43:e8f2193822b7 205 static float error_integralf = 0.0;
efvanmarrewijk 43:e8f2193822b7 206 static float error_prevf = error; // initialization with this value only done once!
efvanmarrewijk 43:e8f2193822b7 207 static BiQuad PIDfilterf(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
efvanmarrewijk 43:e8f2193822b7 208 // Proportional part:
efvanmarrewijk 43:e8f2193822b7 209 float u_k = Kp * error;
efvanmarrewijk 43:e8f2193822b7 210 // Integral part
efvanmarrewijk 43:e8f2193822b7 211 error_integralf = error_integralf + error * dt;
efvanmarrewijk 43:e8f2193822b7 212 float u_i = Ki * error_integralf;
efvanmarrewijk 43:e8f2193822b7 213 // Derivative part
efvanmarrewijk 43:e8f2193822b7 214 float error_derivative = (error - error_prevf)/dt;
efvanmarrewijk 43:e8f2193822b7 215 float filtered_error_derivative = PIDfilterf.step(error_derivative);
efvanmarrewijk 43:e8f2193822b7 216 float u_d = Kd * filtered_error_derivative;
efvanmarrewijk 43:e8f2193822b7 217 error_prevf = error;
efvanmarrewijk 43:e8f2193822b7 218 // Sum all parts and return it
efvanmarrewijk 43:e8f2193822b7 219 return u_k + u_i + u_d;
efvanmarrewijk 43:e8f2193822b7 220 }
efvanmarrewijk 35:ba556f2d0fcc 221
efvanmarrewijk 43:e8f2193822b7 222 float DesiredAnglef() // Sets the desired angle for the controller dependent on the scaled angle of potmeter 1
efvanmarrewijk 50:522bb6eebda6 223 { float angle = (pot2*2.0f*PI)-PI;
efvanmarrewijk 43:e8f2193822b7 224 return angle;
efvanmarrewijk 43:e8f2193822b7 225 }
efvanmarrewijk 43:e8f2193822b7 226
efvanmarrewijk 43:e8f2193822b7 227 void turnf() // main function for movement of motor 1, all above functions with an extra tab are called
efvanmarrewijk 43:e8f2193822b7 228 {
efvanmarrewijk 50:522bb6eebda6 229 float refvaluef = 0.0f;
efvanmarrewijk 50:522bb6eebda6 230 //float refvaluef = -DesiredAnglef(); // DONT CHANGE THIS MINUS SIGN: different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 231 int countsf = Countsfinput(); // different encoder pins per motor
efvanmarrewijk 50:522bb6eebda6 232 currentanglef = CurrentAngle(countsf); // different minus sign per motor
efvanmarrewijk 50:522bb6eebda6 233 float PIDcontrolf = PIDcontrollerf(refvaluef,currentanglef); // same for every motor
efvanmarrewijk 50:522bb6eebda6 234 errorf = ErrorCalc(refvaluef,currentanglef); // same for every motor
efvanmarrewijk 43:e8f2193822b7 235
efvanmarrewijk 50:522bb6eebda6 236 pin3 = fabs(PIDcontrolf); // different pins for every motor
efvanmarrewijk 50:522bb6eebda6 237 pin2 = PIDcontrolf > 0.0f; // different pins for every motor
efvanmarrewijk 25:76e9e5597416 238 }
efvanmarrewijk 11:3efd6a324f16 239
efvanmarrewijk 16:720365110953 240 // Main program
efvanmarrewijk 11:3efd6a324f16 241 int main()
efvanmarrewijk 18:ca084c362855 242 {
efvanmarrewijk 26:b48708ed51ff 243 pc.baud(115200);
efvanmarrewijk 32:a5b411833d1e 244 pin3.period_us(15); // If you give a period on one pin, c++ gives all pins this period
efvanmarrewijk 31:91ad5b188bd9 245
efvanmarrewijk 43:e8f2193822b7 246 motorl.attach(turnl,dt);
efvanmarrewijk 50:522bb6eebda6 247 motorr.attach(turnr,dt);
efvanmarrewijk 50:522bb6eebda6 248 //motorf.attach(turnf,dt); // DONT TURN THIS ON, UNLESS THE CALIBRATION MODE WORKS
efvanmarrewijk 33:ec07e11676ec 249
efvanmarrewijk 26:b48708ed51ff 250 emergencybutton.rise(Emergency); //If the button is pressed, stop program
efvanmarrewijk 37:c61d7768c18a 251
efvanmarrewijk 16:720365110953 252 while (true)
efvanmarrewijk 25:76e9e5597416 253 {
efvanmarrewijk 50:522bb6eebda6 254 pc.printf("angle l/r/f: \t %f \t\t %f \t\t %f \t\t error l/r/f: \t %f \t\t %f \t\t %f\r\n",currentanglel,currentangler,currentanglef,errorl,errorr,errorf);
efvanmarrewijk 49:48363ca21a15 255
efvanmarrewijk 50:522bb6eebda6 256 //pc.printf("Kp: %f \t\t Kd: %f \t\t angle: %f \t\t error: %f\r\n",Kp,Kd,currentanglel,errorl);
efvanmarrewijk 43:e8f2193822b7 257 wait(0.1f);
Ramonwaninge 3:d39285fdd103 258 }
efvanmarrewijk 30:c4a3e868ef04 259 }