RobotArm_ Biorobotics project.

Dependencies:   PID QEI RemoteIR Servo mbed

Fork of Biorobotics_Motor_Control by Bram S

Committer:
jordymorsinkhof
Date:
Thu Oct 26 19:48:03 2017 +0000
Revision:
3:98ea6afa0cf2
Parent:
2:684d5cf2f683
Child:
4:c45eaa904b09
Program met programma van rene ( nog niet werkend) ; q1set is nog niet gelijk gesteld aan posref;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BramS23 0:6c0f87177797 1 #include "mbed.h"
BramS23 0:6c0f87177797 2 #include "QEI.h"
jordymorsinkhof 2:684d5cf2f683 3 #include "PID.h"
jordymorsinkhof 2:684d5cf2f683 4 #include "ReceiverIR.h"
jordymorsinkhof 2:684d5cf2f683 5 #include "Servo.h"
jordymorsinkhof 3:98ea6afa0cf2 6 #include <iostream>
jordymorsinkhof 3:98ea6afa0cf2 7 #include <string>
jordymorsinkhof 3:98ea6afa0cf2 8 #include <math.h>
jordymorsinkhof 2:684d5cf2f683 9
jordymorsinkhof 2:684d5cf2f683 10 ReceiverIR ir_rx(D2);
jordymorsinkhof 2:684d5cf2f683 11
jordymorsinkhof 2:684d5cf2f683 12 AnalogIn PotMeter1(A0);
jordymorsinkhof 2:684d5cf2f683 13 AnalogIn PotMeter2(A1);
BramS23 0:6c0f87177797 14 InterruptIn Button(PTA4);
BramS23 0:6c0f87177797 15
BramS23 0:6c0f87177797 16 PwmOut MotorThrottle1(D5);
BramS23 0:6c0f87177797 17 PwmOut MotorThrottle2(D6);
BramS23 0:6c0f87177797 18 DigitalOut MotorDirection1(D4);
BramS23 0:6c0f87177797 19 DigitalOut MotorDirection2(D7);
jordymorsinkhof 2:684d5cf2f683 20 DigitalOut servo(D3);
BramS23 0:6c0f87177797 21
jordymorsinkhof 2:684d5cf2f683 22 DigitalIn EndSwitch1(D9);
jordymorsinkhof 2:684d5cf2f683 23 DigitalIn EndSwitch2(D8);
jordymorsinkhof 2:684d5cf2f683 24
jordymorsinkhof 2:684d5cf2f683 25 QEI EncoderMotor1(D12,D13,NC,4200);
jordymorsinkhof 2:684d5cf2f683 26 QEI EncoderMotor2(D10,D11,NC,4200);
jordymorsinkhof 2:684d5cf2f683 27
jordymorsinkhof 2:684d5cf2f683 28 Ticker ControlTicker;
jordymorsinkhof 2:684d5cf2f683 29 Ticker GetRefTicker;
jordymorsinkhof 2:684d5cf2f683 30
jordymorsinkhof 2:684d5cf2f683 31 float Interval=0.02f;
jordymorsinkhof 3:98ea6afa0cf2 32 float pi=3.14159265359;
jordymorsinkhof 3:98ea6afa0cf2 33
jordymorsinkhof 2:684d5cf2f683 34 PID controller1(20.0f,0.0f,0.001f, Interval);
jordymorsinkhof 2:684d5cf2f683 35 PID controller2(20.0f,0.0f,0.002f, Interval);
jordymorsinkhof 2:684d5cf2f683 36
jordymorsinkhof 3:98ea6afa0cf2 37 //G: elsewhere given values
jordymorsinkhof 3:98ea6afa0cf2 38 float Gq1 = 0; //from homing
jordymorsinkhof 3:98ea6afa0cf2 39 float Gq2 = 0; //from homing
jordymorsinkhof 3:98ea6afa0cf2 40 float GXset = 47.5; //from EMG in cm
jordymorsinkhof 3:98ea6afa0cf2 41 float GYset = 11; //from EMG in cm
jordymorsinkhof 3:98ea6afa0cf2 42
jordymorsinkhof 3:98ea6afa0cf2 43 //Constant robot parameters
jordymorsinkhof 3:98ea6afa0cf2 44 const float L1 = 27.5; //length arm 1 in cm
jordymorsinkhof 3:98ea6afa0cf2 45 const float L2 = 32; //length arm 2 in cm
jordymorsinkhof 3:98ea6afa0cf2 46
jordymorsinkhof 3:98ea6afa0cf2 47
jordymorsinkhof 2:684d5cf2f683 48 RemoteIR::Format format;
jordymorsinkhof 2:684d5cf2f683 49 uint8_t buf[4];
BramS23 0:6c0f87177797 50
BramS23 0:6c0f87177797 51 Serial pc(PTB17,PTB16);
BramS23 0:6c0f87177797 52
jordymorsinkhof 2:684d5cf2f683 53 float PosRef1=1.0f;
jordymorsinkhof 2:684d5cf2f683 54 float PosRef2=1.0f;
jordymorsinkhof 2:684d5cf2f683 55
jordymorsinkhof 3:98ea6afa0cf2 56 //Function INPUT: q1, q2. OUTPUT: Xcurr, Ycurr
jordymorsinkhof 3:98ea6afa0cf2 57 void Brock(float q1, float q2, float& Xcurr, float& Ycurr)
jordymorsinkhof 3:98ea6afa0cf2 58 {
jordymorsinkhof 3:98ea6afa0cf2 59 //Position of end-effector in base frame when q1 = q2 = 0 to use in He0(0)
jordymorsinkhof 3:98ea6afa0cf2 60
jordymorsinkhof 3:98ea6afa0cf2 61 float He1[9];
jordymorsinkhof 3:98ea6afa0cf2 62
jordymorsinkhof 3:98ea6afa0cf2 63 He1[0] = cos(q1 + q2);
jordymorsinkhof 3:98ea6afa0cf2 64 He1[1] = -sin(q1 +q2);
jordymorsinkhof 3:98ea6afa0cf2 65 He1[2] = L2*cos(q1 + q2) + L1*cos(q1);
jordymorsinkhof 3:98ea6afa0cf2 66 He1[3] = sin(q1 + q2);
jordymorsinkhof 3:98ea6afa0cf2 67 He1[4] = cos(q1 + q2);
jordymorsinkhof 3:98ea6afa0cf2 68 He1[5] = L2*sin(q1 + q2) + L1*sin(q1);
jordymorsinkhof 3:98ea6afa0cf2 69 He1[6] = 0;
jordymorsinkhof 3:98ea6afa0cf2 70 He1[7] = 0;
jordymorsinkhof 3:98ea6afa0cf2 71 He1[8] = 1;
jordymorsinkhof 3:98ea6afa0cf2 72
jordymorsinkhof 3:98ea6afa0cf2 73 // print He1 to check the matrix
jordymorsinkhof 3:98ea6afa0cf2 74 pc.printf("He1 = [\n\r");
jordymorsinkhof 3:98ea6afa0cf2 75
jordymorsinkhof 3:98ea6afa0cf2 76 for (int i=0; i<=8; i++){
jordymorsinkhof 2:684d5cf2f683 77
jordymorsinkhof 3:98ea6afa0cf2 78 pc.printf("%.2f ",He1[i]);
jordymorsinkhof 3:98ea6afa0cf2 79 if (i==2){
jordymorsinkhof 3:98ea6afa0cf2 80 pc.printf("\n\r");}
jordymorsinkhof 3:98ea6afa0cf2 81 else if (i==5){
jordymorsinkhof 3:98ea6afa0cf2 82 pc.printf("\n\r");}
jordymorsinkhof 3:98ea6afa0cf2 83 }
jordymorsinkhof 3:98ea6afa0cf2 84 pc.printf("]\n\r" );
jordymorsinkhof 3:98ea6afa0cf2 85
jordymorsinkhof 3:98ea6afa0cf2 86 //Translation from base frame to board frame SO FROM NOW ON ALL EXPRESSED IN BOARD FRAME
jordymorsinkhof 3:98ea6afa0cf2 87 He1[2] = He1[2] - 12; //12 = x distance from base frame to board frame
jordymorsinkhof 3:98ea6afa0cf2 88 He1[5] = He1[5] + 11; //11 = y distance from base frame to board frame
jordymorsinkhof 3:98ea6afa0cf2 89
jordymorsinkhof 3:98ea6afa0cf2 90 pc.printf("The old value of Xcurr was %f, old Ycurr was %f\n\r", Xcurr, Ycurr);
jordymorsinkhof 3:98ea6afa0cf2 91 Xcurr = He1[2];
jordymorsinkhof 3:98ea6afa0cf2 92 Ycurr = He1[5];
jordymorsinkhof 3:98ea6afa0cf2 93 pc.printf("The new value of Xcurr is %f, new Ycurr is %f\n\r", Xcurr, Ycurr);
jordymorsinkhof 3:98ea6afa0cf2 94
jordymorsinkhof 3:98ea6afa0cf2 95 // print He0 to check the matrix
jordymorsinkhof 3:98ea6afa0cf2 96 pc.printf("\n\r He0 = [\n\r");
jordymorsinkhof 3:98ea6afa0cf2 97 for (int i=0; i<=8; i++){
jordymorsinkhof 3:98ea6afa0cf2 98
jordymorsinkhof 3:98ea6afa0cf2 99 pc.printf("%.2f ",He1[i]);
jordymorsinkhof 3:98ea6afa0cf2 100 if (i==2){
jordymorsinkhof 3:98ea6afa0cf2 101 pc.printf("\n\r");}
jordymorsinkhof 3:98ea6afa0cf2 102 else if (i==5){
jordymorsinkhof 3:98ea6afa0cf2 103 pc.printf("\n\r");}
jordymorsinkhof 3:98ea6afa0cf2 104 }
jordymorsinkhof 3:98ea6afa0cf2 105 pc.printf("]\n\r" );
jordymorsinkhof 3:98ea6afa0cf2 106 }
jordymorsinkhof 3:98ea6afa0cf2 107
jordymorsinkhof 3:98ea6afa0cf2 108
jordymorsinkhof 3:98ea6afa0cf2 109 //Function INPUT: q1, q2, Xset, Yset, Xcurr, Ycurr. OUTPUT: tau1, tau2
jordymorsinkhof 3:98ea6afa0cf2 110 void ErrorToTau(float q1, float q2, float Xcurr, float Ycurr, float Xset, float Yset, float& tau1, float& tau2)
jordymorsinkhof 3:98ea6afa0cf2 111 {
jordymorsinkhof 3:98ea6afa0cf2 112 //The parameters k and b are free controller parameters that will determine how fast the arm moves towards the setpoint.
jordymorsinkhof 3:98ea6afa0cf2 113 float k = 0.5; //stiffness
jordymorsinkhof 3:98ea6afa0cf2 114
jordymorsinkhof 3:98ea6afa0cf2 115 //Current position = VARIABLE EXPRESSED IN BASE FRAME
jordymorsinkhof 3:98ea6afa0cf2 116 float rx1 = 0; //x coordinate of joint 1
jordymorsinkhof 3:98ea6afa0cf2 117 float ry1 = 0; //y coordinate of joint 1
jordymorsinkhof 3:98ea6afa0cf2 118 float rx2 = cos(q1)*L1; //x coordinate of joint 2
jordymorsinkhof 3:98ea6afa0cf2 119 float ry2 = sin(q1)*L1; //y coordinate of joint 2
jordymorsinkhof 3:98ea6afa0cf2 120 float rxe = rx2 + cos(q1+q2)*L2; //x coordinate of end-effector
jordymorsinkhof 3:98ea6afa0cf2 121 float rye = ry2 + sin(q1+q2)*L2; //y coordinate of end-effector
jordymorsinkhof 3:98ea6afa0cf2 122 pc.printf("Current position: rx1 = %f, ry1 = %f, rx2 = %f, ry2 = %f, rxe = %f, rye = %f\n\r", rx1, ry1, rx2, ry2, rxe, rye);
jordymorsinkhof 3:98ea6afa0cf2 123
jordymorsinkhof 3:98ea6afa0cf2 124 //Define transposed Jacobian J_T [3x2]
jordymorsinkhof 3:98ea6afa0cf2 125 float J_T1 = 1;
jordymorsinkhof 3:98ea6afa0cf2 126 float J_T2 = ry2;
jordymorsinkhof 3:98ea6afa0cf2 127 float J_T3 = -rx2;
jordymorsinkhof 3:98ea6afa0cf2 128 float J_T4 = 1;
jordymorsinkhof 3:98ea6afa0cf2 129 float J_T5 = rye;
jordymorsinkhof 3:98ea6afa0cf2 130 float J_T6 = -rxe;
jordymorsinkhof 3:98ea6afa0cf2 131
jordymorsinkhof 3:98ea6afa0cf2 132 //Define spring force
jordymorsinkhof 3:98ea6afa0cf2 133 float Fsprx = k*(Xset - Xcurr);
jordymorsinkhof 3:98ea6afa0cf2 134 float Fspry = k*(Yset - Ycurr);
jordymorsinkhof 3:98ea6afa0cf2 135 pc.printf("The new value of Fsprx is %f, new Fspry is %f\n\r", Fsprx, Fspry);
jordymorsinkhof 3:98ea6afa0cf2 136
jordymorsinkhof 3:98ea6afa0cf2 137 //Define wrench Wspr = (tau Fx Fy) = (rxFx - rxFy Fx Fy)
jordymorsinkhof 3:98ea6afa0cf2 138 float Wspr1 = Ycurr*Fsprx - Xcurr*Fspry;
jordymorsinkhof 3:98ea6afa0cf2 139 float Wspr2 = Fsprx;
jordymorsinkhof 3:98ea6afa0cf2 140 float Wspr3 = Fspry;
jordymorsinkhof 3:98ea6afa0cf2 141
jordymorsinkhof 3:98ea6afa0cf2 142 //End-effector wrench to forces and torques on the joints using the Jacobian (transposed)
jordymorsinkhof 3:98ea6afa0cf2 143 pc.printf("The old value of tau1 was %f, old tau2 was %f\n\r", tau1, tau2);
jordymorsinkhof 3:98ea6afa0cf2 144 tau1 = J_T1*Wspr1+J_T2*Wspr2+J_T3*Wspr3;
jordymorsinkhof 3:98ea6afa0cf2 145 tau2 = J_T4*Wspr1+J_T5*Wspr2+J_T6*Wspr3;
jordymorsinkhof 3:98ea6afa0cf2 146 pc.printf("The new value of tau1 is %f, new tau2 is %f\n\r", tau1, tau2);
jordymorsinkhof 3:98ea6afa0cf2 147 }
jordymorsinkhof 3:98ea6afa0cf2 148
jordymorsinkhof 3:98ea6afa0cf2 149
jordymorsinkhof 3:98ea6afa0cf2 150 //Overall function which only needs inputs
jordymorsinkhof 3:98ea6afa0cf2 151 void SuperFunction(float q1, float q2, float Xset, float Yset, float& q1set, float& q2set)
jordymorsinkhof 3:98ea6afa0cf2 152 {
jordymorsinkhof 3:98ea6afa0cf2 153 //start values
jordymorsinkhof 3:98ea6afa0cf2 154 float tau1; //previous values are irrelevant
jordymorsinkhof 3:98ea6afa0cf2 155 float tau2; //previous values are irrelevant
jordymorsinkhof 3:98ea6afa0cf2 156 float omg1; //previous values are irrelevant
jordymorsinkhof 3:98ea6afa0cf2 157 float omg2; //previous values are irrelevant
jordymorsinkhof 3:98ea6afa0cf2 158 float Xcurr; //new value is calculated, old replaced
jordymorsinkhof 3:98ea6afa0cf2 159 float Ycurr; //new value is calculated, old replaced
jordymorsinkhof 3:98ea6afa0cf2 160
jordymorsinkhof 3:98ea6afa0cf2 161 float T = 0.01; //Loop period
jordymorsinkhof 3:98ea6afa0cf2 162 float b = 200; //damping
jordymorsinkhof 3:98ea6afa0cf2 163
jordymorsinkhof 3:98ea6afa0cf2 164 // Call function to calculate Xcurr and Ycurr from q1 and q2
jordymorsinkhof 3:98ea6afa0cf2 165 Brock(q1, q2, Xcurr, Ycurr);
jordymorsinkhof 3:98ea6afa0cf2 166
jordymorsinkhof 3:98ea6afa0cf2 167 // Call function to calculate tau1 and tau2 from X,Ycurr and X,Yset
jordymorsinkhof 3:98ea6afa0cf2 168 ErrorToTau(q1, q2, Xcurr, Ycurr, Xset, Yset, tau1, tau2);
jordymorsinkhof 3:98ea6afa0cf2 169
jordymorsinkhof 3:98ea6afa0cf2 170 //torque to joint velocity
jordymorsinkhof 3:98ea6afa0cf2 171 pc.printf("The old value of omg1 was %f, old omg2 was %f\n\r", omg1, omg2);
jordymorsinkhof 3:98ea6afa0cf2 172 omg1 = tau1/b;
jordymorsinkhof 3:98ea6afa0cf2 173 omg2 = tau2/b;
jordymorsinkhof 3:98ea6afa0cf2 174 pc.printf("The new value of omg1 is %f, new omg2 is %f\n\r", omg1, omg2);
jordymorsinkhof 3:98ea6afa0cf2 175
jordymorsinkhof 3:98ea6afa0cf2 176 //joint velocity to angles q1 and q2, where you define new q1 and q2 based on previous q1 and q2
jordymorsinkhof 3:98ea6afa0cf2 177 q1set = q1set + omg1*T;
jordymorsinkhof 3:98ea6afa0cf2 178 q2set = q2set + omg2*T;
jordymorsinkhof 3:98ea6afa0cf2 179 }
jordymorsinkhof 2:684d5cf2f683 180
jordymorsinkhof 2:684d5cf2f683 181
jordymorsinkhof 2:684d5cf2f683 182 void HomingLoop(){
jordymorsinkhof 2:684d5cf2f683 183
jordymorsinkhof 2:684d5cf2f683 184 EndSwitch1.mode(PullUp);
jordymorsinkhof 2:684d5cf2f683 185 EndSwitch2.mode(PullUp);
jordymorsinkhof 2:684d5cf2f683 186
jordymorsinkhof 2:684d5cf2f683 187 MotorThrottle1=0.1f;
jordymorsinkhof 2:684d5cf2f683 188 MotorThrottle2=0.2f;
jordymorsinkhof 2:684d5cf2f683 189
jordymorsinkhof 2:684d5cf2f683 190 MotorDirection1=1;
jordymorsinkhof 2:684d5cf2f683 191 MotorDirection2=1;
jordymorsinkhof 2:684d5cf2f683 192
jordymorsinkhof 2:684d5cf2f683 193 bool dummy1=0;
jordymorsinkhof 2:684d5cf2f683 194 bool dummy2=0;
jordymorsinkhof 2:684d5cf2f683 195
jordymorsinkhof 2:684d5cf2f683 196 while(EndSwitch1.read()|EndSwitch2.read()){
jordymorsinkhof 2:684d5cf2f683 197 if((EndSwitch1.read()==0)&&(dummy1==0)){
jordymorsinkhof 2:684d5cf2f683 198 MotorThrottle1=0.0f;
jordymorsinkhof 2:684d5cf2f683 199 dummy1=1;
jordymorsinkhof 2:684d5cf2f683 200 }
jordymorsinkhof 2:684d5cf2f683 201 if((EndSwitch2.read()==0)&&(dummy2==0)){
jordymorsinkhof 2:684d5cf2f683 202 MotorThrottle2=0.0f;
jordymorsinkhof 2:684d5cf2f683 203 dummy2=1;
jordymorsinkhof 2:684d5cf2f683 204 }
jordymorsinkhof 2:684d5cf2f683 205 }
jordymorsinkhof 2:684d5cf2f683 206 MotorThrottle1=0.0f;
jordymorsinkhof 2:684d5cf2f683 207 MotorThrottle2=0.0f;
jordymorsinkhof 2:684d5cf2f683 208 EncoderMotor1.reset();
jordymorsinkhof 2:684d5cf2f683 209 EncoderMotor2.reset();
jordymorsinkhof 2:684d5cf2f683 210 }
jordymorsinkhof 2:684d5cf2f683 211
jordymorsinkhof 2:684d5cf2f683 212 void ControlLoop(){
jordymorsinkhof 2:684d5cf2f683 213
jordymorsinkhof 2:684d5cf2f683 214 float Pos1 = EncoderMotor1.getPulses()/4200.0f*2.0f*pi; //Motorpos. in radians
jordymorsinkhof 2:684d5cf2f683 215 float Pos2 = EncoderMotor2.getPulses()/4200.0f*2.0f*pi; //Motorpos. in radians
jordymorsinkhof 2:684d5cf2f683 216 float error1 = PosRef1 - Pos1;
jordymorsinkhof 2:684d5cf2f683 217 float error2 = PosRef2 - Pos2;
jordymorsinkhof 2:684d5cf2f683 218
jordymorsinkhof 2:684d5cf2f683 219 // PID input
jordymorsinkhof 2:684d5cf2f683 220 controller1.setSetPoint(PosRef1);
jordymorsinkhof 2:684d5cf2f683 221 controller2.setSetPoint(PosRef2);
jordymorsinkhof 2:684d5cf2f683 222
jordymorsinkhof 2:684d5cf2f683 223 controller1.setProcessValue(Pos1);
jordymorsinkhof 2:684d5cf2f683 224 controller2.setProcessValue(Pos2);
jordymorsinkhof 2:684d5cf2f683 225
jordymorsinkhof 2:684d5cf2f683 226 // PID output
jordymorsinkhof 2:684d5cf2f683 227 float OutPut1=controller1.compute();
jordymorsinkhof 2:684d5cf2f683 228 float OutPut2=controller2.compute();
jordymorsinkhof 2:684d5cf2f683 229
jordymorsinkhof 2:684d5cf2f683 230 // Direction handling
jordymorsinkhof 2:684d5cf2f683 231 float Direction1=0;
jordymorsinkhof 2:684d5cf2f683 232 float Direction2=0;
jordymorsinkhof 2:684d5cf2f683 233
jordymorsinkhof 2:684d5cf2f683 234 if(OutPut1<0){
jordymorsinkhof 2:684d5cf2f683 235 Direction1=1;
jordymorsinkhof 2:684d5cf2f683 236 }
jordymorsinkhof 2:684d5cf2f683 237 if(OutPut2<0){
jordymorsinkhof 2:684d5cf2f683 238 Direction2=1;
jordymorsinkhof 2:684d5cf2f683 239 }
jordymorsinkhof 2:684d5cf2f683 240
jordymorsinkhof 2:684d5cf2f683 241 OutPut1=fabs(OutPut1);
jordymorsinkhof 2:684d5cf2f683 242 OutPut2=fabs(OutPut2);
jordymorsinkhof 2:684d5cf2f683 243
jordymorsinkhof 2:684d5cf2f683 244 // Output schrijven
jordymorsinkhof 2:684d5cf2f683 245 MotorThrottle1.write(OutPut1);
jordymorsinkhof 2:684d5cf2f683 246 MotorThrottle2.write(OutPut2);
jordymorsinkhof 2:684d5cf2f683 247 MotorDirection1=Direction1;
jordymorsinkhof 2:684d5cf2f683 248 MotorDirection2=Direction2;
BramS23 0:6c0f87177797 249 }
BramS23 0:6c0f87177797 250
BramS23 0:6c0f87177797 251
jordymorsinkhof 2:684d5cf2f683 252 void PickUp(){
jordymorsinkhof 2:684d5cf2f683 253
jordymorsinkhof 2:684d5cf2f683 254 }
jordymorsinkhof 2:684d5cf2f683 255
jordymorsinkhof 2:684d5cf2f683 256 void LayDown(){
jordymorsinkhof 2:684d5cf2f683 257
jordymorsinkhof 2:684d5cf2f683 258
jordymorsinkhof 2:684d5cf2f683 259 }
jordymorsinkhof 2:684d5cf2f683 260
jordymorsinkhof 2:684d5cf2f683 261
jordymorsinkhof 2:684d5cf2f683 262 void RemoteController(){
jordymorsinkhof 2:684d5cf2f683 263
jordymorsinkhof 2:684d5cf2f683 264 int bitcount;
jordymorsinkhof 2:684d5cf2f683 265
jordymorsinkhof 2:684d5cf2f683 266
jordymorsinkhof 2:684d5cf2f683 267 bitcount = ir_rx.getData(&format, buf, sizeof(buf) * 8);
jordymorsinkhof 2:684d5cf2f683 268 int state = buf[2];
jordymorsinkhof 2:684d5cf2f683 269 switch(state)
jordymorsinkhof 2:684d5cf2f683 270 {
jordymorsinkhof 2:684d5cf2f683 271 case 22: //1
jordymorsinkhof 3:98ea6afa0cf2 272 pc.printf("1\n\r");
jordymorsinkhof 2:684d5cf2f683 273 break;
jordymorsinkhof 2:684d5cf2f683 274 case 25: //1
jordymorsinkhof 3:98ea6afa0cf2 275 pc.printf("2\n\r");
jordymorsinkhof 2:684d5cf2f683 276 break;
jordymorsinkhof 2:684d5cf2f683 277 case 13: //1
jordymorsinkhof 3:98ea6afa0cf2 278 pc.printf("3\n\r");
jordymorsinkhof 2:684d5cf2f683 279 break;
jordymorsinkhof 2:684d5cf2f683 280 case 12: //1
jordymorsinkhof 3:98ea6afa0cf2 281 pc.printf("4\n\r");
jordymorsinkhof 2:684d5cf2f683 282 break;
jordymorsinkhof 2:684d5cf2f683 283 case 24: //1
jordymorsinkhof 3:98ea6afa0cf2 284 pc.printf("5\n\r");
jordymorsinkhof 2:684d5cf2f683 285 ControlTicker.detach();
jordymorsinkhof 2:684d5cf2f683 286 MotorThrottle1=0.0f;
jordymorsinkhof 2:684d5cf2f683 287 MotorThrottle2=0.0f;
jordymorsinkhof 2:684d5cf2f683 288 PickUp();
jordymorsinkhof 2:684d5cf2f683 289 ControlTicker.attach(&ControlLoop, Interval);
jordymorsinkhof 2:684d5cf2f683 290 break;
jordymorsinkhof 2:684d5cf2f683 291 case 94: //1
jordymorsinkhof 3:98ea6afa0cf2 292 pc.printf("6\n\r");
jordymorsinkhof 2:684d5cf2f683 293 break;
jordymorsinkhof 2:684d5cf2f683 294 case 8: //1
jordymorsinkhof 3:98ea6afa0cf2 295 pc.printf("7\n\r");
jordymorsinkhof 2:684d5cf2f683 296 break;
jordymorsinkhof 2:684d5cf2f683 297 case 28: //1
jordymorsinkhof 3:98ea6afa0cf2 298 pc.printf("8\n\r");
jordymorsinkhof 2:684d5cf2f683 299 ControlTicker.detach();
jordymorsinkhof 2:684d5cf2f683 300 MotorThrottle1=0.0f;
jordymorsinkhof 2:684d5cf2f683 301 MotorThrottle2=0.0f;
jordymorsinkhof 2:684d5cf2f683 302 LayDown();
jordymorsinkhof 2:684d5cf2f683 303 ControlTicker.attach(&ControlLoop, Interval);
jordymorsinkhof 2:684d5cf2f683 304 break;
jordymorsinkhof 2:684d5cf2f683 305 case 90: //1
jordymorsinkhof 3:98ea6afa0cf2 306 pc.printf("9\n\r");
jordymorsinkhof 2:684d5cf2f683 307 break;
jordymorsinkhof 2:684d5cf2f683 308 case 70: //1
jordymorsinkhof 2:684d5cf2f683 309 pc.printf("Boven\n\r");
jordymorsinkhof 2:684d5cf2f683 310 PosRef2=PosRef2-0.1f;
jordymorsinkhof 2:684d5cf2f683 311 pc.printf("%f\n\r", PosRef2);
jordymorsinkhof 2:684d5cf2f683 312 break;
jordymorsinkhof 2:684d5cf2f683 313 case 21: //1
jordymorsinkhof 2:684d5cf2f683 314 pc.printf("Onder\n\r");
jordymorsinkhof 2:684d5cf2f683 315 PosRef2=PosRef2+0.1f;
jordymorsinkhof 2:684d5cf2f683 316 pc.printf("%f\n\r", PosRef2);
jordymorsinkhof 2:684d5cf2f683 317 break;
jordymorsinkhof 2:684d5cf2f683 318 case 68: //1
jordymorsinkhof 2:684d5cf2f683 319 pc.printf("Links\n\r");
jordymorsinkhof 2:684d5cf2f683 320 PosRef1=PosRef1+0.1f;
jordymorsinkhof 2:684d5cf2f683 321 pc.printf("%f\n\r", PosRef1);
jordymorsinkhof 2:684d5cf2f683 322 break;
jordymorsinkhof 2:684d5cf2f683 323 case 67: //1
jordymorsinkhof 2:684d5cf2f683 324 pc.printf("Rechts\n\r");
jordymorsinkhof 2:684d5cf2f683 325 PosRef1=PosRef1-0.1f;
jordymorsinkhof 2:684d5cf2f683 326 pc.printf("%f\n\r", PosRef1);
jordymorsinkhof 2:684d5cf2f683 327 break;
jordymorsinkhof 2:684d5cf2f683 328 case 64: //1
jordymorsinkhof 2:684d5cf2f683 329 pc.printf("OK\n\r");
jordymorsinkhof 2:684d5cf2f683 330 ControlTicker.detach();
jordymorsinkhof 2:684d5cf2f683 331 MotorThrottle1=0.0f;
jordymorsinkhof 2:684d5cf2f683 332 MotorThrottle2=0.0f;
jordymorsinkhof 2:684d5cf2f683 333 HomingLoop();
jordymorsinkhof 2:684d5cf2f683 334 ControlTicker.attach(&ControlLoop, Interval);
jordymorsinkhof 2:684d5cf2f683 335
jordymorsinkhof 2:684d5cf2f683 336 break;
jordymorsinkhof 2:684d5cf2f683 337 default:
jordymorsinkhof 2:684d5cf2f683 338 break;
jordymorsinkhof 2:684d5cf2f683 339 }
jordymorsinkhof 2:684d5cf2f683 340 }
jordymorsinkhof 2:684d5cf2f683 341
jordymorsinkhof 2:684d5cf2f683 342
jordymorsinkhof 2:684d5cf2f683 343
jordymorsinkhof 2:684d5cf2f683 344
jordymorsinkhof 2:684d5cf2f683 345 void DeterminePosRef(){
jordymorsinkhof 2:684d5cf2f683 346 PosRef1=2*pi*PotMeter1.read(); // Reference in Rad
jordymorsinkhof 2:684d5cf2f683 347 PosRef2=2*pi*PotMeter2.read(); // Reference in Rad
jordymorsinkhof 2:684d5cf2f683 348 }
jordymorsinkhof 2:684d5cf2f683 349
BramS23 0:6c0f87177797 350 int main() {
BramS23 0:6c0f87177797 351 pc.baud(115200);
BramS23 0:6c0f87177797 352 pc.printf("startup");
jordymorsinkhof 2:684d5cf2f683 353
jordymorsinkhof 2:684d5cf2f683 354 controller1.setInputLimits(0.5f,2.0f*pi);
jordymorsinkhof 2:684d5cf2f683 355 controller2.setInputLimits(0.5f,2.0f*pi);
jordymorsinkhof 2:684d5cf2f683 356 controller1.setOutputLimits(-0.15f,0.15f);
jordymorsinkhof 2:684d5cf2f683 357 controller2.setOutputLimits(-0.5f,0.5f);
jordymorsinkhof 2:684d5cf2f683 358
jordymorsinkhof 3:98ea6afa0cf2 359 float q1set; //becomes new value after calling function again
jordymorsinkhof 3:98ea6afa0cf2 360 float q2set; //becomes new value after calling function again
jordymorsinkhof 3:98ea6afa0cf2 361 SuperFunction(Gq1, Gq2, GXset, GYset, q1set, q2set);
jordymorsinkhof 3:98ea6afa0cf2 362 pc.printf("The new value of q1set is %f, the new q2set is %f\n\r", q1set, q2set);
jordymorsinkhof 3:98ea6afa0cf2 363 SuperFunction(Gq1, Gq2, GXset, GYset, q1set, q2set);
jordymorsinkhof 3:98ea6afa0cf2 364 pc.printf("The new value of q1set is %f, the new q2set is %f\n\r", q1set, q2set);
jordymorsinkhof 3:98ea6afa0cf2 365
jordymorsinkhof 2:684d5cf2f683 366
jordymorsinkhof 2:684d5cf2f683 367 HomingLoop();
jordymorsinkhof 2:684d5cf2f683 368
BramS23 0:6c0f87177797 369
jordymorsinkhof 2:684d5cf2f683 370 ControlTicker.attach(&ControlLoop, Interval);
jordymorsinkhof 2:684d5cf2f683 371 //GetRefTicker.attach(&DeterminePosRef, 0.1f);
jordymorsinkhof 2:684d5cf2f683 372
jordymorsinkhof 2:684d5cf2f683 373
jordymorsinkhof 2:684d5cf2f683 374
jordymorsinkhof 2:684d5cf2f683 375 while(1)
jordymorsinkhof 2:684d5cf2f683 376 {
jordymorsinkhof 2:684d5cf2f683 377 if (ir_rx.getState() == ReceiverIR::Received)
jordymorsinkhof 2:684d5cf2f683 378 {
jordymorsinkhof 2:684d5cf2f683 379
jordymorsinkhof 2:684d5cf2f683 380 pc.printf("received");
jordymorsinkhof 2:684d5cf2f683 381 RemoteController();
jordymorsinkhof 2:684d5cf2f683 382 wait(0.01);
BramS23 0:6c0f87177797 383 }
jordymorsinkhof 2:684d5cf2f683 384 }
jordymorsinkhof 2:684d5cf2f683 385
jordymorsinkhof 2:684d5cf2f683 386
jordymorsinkhof 2:684d5cf2f683 387 while(1){}
jordymorsinkhof 2:684d5cf2f683 388
jordymorsinkhof 2:684d5cf2f683 389
BramS23 0:6c0f87177797 390 }