Laatste versie van Arnoud, Data wordt geplot
Dependencies: FastPWM MODSERIAL QEI mbed
main_demo.cpp@0:755bc7c0f555, 2018-10-31 (annotated)
- Committer:
- AppelSab
- Date:
- Wed Oct 31 10:44:10 2018 +0000
- Revision:
- 0:755bc7c0f555
- Child:
- 1:7afdfab34bf7
Demomodus werkt tm punt 2;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AppelSab | 0:755bc7c0f555 | 1 | #include "mbed.h" |
AppelSab | 0:755bc7c0f555 | 2 | #include "FastPWM.h" |
AppelSab | 0:755bc7c0f555 | 3 | #include "MODSERIAL.h" |
AppelSab | 0:755bc7c0f555 | 4 | #include "QEI.h" |
AppelSab | 0:755bc7c0f555 | 5 | #include "math.h" |
AppelSab | 0:755bc7c0f555 | 6 | |
AppelSab | 0:755bc7c0f555 | 7 | // -------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 8 | // ----------------- SET UP ------------------------- |
AppelSab | 0:755bc7c0f555 | 9 | QEI Encoder1(D11, D10, NC, 4200) ; // Encoder motor 1, (pin 1A, pin 1B, counts/rev) |
AppelSab | 0:755bc7c0f555 | 10 | QEI Encoder2(D9, D8, NC, 4200) ; // Encoder motor 2, (pin 2A, pin 2B, counts/rev) |
AppelSab | 0:755bc7c0f555 | 11 | DigitalOut directionM1(D4); |
AppelSab | 0:755bc7c0f555 | 12 | DigitalOut directionM2(D7); |
AppelSab | 0:755bc7c0f555 | 13 | FastPWM motor1_pwm(D5); |
AppelSab | 0:755bc7c0f555 | 14 | FastPWM motor2_pwm(D6); |
AppelSab | 0:755bc7c0f555 | 15 | MODSERIAL pc(USBTX, USBRX); |
AppelSab | 0:755bc7c0f555 | 16 | |
AppelSab | 0:755bc7c0f555 | 17 | // Tickers |
AppelSab | 0:755bc7c0f555 | 18 | Ticker Demo; |
AppelSab | 0:755bc7c0f555 | 19 | Ticker Write; |
AppelSab | 0:755bc7c0f555 | 20 | |
AppelSab | 0:755bc7c0f555 | 21 | // --------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 22 | // ----------------- GLOBAL VARIABLES ---------------- |
AppelSab | 0:755bc7c0f555 | 23 | volatile int counts1; |
AppelSab | 0:755bc7c0f555 | 24 | volatile int counts2; |
AppelSab | 0:755bc7c0f555 | 25 | volatile double theta1; |
AppelSab | 0:755bc7c0f555 | 26 | volatile double theta2; |
AppelSab | 0:755bc7c0f555 | 27 | const double pi = 3.14159265359; |
AppelSab | 0:755bc7c0f555 | 28 | volatile double error1; |
AppelSab | 0:755bc7c0f555 | 29 | volatile double error2; |
AppelSab | 0:755bc7c0f555 | 30 | double point1x = 200.0; |
AppelSab | 0:755bc7c0f555 | 31 | double point1y = 200.0; |
AppelSab | 0:755bc7c0f555 | 32 | double point2x = 350.0; |
AppelSab | 0:755bc7c0f555 | 33 | double point2y = 200.0; |
AppelSab | 0:755bc7c0f555 | 34 | double point3x = 350.0; |
AppelSab | 0:755bc7c0f555 | 35 | double point3y = 0.0; |
AppelSab | 0:755bc7c0f555 | 36 | double point4x = 200.0; |
AppelSab | 0:755bc7c0f555 | 37 | double point4y = 0.0; |
AppelSab | 0:755bc7c0f555 | 38 | int track; |
AppelSab | 0:755bc7c0f555 | 39 | const double x0 = 80.0; //zero x position after homing |
AppelSab | 0:755bc7c0f555 | 40 | const double y0 = 141.0; //zero y position after homing |
AppelSab | 0:755bc7c0f555 | 41 | volatile double setpointx = x0; |
AppelSab | 0:755bc7c0f555 | 42 | volatile double setpointy = y0; |
AppelSab | 0:755bc7c0f555 | 43 | volatile double U1; |
AppelSab | 0:755bc7c0f555 | 44 | volatile double U2; |
AppelSab | 0:755bc7c0f555 | 45 | |
AppelSab | 0:755bc7c0f555 | 46 | // Inverse Kinematics |
AppelSab | 0:755bc7c0f555 | 47 | volatile double q1_diff; |
AppelSab | 0:755bc7c0f555 | 48 | volatile double q2_diff; |
AppelSab | 0:755bc7c0f555 | 49 | double sq = 2.0; //to square numbers |
AppelSab | 0:755bc7c0f555 | 50 | const double L1 = 250.0; //length of the first link |
AppelSab | 0:755bc7c0f555 | 51 | const double L3 = 350.0; //length of the second link |
AppelSab | 0:755bc7c0f555 | 52 | |
AppelSab | 0:755bc7c0f555 | 53 | // Reference angles of the starting position |
AppelSab | 0:755bc7c0f555 | 54 | double q2_0 = pi + acos((pow(x0,sq)+pow(y0,sq)-pow(L1,sq)-pow(L3,sq))/(2.0*L1*L3)); |
AppelSab | 0:755bc7c0f555 | 55 | double q1_0 = atan(y0/x0)+acos((-pow(L3,sq)+pow(L1,sq)+pow(x0,sq)+pow(y0,sq))/(2.0*L1*sqrt(pow(x0,sq)+pow(y0,sq)))); |
AppelSab | 0:755bc7c0f555 | 56 | double q2_0_enc = q2_0 + q1_0; |
AppelSab | 0:755bc7c0f555 | 57 | |
AppelSab | 0:755bc7c0f555 | 58 | // -------------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 59 | // ---------------Read out encoders------------------------------------ |
AppelSab | 0:755bc7c0f555 | 60 | // -------------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 61 | double counts2angle1() |
AppelSab | 0:755bc7c0f555 | 62 | { |
AppelSab | 0:755bc7c0f555 | 63 | counts1 = Encoder1.getPulses(); // Counts of outputshaft of motor 1 |
AppelSab | 0:755bc7c0f555 | 64 | theta1 = -(double(counts1)/4200) * 2*pi; // Angle of outputshaft of motor 1 |
AppelSab | 0:755bc7c0f555 | 65 | return theta1; |
AppelSab | 0:755bc7c0f555 | 66 | } |
AppelSab | 0:755bc7c0f555 | 67 | |
AppelSab | 0:755bc7c0f555 | 68 | double counts2angle2() |
AppelSab | 0:755bc7c0f555 | 69 | { |
AppelSab | 0:755bc7c0f555 | 70 | counts2 = Encoder2.getPulses(); // Counts of outputshaft of motor 2 |
AppelSab | 0:755bc7c0f555 | 71 | theta2 = (double(counts2)/4200) * 2*pi; // Angle of outputshaft of motor 2 |
AppelSab | 0:755bc7c0f555 | 72 | return theta2; |
AppelSab | 0:755bc7c0f555 | 73 | } |
AppelSab | 0:755bc7c0f555 | 74 | |
AppelSab | 0:755bc7c0f555 | 75 | // ------------------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 76 | // -------------- Determine Setpoints -------------------------------------- |
AppelSab | 0:755bc7c0f555 | 77 | // ------------------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 78 | double determinedemosetx(double setpointx, double setpointy) |
AppelSab | 0:755bc7c0f555 | 79 | { |
AppelSab | 0:755bc7c0f555 | 80 | |
AppelSab | 0:755bc7c0f555 | 81 | |
AppelSab | 0:755bc7c0f555 | 82 | |
AppelSab | 0:755bc7c0f555 | 83 | |
AppelSab | 0:755bc7c0f555 | 84 | |
AppelSab | 0:755bc7c0f555 | 85 | /* |
AppelSab | 0:755bc7c0f555 | 86 | // Van punt 3 naar punt 4. |
AppelSab | 0:755bc7c0f555 | 87 | if (setpointy >= point3y - 0.3 && setpointx >= point3x - 0.3 && setpointy <= point3y + 0.3 && setpointx <= point3x + 0.3) |
AppelSab | 0:755bc7c0f555 | 88 | { |
AppelSab | 0:755bc7c0f555 | 89 | setpointx = setpointx - 0.1; // Van punt 1 naar punt 2 op dezelfde y blijven. |
AppelSab | 0:755bc7c0f555 | 90 | track = 34; |
AppelSab | 0:755bc7c0f555 | 91 | } |
AppelSab | 0:755bc7c0f555 | 92 | if (setpointy > point3y && track == 34) |
AppelSab | 0:755bc7c0f555 | 93 | { |
AppelSab | 0:755bc7c0f555 | 94 | setpointx = setpointx - 0.1; |
AppelSab | 0:755bc7c0f555 | 95 | } |
AppelSab | 0:755bc7c0f555 | 96 | |
AppelSab | 0:755bc7c0f555 | 97 | if (setpointy >= point4y - 0.3 && setpointx >= point4x - 0.3 && setpointy <= point4y + 0.3 && setpointx <= point4x + 0.3) |
AppelSab | 0:755bc7c0f555 | 98 | { |
AppelSab | 0:755bc7c0f555 | 99 | setpointx = 80.0; |
AppelSab | 0:755bc7c0f555 | 100 | } |
AppelSab | 0:755bc7c0f555 | 101 | */ |
AppelSab | 0:755bc7c0f555 | 102 | return setpointx; |
AppelSab | 0:755bc7c0f555 | 103 | } |
AppelSab | 0:755bc7c0f555 | 104 | |
AppelSab | 0:755bc7c0f555 | 105 | double determinedemosety(double &setpointx, double &setpointy) |
AppelSab | 0:755bc7c0f555 | 106 | { |
AppelSab | 0:755bc7c0f555 | 107 | // Van reference positie naar punt 1. |
AppelSab | 0:755bc7c0f555 | 108 | if(setpointy < point1y){ |
AppelSab | 0:755bc7c0f555 | 109 | setpointy = setpointy + 0.2; |
AppelSab | 0:755bc7c0f555 | 110 | } |
AppelSab | 0:755bc7c0f555 | 111 | |
AppelSab | 0:755bc7c0f555 | 112 | if (setpointx < point1x){ |
AppelSab | 0:755bc7c0f555 | 113 | setpointx = setpointx + 0.1; |
AppelSab | 0:755bc7c0f555 | 114 | } |
AppelSab | 0:755bc7c0f555 | 115 | |
AppelSab | 0:755bc7c0f555 | 116 | // Van punt 1 naar punt 2. |
AppelSab | 0:755bc7c0f555 | 117 | if (setpointy >= point1y - 0.3 && setpointx >= point1x - 0.3 && setpointy <= point1y + 0.3 && setpointx <= point1x + 0.3){ |
AppelSab | 0:755bc7c0f555 | 118 | setpointx = setpointx + 0.1; |
AppelSab | 0:755bc7c0f555 | 119 | setpointy = point2y; // Van punt 1 naar punt 2 op dezelfde y blijven. |
AppelSab | 0:755bc7c0f555 | 120 | track = 12; |
AppelSab | 0:755bc7c0f555 | 121 | } |
AppelSab | 0:755bc7c0f555 | 122 | if (setpointx < point2x && track == 12){ |
AppelSab | 0:755bc7c0f555 | 123 | setpointx = setpointx + 0.2; |
AppelSab | 0:755bc7c0f555 | 124 | setpointy = point2y; |
AppelSab | 0:755bc7c0f555 | 125 | } |
AppelSab | 0:755bc7c0f555 | 126 | |
AppelSab | 0:755bc7c0f555 | 127 | // Van punt 2 naar punt 3. |
AppelSab | 0:755bc7c0f555 | 128 | if (setpointx >= (point2x-0.2)) |
AppelSab | 0:755bc7c0f555 | 129 | { |
AppelSab | 0:755bc7c0f555 | 130 | setpointx = point3x; |
AppelSab | 0:755bc7c0f555 | 131 | setpointy = setpointy - 0.2; |
AppelSab | 0:755bc7c0f555 | 132 | track = 23; |
AppelSab | 0:755bc7c0f555 | 133 | } |
AppelSab | 0:755bc7c0f555 | 134 | if (setpointy > point3y && track == 23) |
AppelSab | 0:755bc7c0f555 | 135 | { |
AppelSab | 0:755bc7c0f555 | 136 | setpointx = point3x; // Van punt 1 naar punt 2 op dezelfde y blijven. |
AppelSab | 0:755bc7c0f555 | 137 | setpointy = setpointy - 0.2; |
AppelSab | 0:755bc7c0f555 | 138 | track = 23; |
AppelSab | 0:755bc7c0f555 | 139 | } |
AppelSab | 0:755bc7c0f555 | 140 | |
AppelSab | 0:755bc7c0f555 | 141 | |
AppelSab | 0:755bc7c0f555 | 142 | /* |
AppelSab | 0:755bc7c0f555 | 143 | // Van punt 3 naar punt 4. |
AppelSab | 0:755bc7c0f555 | 144 | if (setpointy >= point3y - 0.3 && setpointx >= point3x - 0.3 && setpointy <= point3y + 0.3 && setpointx <= point3x + 0.3) |
AppelSab | 0:755bc7c0f555 | 145 | { |
AppelSab | 0:755bc7c0f555 | 146 | setpointy = setpointy; |
AppelSab | 0:755bc7c0f555 | 147 | track = 34; |
AppelSab | 0:755bc7c0f555 | 148 | } |
AppelSab | 0:755bc7c0f555 | 149 | if (setpointy > point3y && track == 34) |
AppelSab | 0:755bc7c0f555 | 150 | { |
AppelSab | 0:755bc7c0f555 | 151 | setpointy = setpointy; |
AppelSab | 0:755bc7c0f555 | 152 | } |
AppelSab | 0:755bc7c0f555 | 153 | |
AppelSab | 0:755bc7c0f555 | 154 | |
AppelSab | 0:755bc7c0f555 | 155 | if (setpointy >= point4y - 0.3 && setpointx >= point4x - 0.3 && setpointy <= point4y + 0.3 && setpointx <= point4x + 0.3) |
AppelSab | 0:755bc7c0f555 | 156 | { |
AppelSab | 0:755bc7c0f555 | 157 | setpointy = 141.0; |
AppelSab | 0:755bc7c0f555 | 158 | } |
AppelSab | 0:755bc7c0f555 | 159 | */ |
AppelSab | 0:755bc7c0f555 | 160 | return setpointy; |
AppelSab | 0:755bc7c0f555 | 161 | |
AppelSab | 0:755bc7c0f555 | 162 | } |
AppelSab | 0:755bc7c0f555 | 163 | |
AppelSab | 0:755bc7c0f555 | 164 | // ----------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 165 | // --------------------------- PI controllers ---------------------- |
AppelSab | 0:755bc7c0f555 | 166 | // ----------------------------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 167 | double PI_controller1(double error1) |
AppelSab | 0:755bc7c0f555 | 168 | { |
AppelSab | 0:755bc7c0f555 | 169 | static double error_integral1 = 0; |
AppelSab | 0:755bc7c0f555 | 170 | |
AppelSab | 0:755bc7c0f555 | 171 | // Proportional part |
AppelSab | 0:755bc7c0f555 | 172 | double Kp1 = 3.95; // Kp (proportionele controller, nu nog een random waarde) |
AppelSab | 0:755bc7c0f555 | 173 | double u_p1 = Kp1*error1; // Voltage dat naar de motor gestuurd wordt (volgt uit error en Kp) |
AppelSab | 0:755bc7c0f555 | 174 | |
AppelSab | 0:755bc7c0f555 | 175 | // Integral part |
AppelSab | 0:755bc7c0f555 | 176 | double Ki1 = 6.0; // Ki (Integrale deel vd controller, nu nog een random waarde) |
AppelSab | 0:755bc7c0f555 | 177 | double Ts1 = 0.005; // Sample tijd, net zo vaak als de controller wordt aangeroepen (200 Hz, statemachine) |
AppelSab | 0:755bc7c0f555 | 178 | error_integral1 = error_integral1 + error1 * Ts1; |
AppelSab | 0:755bc7c0f555 | 179 | double u_i1 = Ki1 * error_integral1; |
AppelSab | 0:755bc7c0f555 | 180 | |
AppelSab | 0:755bc7c0f555 | 181 | // Sum |
AppelSab | 0:755bc7c0f555 | 182 | U1 = u_p1 + u_i1; |
AppelSab | 0:755bc7c0f555 | 183 | |
AppelSab | 0:755bc7c0f555 | 184 | // Return |
AppelSab | 0:755bc7c0f555 | 185 | return U1; |
AppelSab | 0:755bc7c0f555 | 186 | } |
AppelSab | 0:755bc7c0f555 | 187 | double PI_controller2(double error2) |
AppelSab | 0:755bc7c0f555 | 188 | { |
AppelSab | 0:755bc7c0f555 | 189 | static double error_integral2 = 0; |
AppelSab | 0:755bc7c0f555 | 190 | |
AppelSab | 0:755bc7c0f555 | 191 | // Proportional part |
AppelSab | 0:755bc7c0f555 | 192 | double Kp2 = 3.95; // Kp (proportionele controller, nu nog een random waarde) |
AppelSab | 0:755bc7c0f555 | 193 | double u_p2 = Kp2*error2; // Voltage dat naar de motor gestuurd wordt (volgt uit error en Kp) |
AppelSab | 0:755bc7c0f555 | 194 | |
AppelSab | 0:755bc7c0f555 | 195 | // Integral part |
AppelSab | 0:755bc7c0f555 | 196 | double Ki2 = 6.0; // Ki (Integrale deel vd controller, nu nog een random waarde) |
AppelSab | 0:755bc7c0f555 | 197 | double Ts2 = 0.005; // Sample tijd, net zo vaak als de controller wordt aangeroepen (200 Hz, statemachine) |
AppelSab | 0:755bc7c0f555 | 198 | error_integral2 = error_integral2 + error2 * Ts2; |
AppelSab | 0:755bc7c0f555 | 199 | double u_i2 = Ki2 * error_integral2; |
AppelSab | 0:755bc7c0f555 | 200 | |
AppelSab | 0:755bc7c0f555 | 201 | // Sum + |
AppelSab | 0:755bc7c0f555 | 202 | U2 = u_p2 + u_i2; |
AppelSab | 0:755bc7c0f555 | 203 | |
AppelSab | 0:755bc7c0f555 | 204 | // Return |
AppelSab | 0:755bc7c0f555 | 205 | return U2; |
AppelSab | 0:755bc7c0f555 | 206 | } |
AppelSab | 0:755bc7c0f555 | 207 | // ------------------------------------------------------------ |
AppelSab | 0:755bc7c0f555 | 208 | // ------------ Inverse Kinematics ---------------------------- |
AppelSab | 0:755bc7c0f555 | 209 | // ------------------------------------------------------------ |
AppelSab | 0:755bc7c0f555 | 210 | double makeAngleq1(double x, double y){ |
AppelSab | 0:755bc7c0f555 | 211 | double q1 = atan(y/x)+acos((-pow(L3,sq)+pow(L1,sq)+pow(x,sq)+pow(y,sq))/(2.0*L1*sqrt(pow(x,sq)+pow(y,sq)))); //angle of the first joint in the setpoint configuration |
AppelSab | 0:755bc7c0f555 | 212 | q1_diff = -2.0*(q1-q1_0); //the actual amount of radians that the motor has to turn in total to reach the setpoint |
AppelSab | 0:755bc7c0f555 | 213 | return q1_diff; |
AppelSab | 0:755bc7c0f555 | 214 | } |
AppelSab | 0:755bc7c0f555 | 215 | |
AppelSab | 0:755bc7c0f555 | 216 | double makeAngleq2(double x, double y){ |
AppelSab | 0:755bc7c0f555 | 217 | double q2 = -acos((pow(x,sq)+pow(y,sq)-pow(L1,sq)-pow(L3,sq))/(2.0*L1*L3)); //angle of the second joint in setpoint configuration |
AppelSab | 0:755bc7c0f555 | 218 | double q1 = atan(y/x)+acos((-pow(L3,sq)+pow(L1,sq)+pow(x,sq)+pow(y,sq))/(2.0*L1*sqrt(pow(x,sq)+pow(y,sq)))); //angle of the first joint in the setpoint configuration |
AppelSab | 0:755bc7c0f555 | 219 | double q2_motor = (pi - q2)+q1; //because q2 represents the angle at joint two and not at the motor a calculation has to be done |
AppelSab | 0:755bc7c0f555 | 220 | q2_diff = (2.0*(q2_motor - q2_0_enc))/(2.0*pi); //the actual amount of radians that the motor has to turn in total to reach the setpoint |
AppelSab | 0:755bc7c0f555 | 221 | return -q2_diff; |
AppelSab | 0:755bc7c0f555 | 222 | } |
AppelSab | 0:755bc7c0f555 | 223 | |
AppelSab | 0:755bc7c0f555 | 224 | |
AppelSab | 0:755bc7c0f555 | 225 | // ----------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 226 | // ------------ RUN MOTORS ----------------------- |
AppelSab | 0:755bc7c0f555 | 227 | // ----------------------------------------------- |
AppelSab | 0:755bc7c0f555 | 228 | void motoraansturing() |
AppelSab | 0:755bc7c0f555 | 229 | { |
AppelSab | 0:755bc7c0f555 | 230 | setpointx = determinedemosetx(setpointx, setpointy); |
AppelSab | 0:755bc7c0f555 | 231 | setpointy = determinedemosety(setpointx, setpointy); |
AppelSab | 0:755bc7c0f555 | 232 | q1_diff = makeAngleq1(setpointx, setpointy); |
AppelSab | 0:755bc7c0f555 | 233 | q2_diff = makeAngleq2(setpointx, setpointy); |
AppelSab | 0:755bc7c0f555 | 234 | |
AppelSab | 0:755bc7c0f555 | 235 | theta2 = counts2angle2(); |
AppelSab | 0:755bc7c0f555 | 236 | error2 = q2_diff - theta2; |
AppelSab | 0:755bc7c0f555 | 237 | theta1 = counts2angle1(); |
AppelSab | 0:755bc7c0f555 | 238 | error1 = q1_diff - theta1; // Setpoint error, te behalen setpoint minus de huidige positie van de as. |
AppelSab | 0:755bc7c0f555 | 239 | |
AppelSab | 0:755bc7c0f555 | 240 | U1 = PI_controller1(error1); // Voltage dat naar de motor gestuurd wordt. |
AppelSab | 0:755bc7c0f555 | 241 | U2 = PI_controller2(error2); |
AppelSab | 0:755bc7c0f555 | 242 | |
AppelSab | 0:755bc7c0f555 | 243 | motor1_pwm.write(fabs(U1)); // Motor aansturen |
AppelSab | 0:755bc7c0f555 | 244 | directionM1 = U1 > 0.0f; // Richting van de motor bepalen |
AppelSab | 0:755bc7c0f555 | 245 | motor2_pwm.write(fabs(U2)); |
AppelSab | 0:755bc7c0f555 | 246 | directionM2 = U2 > 0.0f; |
AppelSab | 0:755bc7c0f555 | 247 | } |
AppelSab | 0:755bc7c0f555 | 248 | |
AppelSab | 0:755bc7c0f555 | 249 | |
AppelSab | 0:755bc7c0f555 | 250 | void rundemo() |
AppelSab | 0:755bc7c0f555 | 251 | { |
AppelSab | 0:755bc7c0f555 | 252 | motoraansturing(); |
AppelSab | 0:755bc7c0f555 | 253 | } |
AppelSab | 0:755bc7c0f555 | 254 | |
AppelSab | 0:755bc7c0f555 | 255 | |
AppelSab | 0:755bc7c0f555 | 256 | int main() |
AppelSab | 0:755bc7c0f555 | 257 | { |
AppelSab | 0:755bc7c0f555 | 258 | pc.baud(115200); |
AppelSab | 0:755bc7c0f555 | 259 | motor1_pwm.period_us(60); // Period is 60 microseconde |
AppelSab | 0:755bc7c0f555 | 260 | motor2_pwm.period_us(60); |
AppelSab | 0:755bc7c0f555 | 261 | Demo.attach(&rundemo, 0.005f); |
AppelSab | 0:755bc7c0f555 | 262 | |
AppelSab | 0:755bc7c0f555 | 263 | while (true) { |
AppelSab | 0:755bc7c0f555 | 264 | |
AppelSab | 0:755bc7c0f555 | 265 | } |
AppelSab | 0:755bc7c0f555 | 266 | } |