![](/media/cache/group/11700697_10200701668420946_8214886085951071495_o.jpg.50x50_q85.jpg)
Stabilizer
Dependencies: BEAR_Protocol mbed Stabilizer iSerial
Fork of MPU9250AHRS by
main.cpp@19:5b8d16378d66, 2016-01-23 (annotated)
- Committer:
- soulx
- Date:
- Sat Jan 23 17:18:19 2016 +0000
- Revision:
- 19:5b8d16378d66
- Parent:
- 18:02559b51ec08
- Child:
- 20:1d4db25afe2b
edit waring
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
soulx | 18:02559b51ec08 | 1 | |
icyzkungz | 6:fa132fd505ce | 2 | #include "Stabilizer.h" |
icyzkungz | 10:f088c124d2be | 3 | #include "Kinematic.h" |
onehorse | 0:2e5e65a6fb30 | 4 | #include "MPU9250.h" |
onehorse | 0:2e5e65a6fb30 | 5 | |
soulx | 18:02559b51ec08 | 6 | #include "BEAR_Protocol.h" |
soulx | 18:02559b51ec08 | 7 | |
soulx | 18:02559b51ec08 | 8 | #define LEFT_SIDE 0x01 |
soulx | 18:02559b51ec08 | 9 | #define RIGHT_SIDE 0x02 |
soulx | 18:02559b51ec08 | 10 | |
onehorse | 0:2e5e65a6fb30 | 11 | float sum = 0; |
onehorse | 0:2e5e65a6fb30 | 12 | uint32_t sumCount = 0; |
onehorse | 0:2e5e65a6fb30 | 13 | char buffer[14]; |
onehorse | 0:2e5e65a6fb30 | 14 | |
soulx | 3:3e04c1c03cab | 15 | MPU9250 mpu9250; |
soulx | 14:8101a48eb972 | 16 | Stabilizer Stabilize(5.0f,0.0f); |
icyzkungz | 17:51ac4252fa1a | 17 | //Kinematic L('Z',10,10,30,30),R('Z',10,10,30,30); |
icyzkungz | 17:51ac4252fa1a | 18 | Kinematic L(0,0),R(0,0); |
icyzkungz | 17:51ac4252fa1a | 19 | Bear_Communicate bcom(PA_15,PB_7,1000000); |
soulx | 3:3e04c1c03cab | 20 | |
soulx | 3:3e04c1c03cab | 21 | Timer t; |
onehorse | 0:2e5e65a6fb30 | 22 | |
soulx | 3:3e04c1c03cab | 23 | Serial pc(USBTX, USBRX); // tx, rx |
soulx | 3:3e04c1c03cab | 24 | |
soulx | 3:3e04c1c03cab | 25 | float xmax = -4914.0f; |
soulx | 3:3e04c1c03cab | 26 | float xmin = 4914.0f; |
onehorse | 0:2e5e65a6fb30 | 27 | |
soulx | 3:3e04c1c03cab | 28 | float ymax = -4914.0; |
soulx | 3:3e04c1c03cab | 29 | float ymin = 4914.0f; |
soulx | 3:3e04c1c03cab | 30 | |
soulx | 3:3e04c1c03cab | 31 | float zmax = -4914.0; |
soulx | 3:3e04c1c03cab | 32 | float zmin = 4914.0f; |
onehorse | 0:2e5e65a6fb30 | 33 | |
soulx | 3:3e04c1c03cab | 34 | float Xsf,Ysf; |
soulx | 3:3e04c1c03cab | 35 | float Xoff,Yoff; |
soulx | 3:3e04c1c03cab | 36 | |
soulx | 3:3e04c1c03cab | 37 | |
soulx | 3:3e04c1c03cab | 38 | //InterruptIn event(PC_13); |
soulx | 3:3e04c1c03cab | 39 | DigitalIn enable(PC_13); |
soulx | 3:3e04c1c03cab | 40 | |
icyzkungz | 16:b5b9827dd5dc | 41 | DigitalIn button(USER_BUTTON); |
icyzkungz | 16:b5b9827dd5dc | 42 | |
icyzkungz | 16:b5b9827dd5dc | 43 | void SwMode() |
icyzkungz | 16:b5b9827dd5dc | 44 | { |
icyzkungz | 17:51ac4252fa1a | 45 | int option; |
icyzkungz | 17:51ac4252fa1a | 46 | float temp; |
icyzkungz | 16:b5b9827dd5dc | 47 | float LH,LK,RH,RK; |
soulx | 19:5b8d16378d66 | 48 | //float LLink[2],RLink[2]; |
soulx | 19:5b8d16378d66 | 49 | float LLink0=0.0f,LLink1=0.0f,RLink0=0.0f,RLink1=0.0f; |
icyzkungz | 17:51ac4252fa1a | 50 | struct max_ang { |
icyzkungz | 17:51ac4252fa1a | 51 | float Hip; |
icyzkungz | 17:51ac4252fa1a | 52 | float Knee; |
icyzkungz | 17:51ac4252fa1a | 53 | }; |
icyzkungz | 17:51ac4252fa1a | 54 | struct min_ang { |
icyzkungz | 17:51ac4252fa1a | 55 | float Hip; |
icyzkungz | 17:51ac4252fa1a | 56 | float Knee; |
icyzkungz | 17:51ac4252fa1a | 57 | }; |
icyzkungz | 17:51ac4252fa1a | 58 | max_ang Lmax,Lmin; |
icyzkungz | 17:51ac4252fa1a | 59 | min_ang Rmax,Rmin; |
icyzkungz | 17:51ac4252fa1a | 60 | Lmax.Knee = Lmax.Hip = Lmin.Knee = Lmin.Hip = Rmax.Knee = Rmax.Hip = Rmin.Knee = Rmin.Hip = 0; |
icyzkungz | 17:51ac4252fa1a | 61 | bool a,b,c,d; |
icyzkungz | 17:51ac4252fa1a | 62 | a = b = c = d = false; |
icyzkungz | 16:b5b9827dd5dc | 63 | float temp_LH=0,temp_LK=0,temp_RH=0,temp_RK=0; |
icyzkungz | 17:51ac4252fa1a | 64 | do { |
icyzkungz | 16:b5b9827dd5dc | 65 | pc.printf("************Don't Forget to Save Data************\n"); |
icyzkungz | 16:b5b9827dd5dc | 66 | pc.printf("*\t1) Motor Left Hip \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 67 | pc.printf("*\t2) Motor Left Knee \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 68 | pc.printf("*\t3) Motor Right Hip \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 69 | pc.printf("*\t4) Motor Right Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 70 | |
icyzkungz | 16:b5b9827dd5dc | 71 | pc.printf("*\t5) Kp : Left Hip \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 72 | pc.printf("*\t6) Ki : Left Hip \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 73 | pc.printf("*\t7) Kd : Left Hip \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 74 | |
icyzkungz | 17:51ac4252fa1a | 75 | pc.printf("*\t8) Kp : Left Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 76 | pc.printf("*\t9) Ki : Left Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 77 | pc.printf("*\t10) Kd : Left Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 78 | |
icyzkungz | 17:51ac4252fa1a | 79 | pc.printf("*\t11) Kp : Right Hip \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 80 | pc.printf("*\t12) Ki : Right Hip \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 81 | pc.printf("*\t13) Kd : Right Hip \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 82 | |
icyzkungz | 17:51ac4252fa1a | 83 | pc.printf("*\t14) Kp : Right Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 84 | pc.printf("*\t15) Ki : Right Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 85 | pc.printf("*\t16) Kd : Right Knee \t\t\t*\n"); |
icyzkungz | 17:51ac4252fa1a | 86 | |
icyzkungz | 17:51ac4252fa1a | 87 | pc.printf("*\t17) Set Left Hip Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 88 | pc.printf("*\t18) Set Left Knee Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 89 | pc.printf("*\t19) Set Right Hip Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 90 | pc.printf("*\t20) Set Right Knee Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 91 | |
icyzkungz | 17:51ac4252fa1a | 92 | pc.printf("*\t21) Set Lenght of Left Link Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 93 | pc.printf("*\t22) Set Lenght of Left Link Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 94 | pc.printf("*\t23) Set Lenght of Right Link Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 95 | pc.printf("*\t24) Set Lenght of Right Link Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 96 | |
icyzkungz | 17:51ac4252fa1a | 97 | pc.printf("*\t25) Set Offset\n"); |
icyzkungz | 17:51ac4252fa1a | 98 | |
icyzkungz | 17:51ac4252fa1a | 99 | pc.printf("*\t26) Set Body Width\n"); |
icyzkungz | 17:51ac4252fa1a | 100 | |
icyzkungz | 17:51ac4252fa1a | 101 | pc.printf("*\t27) Set Maximum Hip Angle Range\n"); |
icyzkungz | 17:51ac4252fa1a | 102 | pc.printf("*\t28) Set Minimum Hip Angle Range\n"); |
icyzkungz | 17:51ac4252fa1a | 103 | pc.printf("*\t29) Set Maximum Knee Angle Range\n"); |
icyzkungz | 17:51ac4252fa1a | 104 | pc.printf("*\t30) Set Minimum Knee Angle Range\n"); |
icyzkungz | 17:51ac4252fa1a | 105 | |
icyzkungz | 17:51ac4252fa1a | 106 | pc.printf("*\t40) Exit Program \t\t\t*\n"); |
icyzkungz | 16:b5b9827dd5dc | 107 | pc.printf("************Don't Forget to Save Data************\n"); |
icyzkungz | 16:b5b9827dd5dc | 108 | // Prompting user to enter an option according to menu |
icyzkungz | 16:b5b9827dd5dc | 109 | pc.printf("Please select an option : "); |
icyzkungz | 17:51ac4252fa1a | 110 | |
icyzkungz | 16:b5b9827dd5dc | 111 | pc.scanf("%d",&option); |
icyzkungz | 17:51ac4252fa1a | 112 | |
icyzkungz | 16:b5b9827dd5dc | 113 | pc.printf("\n"); |
icyzkungz | 16:b5b9827dd5dc | 114 | |
icyzkungz | 17:51ac4252fa1a | 115 | if(option == 1)// Left Hip |
icyzkungz | 16:b5b9827dd5dc | 116 | do { |
icyzkungz | 17:51ac4252fa1a | 117 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 118 | //Send Position to Motor |
icyzkungz | 17:51ac4252fa1a | 119 | pc.printf("Input Degree : \n"); |
icyzkungz | 17:51ac4252fa1a | 120 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 121 | if(temp!=9999) { |
icyzkungz | 17:51ac4252fa1a | 122 | LH = temp; |
icyzkungz | 16:b5b9827dd5dc | 123 | pc.printf("Move Left Hip Motor to %f Degree\n",LH); |
icyzkungz | 16:b5b9827dd5dc | 124 | |
icyzkungz | 17:51ac4252fa1a | 125 | bcom.setMotorPos(LEFT_SIDE,LH,temp_LK); |
icyzkungz | 16:b5b9827dd5dc | 126 | temp_LH = LH; |
icyzkungz | 16:b5b9827dd5dc | 127 | |
icyzkungz | 16:b5b9827dd5dc | 128 | /********************Save Data*********************/ |
icyzkungz | 17:51ac4252fa1a | 129 | } else bcom.saveDataToEEPROM(LEFT_SIDE,MOTOR_UPPER_ANG); |
icyzkungz | 16:b5b9827dd5dc | 130 | |
icyzkungz | 17:51ac4252fa1a | 131 | } while(temp != 9999); |
icyzkungz | 17:51ac4252fa1a | 132 | |
icyzkungz | 17:51ac4252fa1a | 133 | else if(option == 2) //Left Knee |
icyzkungz | 16:b5b9827dd5dc | 134 | do { |
icyzkungz | 17:51ac4252fa1a | 135 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 16:b5b9827dd5dc | 136 | |
icyzkungz | 17:51ac4252fa1a | 137 | //Send Position to Motor |
icyzkungz | 17:51ac4252fa1a | 138 | pc.printf("Input Degree : \n"); |
icyzkungz | 17:51ac4252fa1a | 139 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 140 | if(temp!=9999) { |
icyzkungz | 17:51ac4252fa1a | 141 | LK = temp; |
icyzkungz | 16:b5b9827dd5dc | 142 | pc.printf("Move Left Knee Motor to %f Degree\n",LK); |
icyzkungz | 16:b5b9827dd5dc | 143 | |
icyzkungz | 17:51ac4252fa1a | 144 | bcom.setMotorPos(LEFT_SIDE,temp_LH,LK); |
icyzkungz | 16:b5b9827dd5dc | 145 | temp_LK = LK; |
icyzkungz | 16:b5b9827dd5dc | 146 | |
icyzkungz | 17:51ac4252fa1a | 147 | |
icyzkungz | 16:b5b9827dd5dc | 148 | /********************Save Data*********************/ |
icyzkungz | 17:51ac4252fa1a | 149 | } else bcom.saveDataToEEPROM(LEFT_SIDE,MOTOR_LOWER_ANG); |
icyzkungz | 16:b5b9827dd5dc | 150 | |
icyzkungz | 17:51ac4252fa1a | 151 | } while(temp != 9999); |
icyzkungz | 17:51ac4252fa1a | 152 | |
icyzkungz | 17:51ac4252fa1a | 153 | |
icyzkungz | 17:51ac4252fa1a | 154 | else if(option == 3) { //Right Hip |
icyzkungz | 16:b5b9827dd5dc | 155 | do { |
icyzkungz | 17:51ac4252fa1a | 156 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 16:b5b9827dd5dc | 157 | |
icyzkungz | 17:51ac4252fa1a | 158 | //Send Position to Motor |
icyzkungz | 17:51ac4252fa1a | 159 | pc.printf("Input Degree : \n"); |
icyzkungz | 17:51ac4252fa1a | 160 | pc.scanf("%f",&RH); |
icyzkungz | 17:51ac4252fa1a | 161 | if(temp!=9999) { |
icyzkungz | 17:51ac4252fa1a | 162 | RH = temp; |
icyzkungz | 16:b5b9827dd5dc | 163 | pc.printf("Move Right Hip Motor to %f Degree\n",RH); |
icyzkungz | 16:b5b9827dd5dc | 164 | |
icyzkungz | 17:51ac4252fa1a | 165 | bcom.setMotorPos(RIGHT_SIDE,RH,temp_RK); |
icyzkungz | 16:b5b9827dd5dc | 166 | temp_RH = RH; |
icyzkungz | 16:b5b9827dd5dc | 167 | |
icyzkungz | 17:51ac4252fa1a | 168 | |
icyzkungz | 16:b5b9827dd5dc | 169 | /********************Save Data*********************/ |
icyzkungz | 17:51ac4252fa1a | 170 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,MOTOR_UPPER_ANG); |
icyzkungz | 17:51ac4252fa1a | 171 | |
icyzkungz | 17:51ac4252fa1a | 172 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 173 | |
icyzkungz | 16:b5b9827dd5dc | 174 | } else if(option == 4) { //Right Knee |
icyzkungz | 16:b5b9827dd5dc | 175 | do { |
icyzkungz | 17:51ac4252fa1a | 176 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 16:b5b9827dd5dc | 177 | |
icyzkungz | 17:51ac4252fa1a | 178 | //Send Position to Motor |
icyzkungz | 17:51ac4252fa1a | 179 | pc.printf("Input Degree : \n"); |
icyzkungz | 17:51ac4252fa1a | 180 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 181 | |
icyzkungz | 17:51ac4252fa1a | 182 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 183 | RK = temp; |
icyzkungz | 16:b5b9827dd5dc | 184 | pc.printf("Move Right Knee Motor to %f Degree\n",RK); |
icyzkungz | 16:b5b9827dd5dc | 185 | |
icyzkungz | 17:51ac4252fa1a | 186 | bcom.setMotorPos(RIGHT_SIDE,temp_RH,RK); |
icyzkungz | 16:b5b9827dd5dc | 187 | temp_RK = RK; |
icyzkungz | 16:b5b9827dd5dc | 188 | |
icyzkungz | 17:51ac4252fa1a | 189 | |
icyzkungz | 16:b5b9827dd5dc | 190 | /********************Save Data*********************/ |
icyzkungz | 17:51ac4252fa1a | 191 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,MOTOR_LOWER_ANG); |
icyzkungz | 17:51ac4252fa1a | 192 | |
icyzkungz | 17:51ac4252fa1a | 193 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 194 | |
icyzkungz | 16:b5b9827dd5dc | 195 | } else if(option == 5) { //Left Hip |
icyzkungz | 16:b5b9827dd5dc | 196 | do { |
icyzkungz | 17:51ac4252fa1a | 197 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 198 | pc.printf("\nInput Kp of Left Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 199 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 200 | |
icyzkungz | 17:51ac4252fa1a | 201 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 202 | pc.printf("\nChange Kp of Left Hip to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 203 | |
icyzkungz | 17:51ac4252fa1a | 204 | bcom.setUpMotorKp(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 205 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KP_UPPER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 206 | |
icyzkungz | 17:51ac4252fa1a | 207 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 208 | |
icyzkungz | 16:b5b9827dd5dc | 209 | } else if(option == 6) { //Left Hip |
icyzkungz | 16:b5b9827dd5dc | 210 | do { |
icyzkungz | 17:51ac4252fa1a | 211 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 212 | pc.printf("\nInput Ki of Left Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 213 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 214 | |
icyzkungz | 17:51ac4252fa1a | 215 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 216 | pc.printf("\nChange Ki of Left Hip to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 217 | |
icyzkungz | 17:51ac4252fa1a | 218 | bcom.setUpMotorKi(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 219 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KI_UPPER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 220 | |
icyzkungz | 17:51ac4252fa1a | 221 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 222 | |
icyzkungz | 16:b5b9827dd5dc | 223 | } else if(option == 7) { //Left Hip |
icyzkungz | 16:b5b9827dd5dc | 224 | do { |
icyzkungz | 17:51ac4252fa1a | 225 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 226 | pc.printf("\nInput Kd of Left Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 227 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 228 | |
icyzkungz | 17:51ac4252fa1a | 229 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 230 | pc.printf("\nChange Kd of Left Hip to %f",temp); |
icyzkungz | 17:51ac4252fa1a | 231 | |
icyzkungz | 17:51ac4252fa1a | 232 | bcom.setUpMotorKd(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 233 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KD_UPPER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 234 | |
icyzkungz | 17:51ac4252fa1a | 235 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 236 | |
icyzkungz | 17:51ac4252fa1a | 237 | } else if(option == 8) { //Left Knee |
icyzkungz | 17:51ac4252fa1a | 238 | do { |
icyzkungz | 17:51ac4252fa1a | 239 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 240 | pc.printf("\nInput Kp of Left Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 241 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 242 | |
icyzkungz | 17:51ac4252fa1a | 243 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 244 | pc.printf("\nChange Kp of Left Knee to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 245 | |
icyzkungz | 17:51ac4252fa1a | 246 | bcom.setLowMotorKp(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 247 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KP_LOWER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 248 | |
icyzkungz | 17:51ac4252fa1a | 249 | } while(temp != 9999); |
icyzkungz | 11:fceaaa7e120a | 250 | |
icyzkungz | 16:b5b9827dd5dc | 251 | } else if(option == 9) { //Left Knee |
icyzkungz | 16:b5b9827dd5dc | 252 | do { |
icyzkungz | 17:51ac4252fa1a | 253 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 254 | pc.printf("\nInput Ki of Left Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 255 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 256 | |
icyzkungz | 17:51ac4252fa1a | 257 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 258 | pc.printf("\nChange Ki of Left Knee to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 259 | |
icyzkungz | 17:51ac4252fa1a | 260 | bcom.setLowMotorKi(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 261 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KI_LOWER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 262 | |
icyzkungz | 17:51ac4252fa1a | 263 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 264 | |
icyzkungz | 16:b5b9827dd5dc | 265 | } else if(option == 10) { //Left Knee |
icyzkungz | 16:b5b9827dd5dc | 266 | do { |
icyzkungz | 17:51ac4252fa1a | 267 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 268 | pc.printf("\nInput Kd of Left Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 269 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 270 | |
icyzkungz | 17:51ac4252fa1a | 271 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 272 | pc.printf("\nChange Kd of Left Knee to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 273 | |
icyzkungz | 17:51ac4252fa1a | 274 | bcom.setLowMotorKd(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 275 | } else bcom.saveDataToEEPROM(LEFT_SIDE,KD_LOWER_MOTOR); |
icyzkungz | 16:b5b9827dd5dc | 276 | |
icyzkungz | 17:51ac4252fa1a | 277 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 278 | |
icyzkungz | 16:b5b9827dd5dc | 279 | |
icyzkungz | 17:51ac4252fa1a | 280 | } else if(option == 11) { //Right Hip |
icyzkungz | 17:51ac4252fa1a | 281 | do { |
icyzkungz | 17:51ac4252fa1a | 282 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 283 | pc.printf("\nInput Kp of Right Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 284 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 285 | |
icyzkungz | 17:51ac4252fa1a | 286 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 287 | pc.printf("\nChange Kp of Right Hip to %f",temp); |
icyzkungz | 17:51ac4252fa1a | 288 | |
icyzkungz | 17:51ac4252fa1a | 289 | bcom.setUpMotorKp(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 290 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KP_UPPER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 291 | |
icyzkungz | 17:51ac4252fa1a | 292 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 293 | |
icyzkungz | 17:51ac4252fa1a | 294 | } else if(option == 12) { //Right Hip |
icyzkungz | 17:51ac4252fa1a | 295 | do { |
icyzkungz | 17:51ac4252fa1a | 296 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 297 | pc.printf("\nInput Ki of Right Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 298 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 299 | |
icyzkungz | 17:51ac4252fa1a | 300 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 301 | pc.printf("\nChange Ki of Right Hip to %f",temp); |
icyzkungz | 17:51ac4252fa1a | 302 | |
icyzkungz | 17:51ac4252fa1a | 303 | bcom.setUpMotorKi(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 304 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KI_UPPER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 305 | |
icyzkungz | 17:51ac4252fa1a | 306 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 307 | |
icyzkungz | 16:b5b9827dd5dc | 308 | } else if(option == 13) { //Right Hip |
icyzkungz | 16:b5b9827dd5dc | 309 | do { |
icyzkungz | 17:51ac4252fa1a | 310 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 311 | pc.printf("\nInput Kd of Right Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 312 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 313 | |
icyzkungz | 17:51ac4252fa1a | 314 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 315 | pc.printf("\nChange Kd of Right Hip to %f",temp); |
icyzkungz | 16:b5b9827dd5dc | 316 | |
icyzkungz | 17:51ac4252fa1a | 317 | bcom.setUpMotorKd(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 318 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KD_UPPER_MOTOR); |
icyzkungz | 16:b5b9827dd5dc | 319 | |
icyzkungz | 17:51ac4252fa1a | 320 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 321 | |
icyzkungz | 16:b5b9827dd5dc | 322 | |
icyzkungz | 17:51ac4252fa1a | 323 | } else if(option == 14) { //Right Knee |
icyzkungz | 17:51ac4252fa1a | 324 | do { |
icyzkungz | 17:51ac4252fa1a | 325 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 326 | pc.printf("\nInput Kp of Right Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 327 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 328 | |
icyzkungz | 17:51ac4252fa1a | 329 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 330 | pc.printf("\nChange Kp of Right Knee to %f",temp); |
icyzkungz | 17:51ac4252fa1a | 331 | |
icyzkungz | 17:51ac4252fa1a | 332 | bcom.setLowMotorKp(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 333 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KP_LOWER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 334 | |
icyzkungz | 17:51ac4252fa1a | 335 | } while(temp != 9999); |
icyzkungz | 17:51ac4252fa1a | 336 | |
icyzkungz | 17:51ac4252fa1a | 337 | } else if(option == 15) { //Right Knee |
icyzkungz | 17:51ac4252fa1a | 338 | do { |
icyzkungz | 17:51ac4252fa1a | 339 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 340 | pc.printf("\nInput Ki of Right Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 341 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 342 | |
icyzkungz | 17:51ac4252fa1a | 343 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 344 | pc.printf("\nChange Ki of Right Knee to %f Degree\n",temp); |
icyzkungz | 17:51ac4252fa1a | 345 | |
icyzkungz | 17:51ac4252fa1a | 346 | bcom.setLowMotorKi(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 347 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KI_LOWER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 348 | |
icyzkungz | 17:51ac4252fa1a | 349 | } while(temp != 9999); |
icyzkungz | 17:51ac4252fa1a | 350 | |
icyzkungz | 17:51ac4252fa1a | 351 | } else if(option == 16) { //Right Knee |
icyzkungz | 17:51ac4252fa1a | 352 | do { |
icyzkungz | 17:51ac4252fa1a | 353 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 354 | pc.printf("\nInput Kd of Right Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 355 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 356 | |
icyzkungz | 17:51ac4252fa1a | 357 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 358 | pc.printf("\nChange Kd of Right Knee to %f",temp); |
icyzkungz | 17:51ac4252fa1a | 359 | |
icyzkungz | 17:51ac4252fa1a | 360 | bcom.setLowMotorKd(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 361 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,KD_LOWER_MOTOR); |
icyzkungz | 17:51ac4252fa1a | 362 | |
icyzkungz | 17:51ac4252fa1a | 363 | } while(temp != 9999); |
icyzkungz | 16:b5b9827dd5dc | 364 | |
icyzkungz | 16:b5b9827dd5dc | 365 | |
icyzkungz | 17:51ac4252fa1a | 366 | } else if(option == 17) { //Left Hip Margin |
icyzkungz | 17:51ac4252fa1a | 367 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 368 | pc.printf("Input Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 369 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 370 | |
icyzkungz | 17:51ac4252fa1a | 371 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 372 | pc.printf("\nChange Left Hip Margin to %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 373 | bcom.setUpMargin(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 374 | } else bcom.saveDataToEEPROM(LEFT_SIDE,UP_MARGIN); |
icyzkungz | 17:51ac4252fa1a | 375 | } |
icyzkungz | 17:51ac4252fa1a | 376 | |
icyzkungz | 17:51ac4252fa1a | 377 | else if(option == 18) { //Left Knee Margin |
icyzkungz | 17:51ac4252fa1a | 378 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 379 | pc.printf("Input Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 380 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 381 | |
icyzkungz | 17:51ac4252fa1a | 382 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 383 | pc.printf("\nChange Left Knee Margin to %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 384 | bcom.setLowMargin(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 385 | } else bcom.saveDataToEEPROM(LEFT_SIDE,LOW_MARGIN); |
icyzkungz | 17:51ac4252fa1a | 386 | } |
icyzkungz | 16:b5b9827dd5dc | 387 | |
icyzkungz | 17:51ac4252fa1a | 388 | else if(option == 19) { //Right Hip Margin |
icyzkungz | 17:51ac4252fa1a | 389 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 390 | pc.printf("Input Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 391 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 392 | |
icyzkungz | 17:51ac4252fa1a | 393 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 394 | pc.printf("\nChange Right Hip Margin to %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 395 | bcom.setUpMargin(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 396 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,UP_MARGIN); |
icyzkungz | 17:51ac4252fa1a | 397 | } |
icyzkungz | 16:b5b9827dd5dc | 398 | |
icyzkungz | 17:51ac4252fa1a | 399 | else if(option == 20) { //Right Knee Margin |
icyzkungz | 17:51ac4252fa1a | 400 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 401 | pc.printf("Input Margin\n"); |
icyzkungz | 17:51ac4252fa1a | 402 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 403 | |
icyzkungz | 17:51ac4252fa1a | 404 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 405 | pc.printf("\nChange Right Knee Margin to %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 406 | bcom.setLowMargin(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 407 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,LOW_MARGIN); |
icyzkungz | 17:51ac4252fa1a | 408 | } |
icyzkungz | 16:b5b9827dd5dc | 409 | |
icyzkungz | 17:51ac4252fa1a | 410 | else if(option == 21) { //Lenght of Left Link Hip |
icyzkungz | 17:51ac4252fa1a | 411 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 412 | pc.printf("Input Lenght of Left Link Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 413 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 414 | |
icyzkungz | 17:51ac4252fa1a | 415 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 416 | pc.printf("\nLenght of Left Link Hip = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 417 | LLink0 = temp; |
icyzkungz | 17:51ac4252fa1a | 418 | a = true; |
icyzkungz | 17:51ac4252fa1a | 419 | bcom.setUpLinkLength(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 420 | } else bcom.saveDataToEEPROM(LEFT_SIDE,UP_LINK_LENGTH); |
icyzkungz | 17:51ac4252fa1a | 421 | } |
icyzkungz | 17:51ac4252fa1a | 422 | |
icyzkungz | 17:51ac4252fa1a | 423 | else if(option == 22) { //Lenght of Left Link Knee |
icyzkungz | 17:51ac4252fa1a | 424 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 425 | pc.printf("Input Lenght of Left Link Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 426 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 427 | |
icyzkungz | 17:51ac4252fa1a | 428 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 429 | pc.printf("\nLenght of Left Link Knee = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 430 | LLink1 = temp; |
icyzkungz | 17:51ac4252fa1a | 431 | b = true; |
icyzkungz | 17:51ac4252fa1a | 432 | bcom.setLowLinkLength(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 433 | } else bcom.saveDataToEEPROM(LEFT_SIDE,LOW_LINK_LENGTH); |
icyzkungz | 17:51ac4252fa1a | 434 | } |
icyzkungz | 16:b5b9827dd5dc | 435 | |
icyzkungz | 17:51ac4252fa1a | 436 | else if(option == 23) { //Lenght of Right Link Hip |
icyzkungz | 17:51ac4252fa1a | 437 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 438 | pc.printf("Input Lenght of Right Link Hip\n"); |
icyzkungz | 17:51ac4252fa1a | 439 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 440 | |
icyzkungz | 17:51ac4252fa1a | 441 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 442 | pc.printf("\nLenght of Right Link Hip = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 443 | RLink0 = temp; |
icyzkungz | 17:51ac4252fa1a | 444 | c = true; |
icyzkungz | 17:51ac4252fa1a | 445 | bcom.setUpLinkLength(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 446 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,UP_LINK_LENGTH); |
icyzkungz | 17:51ac4252fa1a | 447 | } |
icyzkungz | 16:b5b9827dd5dc | 448 | |
icyzkungz | 17:51ac4252fa1a | 449 | else if(option == 24) { //Lenght of Right Link Knee |
icyzkungz | 17:51ac4252fa1a | 450 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 451 | pc.printf("Input Lenght of Right Link Knee\n"); |
icyzkungz | 17:51ac4252fa1a | 452 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 453 | |
icyzkungz | 17:51ac4252fa1a | 454 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 455 | pc.printf("\nLenght of Right Link Knee = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 456 | RLink1 = temp; |
icyzkungz | 17:51ac4252fa1a | 457 | d = true; |
icyzkungz | 17:51ac4252fa1a | 458 | bcom.setLowLinkLength(RIGHT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 459 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,LOW_LINK_LENGTH); |
icyzkungz | 17:51ac4252fa1a | 460 | } |
icyzkungz | 16:b5b9827dd5dc | 461 | |
icyzkungz | 17:51ac4252fa1a | 462 | else if(option == 25) { //Offset |
icyzkungz | 17:51ac4252fa1a | 463 | if(a == true && b == true && c == true && d == true) { |
icyzkungz | 17:51ac4252fa1a | 464 | float LHipAngle,LKneeAngle; |
icyzkungz | 17:51ac4252fa1a | 465 | float RHipAngle,RKneeAngle; |
icyzkungz | 17:51ac4252fa1a | 466 | bcom.getMotorPos(LEFT_SIDE,&LHipAngle,&LKneeAngle); |
icyzkungz | 17:51ac4252fa1a | 467 | wait_ms(90); |
icyzkungz | 17:51ac4252fa1a | 468 | bcom.getMotorPos(RIGHT_SIDE,&RHipAngle,&RKneeAngle); |
icyzkungz | 17:51ac4252fa1a | 469 | wait_ms(90); |
icyzkungz | 17:51ac4252fa1a | 470 | |
icyzkungz | 17:51ac4252fa1a | 471 | L.set_Link_Hip(LLink0); |
icyzkungz | 17:51ac4252fa1a | 472 | L.set_Link_Knee(LLink1); |
icyzkungz | 17:51ac4252fa1a | 473 | L.set_Zeta_Hip(LHipAngle); |
icyzkungz | 17:51ac4252fa1a | 474 | L.set_Zeta_Knee(LKneeAngle); |
icyzkungz | 17:51ac4252fa1a | 475 | |
icyzkungz | 17:51ac4252fa1a | 476 | R.set_Link_Hip(RLink0); |
icyzkungz | 17:51ac4252fa1a | 477 | R.set_Link_Knee(RLink1); |
icyzkungz | 17:51ac4252fa1a | 478 | R.set_Zeta_Hip(RHipAngle); |
icyzkungz | 17:51ac4252fa1a | 479 | R.set_Zeta_Knee(RKneeAngle); |
icyzkungz | 17:51ac4252fa1a | 480 | |
icyzkungz | 17:51ac4252fa1a | 481 | L.ForwardKinematicCalculation(); |
soulx | 18:02559b51ec08 | 482 | R.ForwardKinematicCalculation(); |
icyzkungz | 16:b5b9827dd5dc | 483 | |
icyzkungz | 17:51ac4252fa1a | 484 | float offset_Y,offset_Z; |
icyzkungz | 17:51ac4252fa1a | 485 | float y1,y2,z1,z2; |
icyzkungz | 17:51ac4252fa1a | 486 | y1 = L.get_Position_Y(); |
icyzkungz | 17:51ac4252fa1a | 487 | y2 = R.get_Position_Y(); |
icyzkungz | 17:51ac4252fa1a | 488 | z1 = L.get_Position_Z(); |
icyzkungz | 17:51ac4252fa1a | 489 | z2 = R.get_Position_Z(); |
icyzkungz | 17:51ac4252fa1a | 490 | offset_Y = y1-y2; |
icyzkungz | 17:51ac4252fa1a | 491 | offset_Z = z1-z2; |
icyzkungz | 17:51ac4252fa1a | 492 | |
icyzkungz | 17:51ac4252fa1a | 493 | bcom.setOffset(LEFT_SIDE,offset_Y,offset_Z); |
icyzkungz | 17:51ac4252fa1a | 494 | |
icyzkungz | 17:51ac4252fa1a | 495 | bcom.saveDataToEEPROM(LEFT_SIDE,OFFSET); |
icyzkungz | 16:b5b9827dd5dc | 496 | |
icyzkungz | 17:51ac4252fa1a | 497 | } else { |
icyzkungz | 17:51ac4252fa1a | 498 | pc.printf("\nYou have to do choice 21-23 first\n\n"); |
icyzkungz | 17:51ac4252fa1a | 499 | wait(2); |
icyzkungz | 17:51ac4252fa1a | 500 | } |
icyzkungz | 17:51ac4252fa1a | 501 | } |
icyzkungz | 17:51ac4252fa1a | 502 | |
icyzkungz | 17:51ac4252fa1a | 503 | else if(option == 26) { //setBodyWidth |
icyzkungz | 17:51ac4252fa1a | 504 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 505 | pc.printf("Input Body Width\n"); |
icyzkungz | 17:51ac4252fa1a | 506 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 507 | pc.printf("\nBody Lenght = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 508 | bcom.setBodyWidth(LEFT_SIDE,temp); |
icyzkungz | 17:51ac4252fa1a | 509 | bcom.saveDataToEEPROM(LEFT_SIDE,BODY_WIDTH); |
icyzkungz | 17:51ac4252fa1a | 510 | } |
icyzkungz | 16:b5b9827dd5dc | 511 | |
icyzkungz | 17:51ac4252fa1a | 512 | else if(option == 27) { //Set Maximum Hip Angle Range |
icyzkungz | 17:51ac4252fa1a | 513 | do { |
icyzkungz | 17:51ac4252fa1a | 514 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 515 | pc.printf("1) Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 516 | pc.printf("2) Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 517 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 518 | |
icyzkungz | 17:51ac4252fa1a | 519 | if(temp==1) { //Left |
icyzkungz | 17:51ac4252fa1a | 520 | pc.printf("Input Maximum Hip Angle Range of Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 521 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 522 | |
icyzkungz | 17:51ac4252fa1a | 523 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 524 | pc.printf("\nMaximum Hip Angle Range of Left Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 525 | bcom.setUpAngleRange(LEFT_SIDE,temp,Lmin.Hip); |
icyzkungz | 17:51ac4252fa1a | 526 | Lmax.Hip = temp; |
icyzkungz | 17:51ac4252fa1a | 527 | } else bcom.saveDataToEEPROM(LEFT_SIDE,ANGLE_RANGE_UP); |
icyzkungz | 17:51ac4252fa1a | 528 | |
icyzkungz | 17:51ac4252fa1a | 529 | } else if(temp==2) { //Right |
icyzkungz | 17:51ac4252fa1a | 530 | pc.printf("Input Maximum Hip Angle Range of Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 531 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 532 | |
icyzkungz | 17:51ac4252fa1a | 533 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 534 | pc.printf("\nMaximum Hip Angle Range of Right Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 535 | bcom.setUpAngleRange(RIGHT_SIDE,temp,Rmin.Hip); |
icyzkungz | 17:51ac4252fa1a | 536 | Rmax.Hip = temp; |
icyzkungz | 17:51ac4252fa1a | 537 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,ANGLE_RANGE_UP); |
icyzkungz | 17:51ac4252fa1a | 538 | } |
icyzkungz | 17:51ac4252fa1a | 539 | } while(temp!=9999); |
icyzkungz | 17:51ac4252fa1a | 540 | } |
icyzkungz | 16:b5b9827dd5dc | 541 | |
icyzkungz | 17:51ac4252fa1a | 542 | else if(option == 28) { //Set Minumum Hip Angle Range |
icyzkungz | 17:51ac4252fa1a | 543 | do { |
icyzkungz | 17:51ac4252fa1a | 544 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 545 | pc.printf("1) Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 546 | pc.printf("2) Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 547 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 548 | |
icyzkungz | 17:51ac4252fa1a | 549 | if(temp==1) { //Left |
icyzkungz | 17:51ac4252fa1a | 550 | pc.printf("Input Minumum Hip Angle Range of Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 551 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 552 | |
icyzkungz | 17:51ac4252fa1a | 553 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 554 | pc.printf("\nMinumum Hip Angle Range of Left Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 555 | bcom.setLowAngleRange(LEFT_SIDE,Lmax.Hip,temp); |
icyzkungz | 17:51ac4252fa1a | 556 | Lmin.Hip = temp; |
icyzkungz | 17:51ac4252fa1a | 557 | } else bcom.saveDataToEEPROM(LEFT_SIDE,ANGLE_RANGE_UP); |
icyzkungz | 17:51ac4252fa1a | 558 | |
icyzkungz | 17:51ac4252fa1a | 559 | } else if(temp==2) { //Right |
icyzkungz | 17:51ac4252fa1a | 560 | pc.printf("Input Minumum Hip Angle Range of Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 561 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 562 | |
icyzkungz | 17:51ac4252fa1a | 563 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 564 | pc.printf("\nMinumum Hip Angle Range of Right Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 565 | bcom.setLowAngleRange(RIGHT_SIDE,Rmax.Hip,temp); |
icyzkungz | 17:51ac4252fa1a | 566 | Rmin.Hip = temp; |
icyzkungz | 17:51ac4252fa1a | 567 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,ANGLE_RANGE_UP); |
icyzkungz | 16:b5b9827dd5dc | 568 | } |
icyzkungz | 17:51ac4252fa1a | 569 | } while(temp!=9999); |
icyzkungz | 17:51ac4252fa1a | 570 | } |
icyzkungz | 16:b5b9827dd5dc | 571 | |
icyzkungz | 16:b5b9827dd5dc | 572 | |
icyzkungz | 17:51ac4252fa1a | 573 | else if(option == 29) { //Set Maximum Knee Angle Range |
icyzkungz | 17:51ac4252fa1a | 574 | do { |
icyzkungz | 17:51ac4252fa1a | 575 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 576 | pc.printf("1) Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 577 | pc.printf("2) Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 578 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 579 | |
icyzkungz | 17:51ac4252fa1a | 580 | if(temp==1) { //Left |
icyzkungz | 17:51ac4252fa1a | 581 | pc.printf("Input Maximum Knee Angle Range of Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 582 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 583 | |
icyzkungz | 17:51ac4252fa1a | 584 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 585 | pc.printf("\nMaximum Knee Angle Range of Left Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 586 | bcom.setLowAngleRange(LEFT_SIDE,temp,Lmin.Knee); |
icyzkungz | 17:51ac4252fa1a | 587 | Lmax.Knee = temp; |
icyzkungz | 17:51ac4252fa1a | 588 | } else bcom.saveDataToEEPROM(LEFT_SIDE,ANGLE_RANGE_LOW); |
icyzkungz | 17:51ac4252fa1a | 589 | |
icyzkungz | 17:51ac4252fa1a | 590 | } else if(temp==2) { //Right |
icyzkungz | 17:51ac4252fa1a | 591 | pc.printf("Input Maximum Knee Angle Range of Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 592 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 593 | |
icyzkungz | 17:51ac4252fa1a | 594 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 595 | pc.printf("\nMaximum Knee Angle Range of Right Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 596 | bcom.setLowAngleRange(RIGHT_SIDE,temp,Rmin.Knee); |
icyzkungz | 17:51ac4252fa1a | 597 | Rmax.Knee = temp; |
icyzkungz | 17:51ac4252fa1a | 598 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,ANGLE_RANGE_LOW); |
icyzkungz | 17:51ac4252fa1a | 599 | } |
icyzkungz | 17:51ac4252fa1a | 600 | } while(temp!=9999); |
icyzkungz | 17:51ac4252fa1a | 601 | } |
icyzkungz | 16:b5b9827dd5dc | 602 | |
icyzkungz | 17:51ac4252fa1a | 603 | else if(option == 30) { //Set Minumum Knee Angle Range |
icyzkungz | 17:51ac4252fa1a | 604 | do { |
icyzkungz | 17:51ac4252fa1a | 605 | pc.printf("\nType 9999 to Exit to Main Menu\n"); |
icyzkungz | 17:51ac4252fa1a | 606 | pc.printf("1) Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 607 | pc.printf("2) Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 608 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 609 | |
icyzkungz | 17:51ac4252fa1a | 610 | if(temp==1) { //Left |
icyzkungz | 17:51ac4252fa1a | 611 | pc.printf("Input Minumum Knee Angle Range of Left Side\n"); |
icyzkungz | 17:51ac4252fa1a | 612 | pc.scanf("%f",&temp); |
icyzkungz | 17:51ac4252fa1a | 613 | |
icyzkungz | 17:51ac4252fa1a | 614 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 615 | pc.printf("\nMinumum Knee Angle Range of Left Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 616 | bcom.setLowAngleRange(LEFT_SIDE,Lmax.Knee,temp); |
icyzkungz | 17:51ac4252fa1a | 617 | Lmin.Knee = temp; |
icyzkungz | 17:51ac4252fa1a | 618 | } else bcom.saveDataToEEPROM(LEFT_SIDE,ANGLE_RANGE_LOW); |
icyzkungz | 16:b5b9827dd5dc | 619 | |
icyzkungz | 17:51ac4252fa1a | 620 | } else if(temp==2) { //Right |
icyzkungz | 17:51ac4252fa1a | 621 | pc.printf("Input Minumum Knee Angle Range of Right Side\n"); |
icyzkungz | 17:51ac4252fa1a | 622 | pc.scanf("%f",&temp); |
icyzkungz | 16:b5b9827dd5dc | 623 | |
icyzkungz | 17:51ac4252fa1a | 624 | if(temp != 9999) { |
icyzkungz | 17:51ac4252fa1a | 625 | pc.printf("\nMinumum Knee Angle Range of Right Side = %f\n",temp); |
icyzkungz | 17:51ac4252fa1a | 626 | bcom.setLowAngleRange(RIGHT_SIDE,Rmax.Knee,temp); |
icyzkungz | 17:51ac4252fa1a | 627 | Rmin.Knee = temp; |
icyzkungz | 17:51ac4252fa1a | 628 | } else bcom.saveDataToEEPROM(RIGHT_SIDE,ANGLE_RANGE_LOW); |
icyzkungz | 17:51ac4252fa1a | 629 | } |
icyzkungz | 17:51ac4252fa1a | 630 | } while(temp!=9999); |
icyzkungz | 17:51ac4252fa1a | 631 | } |
icyzkungz | 17:51ac4252fa1a | 632 | |
icyzkungz | 17:51ac4252fa1a | 633 | |
icyzkungz | 17:51ac4252fa1a | 634 | |
icyzkungz | 17:51ac4252fa1a | 635 | |
icyzkungz | 17:51ac4252fa1a | 636 | |
icyzkungz | 17:51ac4252fa1a | 637 | |
icyzkungz | 17:51ac4252fa1a | 638 | else if(option == 40) { |
icyzkungz | 16:b5b9827dd5dc | 639 | pc.printf("Are You Sure ?\n"); |
icyzkungz | 16:b5b9827dd5dc | 640 | pc.printf("\n1) Yes\n"); |
icyzkungz | 16:b5b9827dd5dc | 641 | pc.printf("2) No\n"); |
icyzkungz | 16:b5b9827dd5dc | 642 | |
icyzkungz | 16:b5b9827dd5dc | 643 | pc.scanf("%d",&option); |
icyzkungz | 16:b5b9827dd5dc | 644 | if(option==1) { |
icyzkungz | 17:51ac4252fa1a | 645 | option = 40; |
icyzkungz | 16:b5b9827dd5dc | 646 | pc.printf("Please Push Button Restart\n"); |
icyzkungz | 16:b5b9827dd5dc | 647 | } else pc.printf("Return to Main Menu\n"); |
icyzkungz | 16:b5b9827dd5dc | 648 | |
icyzkungz | 16:b5b9827dd5dc | 649 | } |
icyzkungz | 16:b5b9827dd5dc | 650 | |
icyzkungz | 16:b5b9827dd5dc | 651 | |
icyzkungz | 17:51ac4252fa1a | 652 | else { // if user has entered invalid choice |
icyzkungz | 17:51ac4252fa1a | 653 | pc.printf("\nInvalid Option entered\n"); |
icyzkungz | 16:b5b9827dd5dc | 654 | } |
icyzkungz | 17:51ac4252fa1a | 655 | } while(option != 40); |
icyzkungz | 12:8d773bc149b2 | 656 | |
icyzkungz | 11:fceaaa7e120a | 657 | } |
icyzkungz | 11:fceaaa7e120a | 658 | |
icyzkungz | 17:51ac4252fa1a | 659 | void getData() |
icyzkungz | 11:fceaaa7e120a | 660 | { |
icyzkungz | 17:51ac4252fa1a | 661 | |
icyzkungz | 17:51ac4252fa1a | 662 | } |
icyzkungz | 11:fceaaa7e120a | 663 | |
icyzkungz | 11:fceaaa7e120a | 664 | |
onehorse | 0:2e5e65a6fb30 | 665 | int main() |
onehorse | 0:2e5e65a6fb30 | 666 | { |
icyzkungz | 11:fceaaa7e120a | 667 | pc.baud(115200); |
icyzkungz | 17:51ac4252fa1a | 668 | |
icyzkungz | 17:51ac4252fa1a | 669 | if(!button) { //Set up mode |
icyzkungz | 17:51ac4252fa1a | 670 | while(!button); |
icyzkungz | 17:51ac4252fa1a | 671 | pc.printf("Switch Mode\n"); |
icyzkungz | 17:51ac4252fa1a | 672 | SwMode(); |
icyzkungz | 17:51ac4252fa1a | 673 | } |
icyzkungz | 11:fceaaa7e120a | 674 | |
icyzkungz | 11:fceaaa7e120a | 675 | /*while(1){ |
icyzkungz | 11:fceaaa7e120a | 676 | Kinematic test('P',10,15,10,10); |
icyzkungz | 11:fceaaa7e120a | 677 | pc.printf("\n\nLink Hip : %f, Link Knee : %f, Position Y : %f, Position Z : %f\n",test.get_Link_Hip(),test.get_Link_Knee(),test.get_Position_Y(),test.get_Position_Z()); |
icyzkungz | 11:fceaaa7e120a | 678 | pc.printf("Zeta Hip : %f, Zeta Knee : %f\n",test.get_Zeta_Hip(),test.get_Zeta_Knee()); |
icyzkungz | 11:fceaaa7e120a | 679 | test.set_Link_Hip(25); |
icyzkungz | 11:fceaaa7e120a | 680 | test.set_Link_Knee(30); |
icyzkungz | 11:fceaaa7e120a | 681 | test.set_Position_Y(35); |
icyzkungz | 11:fceaaa7e120a | 682 | test.set_Position_Z(40); |
icyzkungz | 11:fceaaa7e120a | 683 | test.set_Zeta_Hip(45); |
icyzkungz | 11:fceaaa7e120a | 684 | test.set_Zeta_Knee(50); |
icyzkungz | 11:fceaaa7e120a | 685 | pc.printf("\nLink Hip : %f, Link Knee : %f, Position Y : %f, Position Z : %f\n",test.get_Link_Hip(),test.get_Link_Knee(),test.get_Position_Y(),test.get_Position_Z()); |
icyzkungz | 11:fceaaa7e120a | 686 | pc.printf("Zeta Hip : %f, Zeta Knee : %f\n",test.get_Zeta_Hip(),test.get_Zeta_Knee()); |
icyzkungz | 11:fceaaa7e120a | 687 | |
icyzkungz | 11:fceaaa7e120a | 688 | while(1); |
icyzkungz | 11:fceaaa7e120a | 689 | }*/ |
icyzkungz | 6:fa132fd505ce | 690 | |
soulx | 3:3e04c1c03cab | 691 | |
soulx | 3:3e04c1c03cab | 692 | |
soulx | 3:3e04c1c03cab | 693 | //Set up I2C |
soulx | 3:3e04c1c03cab | 694 | i2c.frequency(400000); // use fast (400 kHz) I2C |
onehorse | 0:2e5e65a6fb30 | 695 | |
soulx | 3:3e04c1c03cab | 696 | pc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock); |
soulx | 3:3e04c1c03cab | 697 | |
soulx | 3:3e04c1c03cab | 698 | t.start(); |
soulx | 3:3e04c1c03cab | 699 | |
soulx | 3:3e04c1c03cab | 700 | //mpu9250.resetMPU9250(); |
soulx | 3:3e04c1c03cab | 701 | // Read the WHO_AM_I register, this is a good test of communication |
soulx | 3:3e04c1c03cab | 702 | uint8_t whoami = mpu9250.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); // Read WHO_AM_I register for MPU-9250 |
soulx | 3:3e04c1c03cab | 703 | pc.printf("I AM 0x%x\n\r", whoami); |
soulx | 3:3e04c1c03cab | 704 | pc.printf("I SHOULD BE 0x71\n\r"); |
soulx | 3:3e04c1c03cab | 705 | |
soulx | 3:3e04c1c03cab | 706 | if (whoami == 0x71) { // WHO_AM_I should always be 0x68 |
soulx | 3:3e04c1c03cab | 707 | pc.printf("MPU9250 WHO_AM_I is 0x%x\n\r", whoami); |
soulx | 3:3e04c1c03cab | 708 | pc.printf("MPU9250 is online...\n\r"); |
soulx | 3:3e04c1c03cab | 709 | sprintf(buffer, "0x%x", whoami); |
soulx | 3:3e04c1c03cab | 710 | wait(1); |
soulx | 3:3e04c1c03cab | 711 | |
soulx | 3:3e04c1c03cab | 712 | mpu9250.resetMPU9250(); // Reset registers to default in preparation for device calibration |
soulx | 3:3e04c1c03cab | 713 | mpu9250.MPU9250SelfTest(SelfTest); // Start by performing self test and reporting values |
soulx | 3:3e04c1c03cab | 714 | pc.printf("x-axis self test: acceleration trim within : %f % of factory value\n\r", SelfTest[0]); |
soulx | 3:3e04c1c03cab | 715 | pc.printf("y-axis self test: acceleration trim within : %f % of factory value\n\r", SelfTest[1]); |
soulx | 3:3e04c1c03cab | 716 | pc.printf("z-axis self test: acceleration trim within : %f % of factory value\n\r", SelfTest[2]); |
soulx | 3:3e04c1c03cab | 717 | pc.printf("x-axis self test: gyration trim within : %f % of factory value\n\r", SelfTest[3]); |
soulx | 3:3e04c1c03cab | 718 | pc.printf("y-axis self test: gyration trim within : %f % of factory value\n\r", SelfTest[4]); |
soulx | 3:3e04c1c03cab | 719 | pc.printf("z-axis self test: gyration trim within : %f % of factory value\n\r", SelfTest[5]); |
soulx | 3:3e04c1c03cab | 720 | mpu9250.calibrateMPU9250(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers |
soulx | 3:3e04c1c03cab | 721 | pc.printf("x gyro bias = %f\n\r", gyroBias[0]); |
soulx | 3:3e04c1c03cab | 722 | pc.printf("y gyro bias = %f\n\r", gyroBias[1]); |
soulx | 3:3e04c1c03cab | 723 | pc.printf("z gyro bias = %f\n\r", gyroBias[2]); |
soulx | 3:3e04c1c03cab | 724 | pc.printf("x accel bias = %f\n\r", accelBias[0]); |
soulx | 3:3e04c1c03cab | 725 | pc.printf("y accel bias = %f\n\r", accelBias[1]); |
soulx | 3:3e04c1c03cab | 726 | pc.printf("z accel bias = %f\n\r", accelBias[2]); |
soulx | 3:3e04c1c03cab | 727 | wait(2); |
soulx | 3:3e04c1c03cab | 728 | mpu9250.initMPU9250(); |
soulx | 3:3e04c1c03cab | 729 | pc.printf("MPU9250 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature |
soulx | 3:3e04c1c03cab | 730 | mpu9250.initAK8963(magCalibration); |
soulx | 3:3e04c1c03cab | 731 | pc.printf("AK8963 initialized for active data mode....\n\r"); // Initialize device for active mode read of magnetometer |
soulx | 3:3e04c1c03cab | 732 | |
soulx | 3:3e04c1c03cab | 733 | whoami = mpu9250.readByte(AK8963_ADDRESS, WHO_AM_I_AK8963); // Read WHO_AM_I register for MPU-9250 |
soulx | 3:3e04c1c03cab | 734 | pc.printf("I AM 0x%x\n\r", whoami); |
soulx | 3:3e04c1c03cab | 735 | pc.printf("I SHOULD BE 0x48\n\r"); |
soulx | 3:3e04c1c03cab | 736 | if(whoami != 0x48) { |
soulx | 3:3e04c1c03cab | 737 | while(1); |
soulx | 3:3e04c1c03cab | 738 | } |
soulx | 3:3e04c1c03cab | 739 | pc.printf("Accelerometer full-scale range = %f g\n\r", 2.0f*(float)(1<<Ascale)); |
soulx | 3:3e04c1c03cab | 740 | pc.printf("Gyroscope full-scale range = %f deg/s\n\r", 250.0f*(float)(1<<Gscale)); |
soulx | 3:3e04c1c03cab | 741 | if(Mscale == 0) pc.printf("Magnetometer resolution = 14 bits\n\r"); |
soulx | 3:3e04c1c03cab | 742 | if(Mscale == 1) pc.printf("Magnetometer resolution = 16 bits\n\r"); |
soulx | 3:3e04c1c03cab | 743 | if(Mmode == 2) pc.printf("Magnetometer ODR = 8 Hz\n\r"); |
soulx | 3:3e04c1c03cab | 744 | if(Mmode == 6) pc.printf("Magnetometer ODR = 100 Hz\n\r"); |
soulx | 3:3e04c1c03cab | 745 | wait(1); |
soulx | 3:3e04c1c03cab | 746 | } else { |
soulx | 3:3e04c1c03cab | 747 | pc.printf("Could not connect to MPU9250: \n\r"); |
soulx | 3:3e04c1c03cab | 748 | pc.printf("%#x \n", whoami); |
soulx | 3:3e04c1c03cab | 749 | |
soulx | 3:3e04c1c03cab | 750 | sprintf(buffer, "WHO_AM_I 0x%x", whoami); |
soulx | 3:3e04c1c03cab | 751 | |
soulx | 3:3e04c1c03cab | 752 | while(1) ; // Loop forever if communication doesn't happen |
onehorse | 0:2e5e65a6fb30 | 753 | } |
onehorse | 0:2e5e65a6fb30 | 754 | |
onehorse | 0:2e5e65a6fb30 | 755 | mpu9250.getAres(); // Get accelerometer sensitivity |
onehorse | 0:2e5e65a6fb30 | 756 | mpu9250.getGres(); // Get gyro sensitivity |
onehorse | 0:2e5e65a6fb30 | 757 | mpu9250.getMres(); // Get magnetometer sensitivity |
onehorse | 0:2e5e65a6fb30 | 758 | pc.printf("Accelerometer sensitivity is %f LSB/g \n\r", 1.0f/aRes); |
onehorse | 0:2e5e65a6fb30 | 759 | pc.printf("Gyroscope sensitivity is %f LSB/deg/s \n\r", 1.0f/gRes); |
onehorse | 0:2e5e65a6fb30 | 760 | pc.printf("Magnetometer sensitivity is %f LSB/G \n\r", 1.0f/mRes); |
icyzkungz | 6:fa132fd505ce | 761 | |
icyzkungz | 6:fa132fd505ce | 762 | /*pc.printf("START scan mag\n\r\n\r\n\r"); |
icyzkungz | 6:fa132fd505ce | 763 | //wait(1); |
icyzkungz | 6:fa132fd505ce | 764 | for(int i=0; i<4000; i++) { |
icyzkungz | 6:fa132fd505ce | 765 | mpu9250.readMagData(magCount); |
soulx | 3:3e04c1c03cab | 766 | |
icyzkungz | 6:fa132fd505ce | 767 | if(magCount[0]<xmin) |
icyzkungz | 6:fa132fd505ce | 768 | xmin = magCount[0]; |
icyzkungz | 6:fa132fd505ce | 769 | if(magCount[0]>xmax) |
icyzkungz | 6:fa132fd505ce | 770 | xmax = magCount[0]; |
icyzkungz | 6:fa132fd505ce | 771 | |
icyzkungz | 6:fa132fd505ce | 772 | if(magCount[1]<ymin) |
icyzkungz | 6:fa132fd505ce | 773 | ymin = magCount[1]; |
icyzkungz | 6:fa132fd505ce | 774 | if(magCount[1]>ymax) |
icyzkungz | 6:fa132fd505ce | 775 | ymax = magCount[1]; |
icyzkungz | 6:fa132fd505ce | 776 | |
icyzkungz | 6:fa132fd505ce | 777 | if(magCount[2]<zmin) |
icyzkungz | 6:fa132fd505ce | 778 | zmin = magCount[2]; |
icyzkungz | 6:fa132fd505ce | 779 | if(magCount[2]>zmax) |
icyzkungz | 6:fa132fd505ce | 780 | zmax = magCount[2]; |
soulx | 3:3e04c1c03cab | 781 | |
soulx | 3:3e04c1c03cab | 782 | |
icyzkungz | 6:fa132fd505ce | 783 | wait_ms(10); |
soulx | 3:3e04c1c03cab | 784 | } |
soulx | 3:3e04c1c03cab | 785 | pc.printf("FINISH scan\r\n\r\n"); |
soulx | 3:3e04c1c03cab | 786 | pc.printf("Mx Max= %f Min= %f\n\r",xmax,xmin); |
soulx | 3:3e04c1c03cab | 787 | pc.printf("My Max= %f Min= %f\n\r",ymax,ymin); |
icyzkungz | 6:fa132fd505ce | 788 | pc.printf("Mz Max= %f Min= %f\n\r",zmax,zmin);*/ |
icyzkungz | 6:fa132fd505ce | 789 | |
icyzkungz | 6:fa132fd505ce | 790 | /*xmax = 188.000000; |
icyzkungz | 6:fa132fd505ce | 791 | xmin = -316.000000; |
icyzkungz | 6:fa132fd505ce | 792 | ymax = 485.000000; |
icyzkungz | 6:fa132fd505ce | 793 | ymin = -26.000000; |
icyzkungz | 6:fa132fd505ce | 794 | zmax = 165.000000; |
icyzkungz | 6:fa132fd505ce | 795 | xmin = -230.000000; |
soulx | 3:3e04c1c03cab | 796 | |
icyzkungz | 6:fa132fd505ce | 797 | //Ice room |
icyzkungz | 6:fa132fd505ce | 798 | xmax = 101.000000; |
icyzkungz | 6:fa132fd505ce | 799 | xmin = -296.000000; |
icyzkungz | 6:fa132fd505ce | 800 | ymax = 320.000000; |
icyzkungz | 6:fa132fd505ce | 801 | ymin = -85.000000; |
icyzkungz | 6:fa132fd505ce | 802 | zmax = 208.000000; |
icyzkungz | 6:fa132fd505ce | 803 | xmin = -202.000000; |
icyzkungz | 6:fa132fd505ce | 804 | |
icyzkungz | 6:fa132fd505ce | 805 | xmax = 115.000000; |
icyzkungz | 6:fa132fd505ce | 806 | xmin = -309.000000; |
icyzkungz | 6:fa132fd505ce | 807 | ymax = 350.000000; |
icyzkungz | 6:fa132fd505ce | 808 | ymin = -119.000000; |
icyzkungz | 6:fa132fd505ce | 809 | zmax = 235.000000; |
icyzkungz | 6:fa132fd505ce | 810 | zmin = -224.000000;*/ |
icyzkungz | 6:fa132fd505ce | 811 | |
icyzkungz | 6:fa132fd505ce | 812 | xmax = 120.000000; |
icyzkungz | 6:fa132fd505ce | 813 | xmin = -306.000000; |
icyzkungz | 6:fa132fd505ce | 814 | ymax = 340.000000; |
icyzkungz | 6:fa132fd505ce | 815 | ymin = -90.000000; |
icyzkungz | 6:fa132fd505ce | 816 | zmax = 219.000000; |
icyzkungz | 6:fa132fd505ce | 817 | zmin = -195.000000; |
soulx | 3:3e04c1c03cab | 818 | |
soulx | 3:3e04c1c03cab | 819 | |
soulx | 3:3e04c1c03cab | 820 | |
soulx | 4:1e5db958fd1b | 821 | magbias[0] = -1.0; |
soulx | 4:1e5db958fd1b | 822 | magbias[1] = -1.0; |
soulx | 4:1e5db958fd1b | 823 | magbias[2] = -1.0; |
soulx | 4:1e5db958fd1b | 824 | |
soulx | 4:1e5db958fd1b | 825 | magCalibration[0] = 2.0f / (xmax -xmin); |
soulx | 4:1e5db958fd1b | 826 | magCalibration[1] = 2.0f / (ymax -ymin); |
soulx | 4:1e5db958fd1b | 827 | magCalibration[2] = 2.0f / (zmax -zmin); |
soulx | 4:1e5db958fd1b | 828 | |
soulx | 3:3e04c1c03cab | 829 | //magbias[0] = (xmin-xmax)/2.0f; // User environmental x-axis correction in milliGauss, should be automatically calculated |
soulx | 3:3e04c1c03cab | 830 | //magbias[1] = (ymin-ymax)/2.0f; // User environmental x-axis correction in milliGauss |
soulx | 3:3e04c1c03cab | 831 | //magbias[2] = (zmin-zmax)/2.0f; // User environmental x-axis correction in milliGauss |
icyzkungz | 6:fa132fd505ce | 832 | pc.printf("mag[0] %f",magbias[0]); |
icyzkungz | 6:fa132fd505ce | 833 | pc.printf("mag[1] %f",magbias[1]); |
icyzkungz | 6:fa132fd505ce | 834 | pc.printf("mag[2] %f\n\r",magbias[2]); |
soulx | 3:3e04c1c03cab | 835 | // resalt = atan(magY+((yMin-yMax)/2),magX+(xMin-xMax)/2))*180/PI; |
onehorse | 0:2e5e65a6fb30 | 836 | |
soulx | 3:3e04c1c03cab | 837 | |
icyzkungz | 6:fa132fd505ce | 838 | float temp_time; |
icyzkungz | 6:fa132fd505ce | 839 | |
soulx | 3:3e04c1c03cab | 840 | while(1) { |
icyzkungz | 6:fa132fd505ce | 841 | temp_time = t.read(); |
soulx | 3:3e04c1c03cab | 842 | // If intPin goes high, all data registers have new data |
soulx | 3:3e04c1c03cab | 843 | if(mpu9250.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { // On interrupt, check if data ready interrupt |
soulx | 3:3e04c1c03cab | 844 | |
soulx | 3:3e04c1c03cab | 845 | mpu9250.readAccelData(accelCount); // Read the x/y/z adc values |
soulx | 3:3e04c1c03cab | 846 | // Now we'll calculate the accleration value into actual g's |
soulx | 3:3e04c1c03cab | 847 | ax = (float)accelCount[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set |
soulx | 3:3e04c1c03cab | 848 | ay = (float)accelCount[1]*aRes - accelBias[1]; |
soulx | 3:3e04c1c03cab | 849 | az = (float)accelCount[2]*aRes - accelBias[2]; |
soulx | 3:3e04c1c03cab | 850 | |
soulx | 3:3e04c1c03cab | 851 | mpu9250.readGyroData(gyroCount); // Read the x/y/z adc values |
soulx | 3:3e04c1c03cab | 852 | // Calculate the gyro value into actual degrees per second |
soulx | 3:3e04c1c03cab | 853 | gx = (float)gyroCount[0]*gRes - gyroBias[0]; // get actual gyro value, this depends on scale being set |
soulx | 3:3e04c1c03cab | 854 | gy = (float)gyroCount[1]*gRes - gyroBias[1]; |
soulx | 3:3e04c1c03cab | 855 | gz = (float)gyroCount[2]*gRes - gyroBias[2]; |
soulx | 3:3e04c1c03cab | 856 | |
soulx | 3:3e04c1c03cab | 857 | mpu9250.readMagData(magCount); // Read the x/y/z adc values |
soulx | 3:3e04c1c03cab | 858 | // Calculate the magnetometer values in milliGauss |
soulx | 3:3e04c1c03cab | 859 | // Include factory calibration per data sheet and user environmental corrections |
icyzkungz | 6:fa132fd505ce | 860 | /* if(magCount[0]<xmin) |
icyzkungz | 6:fa132fd505ce | 861 | xmin = magCount[0]; |
icyzkungz | 6:fa132fd505ce | 862 | if(magCount[0]>xmax) |
icyzkungz | 6:fa132fd505ce | 863 | xmax = magCount[0]; |
soulx | 3:3e04c1c03cab | 864 | |
icyzkungz | 6:fa132fd505ce | 865 | if(magCount[1]<ymin) |
icyzkungz | 6:fa132fd505ce | 866 | ymin = magCount[1]; |
icyzkungz | 6:fa132fd505ce | 867 | if(magCount[1]>ymax) |
icyzkungz | 6:fa132fd505ce | 868 | ymax = magCount[1]; |
soulx | 3:3e04c1c03cab | 869 | |
icyzkungz | 6:fa132fd505ce | 870 | if(magCount[2]<zmin) |
icyzkungz | 6:fa132fd505ce | 871 | zmin = magCount[2]; |
icyzkungz | 6:fa132fd505ce | 872 | if(mz>zmax) |
icyzkungz | 6:fa132fd505ce | 873 | zmax = mz; |
icyzkungz | 6:fa132fd505ce | 874 | wait_ms(1); |
icyzkungz | 6:fa132fd505ce | 875 | */ |
icyzkungz | 6:fa132fd505ce | 876 | // pc.printf("FINISH scan\r\n\r\n"); |
soulx | 3:3e04c1c03cab | 877 | |
soulx | 4:1e5db958fd1b | 878 | // mx = (float)magCount[0]*mRes*magCalibration[0] + magbias[0]; // get actual magnetometer value, this depends on scale being set |
soulx | 4:1e5db958fd1b | 879 | // my = (float)magCount[1]*mRes*magCalibration[1] + magbias[1]; |
soulx | 4:1e5db958fd1b | 880 | // mz = (float)magCount[2]*mRes*magCalibration[2] + magbias[2]; |
soulx | 4:1e5db958fd1b | 881 | |
soulx | 4:1e5db958fd1b | 882 | mx = ((float)magCount[0]-xmin)*magCalibration[0] + magbias[0]; // get actual magnetometer value, this depends on scale being set |
soulx | 4:1e5db958fd1b | 883 | my = ((float)magCount[1]-ymin)*magCalibration[1] + magbias[1]; |
soulx | 4:1e5db958fd1b | 884 | mz = ((float)magCount[2]-zmin)*magCalibration[2] + magbias[2]; |
soulx | 3:3e04c1c03cab | 885 | |
soulx | 3:3e04c1c03cab | 886 | // mx = (float)magCount[0]*1.499389499f - magbias[0]; // get actual magnetometer value, this depends on scale being set |
soulx | 3:3e04c1c03cab | 887 | // my = (float)magCount[1]*1.499389499f - magbias[1]; |
soulx | 3:3e04c1c03cab | 888 | // mz = (float)magCount[2]*1.499389499f - magbias[2]; |
soulx | 3:3e04c1c03cab | 889 | |
soulx | 3:3e04c1c03cab | 890 | |
soulx | 3:3e04c1c03cab | 891 | |
soulx | 3:3e04c1c03cab | 892 | |
soulx | 3:3e04c1c03cab | 893 | } |
soulx | 3:3e04c1c03cab | 894 | |
soulx | 3:3e04c1c03cab | 895 | Now = t.read_us(); |
soulx | 3:3e04c1c03cab | 896 | deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update |
soulx | 3:3e04c1c03cab | 897 | lastUpdate = Now; |
soulx | 3:3e04c1c03cab | 898 | |
soulx | 3:3e04c1c03cab | 899 | sum += deltat; |
soulx | 3:3e04c1c03cab | 900 | sumCount++; |
soulx | 3:3e04c1c03cab | 901 | |
onehorse | 0:2e5e65a6fb30 | 902 | // if(lastUpdate - firstUpdate > 10000000.0f) { |
onehorse | 0:2e5e65a6fb30 | 903 | // beta = 0.04; // decrease filter gain after stabilized |
onehorse | 0:2e5e65a6fb30 | 904 | // zeta = 0.015; // increasey bias drift gain after stabilized |
soulx | 3:3e04c1c03cab | 905 | // } |
soulx | 3:3e04c1c03cab | 906 | |
soulx | 3:3e04c1c03cab | 907 | // Pass gyro rate as rad/s |
icyzkungz | 6:fa132fd505ce | 908 | //mpu9250.MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
icyzkungz | 6:fa132fd505ce | 909 | mpu9250.MahonyQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
soulx | 3:3e04c1c03cab | 910 | |
soulx | 3:3e04c1c03cab | 911 | // Serial print and/or display at 0.5 s rate independent of data rates |
soulx | 3:3e04c1c03cab | 912 | delt_t = t.read_ms() - count; |
icyzkungz | 6:fa132fd505ce | 913 | if(temp_time > 8) { |
icyzkungz | 6:fa132fd505ce | 914 | if (delt_t > 500) { // update LCD once per half-second independent of read rate |
soulx | 3:3e04c1c03cab | 915 | |
icyzkungz | 6:fa132fd505ce | 916 | /*pc.printf("ax = %f", 1000*ax); |
icyzkungz | 6:fa132fd505ce | 917 | pc.printf(" ay = %f", 1000*ay); |
icyzkungz | 6:fa132fd505ce | 918 | pc.printf(" az = %f mg\n\r", 1000*az); |
onehorse | 0:2e5e65a6fb30 | 919 | |
icyzkungz | 6:fa132fd505ce | 920 | pc.printf("gx = %f", gx); |
icyzkungz | 6:fa132fd505ce | 921 | pc.printf(" gy = %f", gy); |
icyzkungz | 6:fa132fd505ce | 922 | pc.printf(" gz = %f deg/s\n\r", gz); |
soulx | 3:3e04c1c03cab | 923 | |
icyzkungz | 6:fa132fd505ce | 924 | pc.printf("mx = %f", mx); |
icyzkungz | 6:fa132fd505ce | 925 | pc.printf(" my = %f", my); |
icyzkungz | 6:fa132fd505ce | 926 | pc.printf(" mz = %f mG\n\r", mz);*/ |
onehorse | 0:2e5e65a6fb30 | 927 | |
icyzkungz | 6:fa132fd505ce | 928 | whoami = mpu9250.readByte(AK8963_ADDRESS, AK8963_ST2); // Read WHO_AM_I register for MPU-9250 |
icyzkungz | 6:fa132fd505ce | 929 | // pc.printf("I AM 0x%x\n\r", whoami); pc.printf("I SHOULD BE 0x10\n\r"); |
icyzkungz | 6:fa132fd505ce | 930 | if(whoami == 0x14) { |
icyzkungz | 6:fa132fd505ce | 931 | pc.printf("I AM 0x%x\n\r", whoami); |
icyzkungz | 6:fa132fd505ce | 932 | while(1); |
icyzkungz | 6:fa132fd505ce | 933 | } |
soulx | 3:3e04c1c03cab | 934 | |
soulx | 3:3e04c1c03cab | 935 | |
icyzkungz | 6:fa132fd505ce | 936 | tempCount = mpu9250.readTempData(); // Read the adc values |
icyzkungz | 6:fa132fd505ce | 937 | temperature = ((float) tempCount) / 333.87f + 21.0f; // Temperature in degrees Centigrade |
icyzkungz | 6:fa132fd505ce | 938 | //pc.printf(" temperature = %f C\n\r", temperature); |
onehorse | 0:2e5e65a6fb30 | 939 | |
icyzkungz | 6:fa132fd505ce | 940 | // pc.printf("q0 = %f\n\r", q[0]); |
icyzkungz | 6:fa132fd505ce | 941 | // pc.printf("q1 = %f\n\r", q[1]); |
icyzkungz | 6:fa132fd505ce | 942 | // pc.printf("q2 = %f\n\r", q[2]); |
icyzkungz | 6:fa132fd505ce | 943 | // pc.printf("q3 = %f\n\r", q[3]); |
onehorse | 0:2e5e65a6fb30 | 944 | |
icyzkungz | 6:fa132fd505ce | 945 | // Define output variables from updated quaternion---these are Tait-Bryan angles, commonly used in aircraft orientation. |
icyzkungz | 6:fa132fd505ce | 946 | // In this coordinate system, the positive z-axis is down toward Earth. |
icyzkungz | 6:fa132fd505ce | 947 | // Yaw is the angle between Sensor x-axis and Earth magnetic North (or true North if corrected for local declination, looking down on the sensor positive yaw is counterclockwise. |
icyzkungz | 6:fa132fd505ce | 948 | // Pitch is angle between sensor x-axis and Earth ground plane, toward the Earth is positive, up toward the sky is negative. |
icyzkungz | 6:fa132fd505ce | 949 | // Roll is angle between sensor y-axis and Earth ground plane, y-axis up is positive roll. |
icyzkungz | 6:fa132fd505ce | 950 | // These arise from the definition of the homogeneous rotation matrix constructed from quaternions. |
icyzkungz | 6:fa132fd505ce | 951 | // Tait-Bryan angles as well as Euler angles are non-commutative; that is, the get the correct orientation the rotations must be |
icyzkungz | 6:fa132fd505ce | 952 | // applied in the correct order which for this configuration is yaw, pitch, and then roll. |
icyzkungz | 6:fa132fd505ce | 953 | // For more see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles which has additional links. |
icyzkungz | 6:fa132fd505ce | 954 | yaw = atan2(2.0f * (q[1] * q[2] + q[0] * q[3]), q[0] * q[0] + q[1] * q[1] - q[2] * q[2] - q[3] * q[3]); |
icyzkungz | 6:fa132fd505ce | 955 | pitch = -asin(2.0f * (q[1] * q[3] - q[0] * q[2])); |
icyzkungz | 6:fa132fd505ce | 956 | roll = atan2(2.0f * (q[0] * q[1] + q[2] * q[3]), q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3]); |
soulx | 3:3e04c1c03cab | 957 | |
icyzkungz | 6:fa132fd505ce | 958 | float Xh = mx*cos(pitch)+my*sin(roll)*sin(pitch)-mz*cos(roll)*sin(pitch); |
icyzkungz | 6:fa132fd505ce | 959 | float Yh = my*cos(roll)+mz*sin(roll); |
soulx | 3:3e04c1c03cab | 960 | |
icyzkungz | 6:fa132fd505ce | 961 | float yawmag = atan2(Yh,Xh)+PI; |
icyzkungz | 6:fa132fd505ce | 962 | //pc.printf("Xh= %f Yh= %f ",Xh,Yh); |
icyzkungz | 6:fa132fd505ce | 963 | //pc.printf("Yaw[mag]= %f\n\r",yawmag*180.0f/PI); |
soulx | 3:3e04c1c03cab | 964 | |
soulx | 3:3e04c1c03cab | 965 | |
soulx | 3:3e04c1c03cab | 966 | |
icyzkungz | 6:fa132fd505ce | 967 | pitch *= 180.0f / PI; |
icyzkungz | 6:fa132fd505ce | 968 | yaw *= 180.0f / PI; |
icyzkungz | 6:fa132fd505ce | 969 | yaw += 180.0f; // Declination at Danville, California is 13 degrees 48 minutes and 47 seconds on 2014-04-04 |
icyzkungz | 6:fa132fd505ce | 970 | roll *= 180.0f / PI; |
icyzkungz | 6:fa132fd505ce | 971 | |
icyzkungz | 6:fa132fd505ce | 972 | pc.printf("Yaw, Pitch, Roll: %f %f %f\n\r", yaw, pitch, roll); |
icyzkungz | 6:fa132fd505ce | 973 | //pc.printf("average rate = %f\n\r", (float) sumCount/sum); |
icyzkungz | 6:fa132fd505ce | 974 | |
icyzkungz | 6:fa132fd505ce | 975 | |
soulx | 19:5b8d16378d66 | 976 | //WheelChair(); |
soulx | 3:3e04c1c03cab | 977 | |
soulx | 3:3e04c1c03cab | 978 | |
icyzkungz | 6:fa132fd505ce | 979 | myled= !myled; |
icyzkungz | 6:fa132fd505ce | 980 | count = t.read_ms(); |
onehorse | 0:2e5e65a6fb30 | 981 | |
icyzkungz | 6:fa132fd505ce | 982 | if(count > 1<<21) { |
icyzkungz | 6:fa132fd505ce | 983 | t.start(); // start the timer over again if ~30 minutes has passed |
icyzkungz | 6:fa132fd505ce | 984 | count = 0; |
icyzkungz | 6:fa132fd505ce | 985 | deltat= 0; |
icyzkungz | 6:fa132fd505ce | 986 | lastUpdate = t.read_us(); |
icyzkungz | 6:fa132fd505ce | 987 | } |
icyzkungz | 6:fa132fd505ce | 988 | sum = 0; |
icyzkungz | 6:fa132fd505ce | 989 | sumCount = 0; |
soulx | 3:3e04c1c03cab | 990 | } |
soulx | 3:3e04c1c03cab | 991 | } |
onehorse | 0:2e5e65a6fb30 | 992 | } |
onehorse | 0:2e5e65a6fb30 | 993 | } |