![](/media/cache/profiles/1129cb8ba4665189d5a9bd861a2e28b9.jpg.50x50_q85.jpg)
GifuRobo B term
Dependencies: FastPWM cal_PID mbed omuni
Fork of omuni_speed_pid by
main.cpp@3:6223efea43fe, 2017-08-28 (annotated)
- Committer:
- Akito914
- Date:
- Mon Aug 28 07:27:23 2017 +0000
- Revision:
- 3:6223efea43fe
- Parent:
- 2:c9de02d6d154
- Child:
- 4:5591d3c8a761
???????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sawai | 0:6da7d0e457a2 | 1 | #include "mbed.h" |
sawai | 0:6da7d0e457a2 | 2 | #include "omuni.hpp" |
Akito914 | 1:baab5b88a142 | 3 | #include "cal_PID.hpp" |
Akito914 | 2:c9de02d6d154 | 4 | #include "timeBaseTrapezoidalMotionCal.h" |
sawai | 0:6da7d0e457a2 | 5 | |
Akito914 | 3:6223efea43fe | 6 | const float omuni_speed[4] = {0, 1.0, 1.7, 3.0}; |
Akito914 | 3:6223efea43fe | 7 | const float omega_max = 0.7 * 2 * 3.14159265f; |
Akito914 | 3:6223efea43fe | 8 | const float wrap_radius = 1.0f; |
Akito914 | 3:6223efea43fe | 9 | const float wrap_speed = 1.7f; |
Akito914 | 1:baab5b88a142 | 10 | const int8_t armDuty[] = {-50, -50}; |
Akito914 | 1:baab5b88a142 | 11 | const signed int spearDuty = 127; |
Akito914 | 3:6223efea43fe | 12 | const int32_t lift_preset_min = 420; |
Akito914 | 3:6223efea43fe | 13 | const int32_t lift_preset_max = 1800; |
Akito914 | 3:6223efea43fe | 14 | const int32_t lift_preset[4] = { |
Akito914 | 3:6223efea43fe | 15 | lift_preset_min, |
Akito914 | 3:6223efea43fe | 16 | (lift_preset_max - lift_preset_min) / 3.0 + lift_preset_min, |
Akito914 | 3:6223efea43fe | 17 | (lift_preset_max - lift_preset_min) * 2.0 / 3.0 + lift_preset_min, |
Akito914 | 3:6223efea43fe | 18 | lift_preset_max, |
Akito914 | 3:6223efea43fe | 19 | }; // 12bit 0 ~ 4095 |
Akito914 | 3:6223efea43fe | 20 | const int32_t lift_max = lift_preset_max; |
Akito914 | 3:6223efea43fe | 21 | const int32_t lift_min = lift_preset_min; |
Akito914 | 3:6223efea43fe | 22 | const int32_t lift_up_speed = 30; |
Akito914 | 3:6223efea43fe | 23 | const int32_t lift_down_speed = 30; |
Akito914 | 3:6223efea43fe | 24 | |
Akito914 | 1:baab5b88a142 | 25 | |
Akito914 | 1:baab5b88a142 | 26 | const int omuniAddr[] = {0x10, 0x12, 0x14}; // 0000 , 1000 , 0100 |
Akito914 | 1:baab5b88a142 | 27 | const int armAddr[] = {0x16, 0x18}; // 1100 , 0010 |
Akito914 | 1:baab5b88a142 | 28 | const int spearAddr = 0x1a; // 1010 |
Akito914 | 1:baab5b88a142 | 29 | const int liftAddr = 0x1c; // 0110 |
Akito914 | 1:baab5b88a142 | 30 | |
Akito914 | 1:baab5b88a142 | 31 | int drive_motor(int address,signed int duty); |
Akito914 | 1:baab5b88a142 | 32 | void emergencyStop(); |
Akito914 | 1:baab5b88a142 | 33 | |
Akito914 | 1:baab5b88a142 | 34 | bool ems = false; |
Akito914 | 1:baab5b88a142 | 35 | |
sawai | 0:6da7d0e457a2 | 36 | bool arm = false; |
Akito914 | 1:baab5b88a142 | 37 | bool spear = false; |
Akito914 | 2:c9de02d6d154 | 38 | |
Akito914 | 1:baab5b88a142 | 39 | int lift_targ = lift_preset[0]; |
Akito914 | 2:c9de02d6d154 | 40 | int lift_stepTarg; |
Akito914 | 3:6223efea43fe | 41 | bool lift_stepMoving = false; |
Akito914 | 1:baab5b88a142 | 42 | bool first_receive = true; |
Akito914 | 1:baab5b88a142 | 43 | int past_lift_gray = 0b00; |
Akito914 | 1:baab5b88a142 | 44 | int lift_inc = 0; |
Akito914 | 1:baab5b88a142 | 45 | |
Akito914 | 1:baab5b88a142 | 46 | //DigitalIn button(USER_BUTTON); |
Akito914 | 1:baab5b88a142 | 47 | DigitalOut led(LED1); |
sawai | 0:6da7d0e457a2 | 48 | |
sawai | 0:6da7d0e457a2 | 49 | Serial p(USBTX, USBRX); |
sawai | 0:6da7d0e457a2 | 50 | Serial pc(PA_11, PA_12); |
sawai | 0:6da7d0e457a2 | 51 | I2C i2cMaster(D14, D15); |
Akito914 | 1:baab5b88a142 | 52 | omuni omuni(&i2cMaster, TIM1, TIM2, TIM3, 533, 2.0f, omuniAddr, 0.4704f, 0.1f); |
Akito914 | 1:baab5b88a142 | 53 | AnalogIn lift_meter(PC_0); |
Akito914 | 1:baab5b88a142 | 54 | DigitalIn spear_sensor(PC_3); |
Akito914 | 1:baab5b88a142 | 55 | Timer mesPeriod; |
Akito914 | 1:baab5b88a142 | 56 | cal_pid lift_pid; |
Akito914 | 3:6223efea43fe | 57 | |
Akito914 | 1:baab5b88a142 | 58 | |
Akito914 | 1:baab5b88a142 | 59 | float speed_x, speed_y, omega; |
Akito914 | 1:baab5b88a142 | 60 | bool f; |
sawai | 0:6da7d0e457a2 | 61 | |
Akito914 | 1:baab5b88a142 | 62 | typedef union{ |
Akito914 | 1:baab5b88a142 | 63 | struct{ |
Akito914 | 1:baab5b88a142 | 64 | unsigned angle :4; |
Akito914 | 1:baab5b88a142 | 65 | unsigned speed :2; |
Akito914 | 1:baab5b88a142 | 66 | unsigned byteNum0:2; |
Akito914 | 1:baab5b88a142 | 67 | }; |
Akito914 | 1:baab5b88a142 | 68 | struct{ |
Akito914 | 1:baab5b88a142 | 69 | unsigned wrap_R :1; |
Akito914 | 1:baab5b88a142 | 70 | unsigned wrap_L :1; |
Akito914 | 1:baab5b88a142 | 71 | unsigned coorSys :1; |
Akito914 | 1:baab5b88a142 | 72 | unsigned omega :2; |
Akito914 | 1:baab5b88a142 | 73 | unsigned dir :1; |
Akito914 | 1:baab5b88a142 | 74 | unsigned byteNum1 :2; |
Akito914 | 1:baab5b88a142 | 75 | }; |
Akito914 | 1:baab5b88a142 | 76 | struct{ |
Akito914 | 1:baab5b88a142 | 77 | unsigned lift_down :1; |
Akito914 | 1:baab5b88a142 | 78 | unsigned lift_up :1; |
Akito914 | 1:baab5b88a142 | 79 | unsigned lift_gray :2; |
Akito914 | 1:baab5b88a142 | 80 | unsigned spear :1; |
Akito914 | 1:baab5b88a142 | 81 | unsigned arm :1; |
Akito914 | 1:baab5b88a142 | 82 | unsigned byteNum2 :2; |
Akito914 | 1:baab5b88a142 | 83 | }; |
Akito914 | 1:baab5b88a142 | 84 | struct{ |
Akito914 | 1:baab5b88a142 | 85 | unsigned reserved2 :1; |
Akito914 | 1:baab5b88a142 | 86 | unsigned emo :1; |
Akito914 | 1:baab5b88a142 | 87 | unsigned reserved3 :4; |
Akito914 | 1:baab5b88a142 | 88 | unsigned byteNum3 :2; |
Akito914 | 1:baab5b88a142 | 89 | }; |
Akito914 | 1:baab5b88a142 | 90 | struct{ |
Akito914 | 1:baab5b88a142 | 91 | unsigned control :6; |
Akito914 | 1:baab5b88a142 | 92 | unsigned byteNum :2; |
Akito914 | 1:baab5b88a142 | 93 | }; |
Akito914 | 1:baab5b88a142 | 94 | struct{ |
Akito914 | 1:baab5b88a142 | 95 | unsigned bit0:1; |
Akito914 | 1:baab5b88a142 | 96 | unsigned bit1:1; |
Akito914 | 1:baab5b88a142 | 97 | unsigned bit2:1; |
Akito914 | 1:baab5b88a142 | 98 | unsigned bit3:1; |
Akito914 | 1:baab5b88a142 | 99 | unsigned bit4:1; |
Akito914 | 1:baab5b88a142 | 100 | unsigned bit5:1; |
Akito914 | 1:baab5b88a142 | 101 | unsigned bit6:1; |
Akito914 | 1:baab5b88a142 | 102 | unsigned bit7:1; |
Akito914 | 1:baab5b88a142 | 103 | }; |
Akito914 | 1:baab5b88a142 | 104 | int8_t data; |
Akito914 | 1:baab5b88a142 | 105 | }comData_t; |
Akito914 | 1:baab5b88a142 | 106 | |
Akito914 | 1:baab5b88a142 | 107 | |
Akito914 | 1:baab5b88a142 | 108 | comData_t RCData[4] = {0}; |
Akito914 | 1:baab5b88a142 | 109 | |
Akito914 | 1:baab5b88a142 | 110 | int grayDiffer2bit(int gray, int origin){ |
Akito914 | 1:baab5b88a142 | 111 | |
Akito914 | 1:baab5b88a142 | 112 | switch(origin){ |
Akito914 | 1:baab5b88a142 | 113 | case 0b00: |
Akito914 | 1:baab5b88a142 | 114 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 115 | case 0b01: return 1; |
Akito914 | 1:baab5b88a142 | 116 | case 0b10: return -1; |
Akito914 | 1:baab5b88a142 | 117 | default : return 0; |
Akito914 | 1:baab5b88a142 | 118 | } |
Akito914 | 1:baab5b88a142 | 119 | case 0b01: |
Akito914 | 1:baab5b88a142 | 120 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 121 | case 0b11: return 1; |
Akito914 | 1:baab5b88a142 | 122 | case 0b00: return -1; |
Akito914 | 1:baab5b88a142 | 123 | default : return 0; |
Akito914 | 1:baab5b88a142 | 124 | } |
Akito914 | 1:baab5b88a142 | 125 | case 0b11: |
Akito914 | 1:baab5b88a142 | 126 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 127 | case 0b10: return 1; |
Akito914 | 1:baab5b88a142 | 128 | case 0b01: return -1; |
Akito914 | 1:baab5b88a142 | 129 | default : return 0; |
Akito914 | 1:baab5b88a142 | 130 | } |
Akito914 | 1:baab5b88a142 | 131 | case 0b10: |
Akito914 | 1:baab5b88a142 | 132 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 133 | case 0b00: return 1; |
Akito914 | 1:baab5b88a142 | 134 | case 0b11: return -1; |
Akito914 | 1:baab5b88a142 | 135 | default : return 0; |
Akito914 | 1:baab5b88a142 | 136 | } |
Akito914 | 1:baab5b88a142 | 137 | } |
Akito914 | 1:baab5b88a142 | 138 | return 0; |
Akito914 | 1:baab5b88a142 | 139 | } |
Akito914 | 1:baab5b88a142 | 140 | |
sawai | 0:6da7d0e457a2 | 141 | |
sawai | 0:6da7d0e457a2 | 142 | void pc_rx() |
sawai | 0:6da7d0e457a2 | 143 | { |
Akito914 | 1:baab5b88a142 | 144 | char temp = pc.getc(); |
Akito914 | 1:baab5b88a142 | 145 | comData_t rcTemp; |
Akito914 | 1:baab5b88a142 | 146 | rcTemp.data = temp; |
Akito914 | 1:baab5b88a142 | 147 | float rad, speed; |
Akito914 | 1:baab5b88a142 | 148 | int lift_nearest_num = 0; |
sawai | 0:6da7d0e457a2 | 149 | |
Akito914 | 1:baab5b88a142 | 150 | |
Akito914 | 1:baab5b88a142 | 151 | RCData[rcTemp.byteNum] = rcTemp; |
sawai | 0:6da7d0e457a2 | 152 | |
Akito914 | 1:baab5b88a142 | 153 | /* |
Akito914 | 1:baab5b88a142 | 154 | p.printf("%d",rcTemp.bit7); |
Akito914 | 1:baab5b88a142 | 155 | p.printf("%d",rcTemp.bit6); |
Akito914 | 1:baab5b88a142 | 156 | p.printf("%d",rcTemp.bit5); |
Akito914 | 1:baab5b88a142 | 157 | p.printf("%d",rcTemp.bit4); |
Akito914 | 1:baab5b88a142 | 158 | p.printf("%d",rcTemp.bit3); |
Akito914 | 1:baab5b88a142 | 159 | p.printf("%d",rcTemp.bit2); |
Akito914 | 1:baab5b88a142 | 160 | p.printf("%d",rcTemp.bit1); |
Akito914 | 1:baab5b88a142 | 161 | p.printf("%d",rcTemp.bit0); |
Akito914 | 1:baab5b88a142 | 162 | p.printf("\n"); |
Akito914 | 1:baab5b88a142 | 163 | */ |
Akito914 | 1:baab5b88a142 | 164 | //p.printf("%d\n", rcTemp.byteNum); |
Akito914 | 1:baab5b88a142 | 165 | //p.printf("speed = %d, angle = %d\n",rcTemp.speed, rcTemp.angle); |
sawai | 0:6da7d0e457a2 | 166 | |
Akito914 | 1:baab5b88a142 | 167 | switch(temp >> 6){ |
Akito914 | 1:baab5b88a142 | 168 | case 0: |
Akito914 | 1:baab5b88a142 | 169 | //p.printf("speed = %d, angle = %d\n",rcTemp.speed, rcTemp.angle); |
Akito914 | 1:baab5b88a142 | 170 | break; |
Akito914 | 1:baab5b88a142 | 171 | case 1: |
Akito914 | 1:baab5b88a142 | 172 | //p.printf("dir = %d, omega = %d, coorSys = %d\n", rcTemp.dir, rcTemp.omega, rcTemp.coorSys); |
Akito914 | 1:baab5b88a142 | 173 | break; |
Akito914 | 1:baab5b88a142 | 174 | case 2: |
Akito914 | 1:baab5b88a142 | 175 | //p.printf("arm = %d, spear = %d, lift_gray = %d, lift_up = %d, lift_down = %d\n",rcTemp.arm, rcTemp.spear, rcTemp.lift_gray, rcTemp.lift_up, rcTemp.lift_down); |
Akito914 | 1:baab5b88a142 | 176 | break; |
Akito914 | 1:baab5b88a142 | 177 | case 3: |
Akito914 | 1:baab5b88a142 | 178 | |
Akito914 | 1:baab5b88a142 | 179 | break; |
sawai | 0:6da7d0e457a2 | 180 | } |
sawai | 0:6da7d0e457a2 | 181 | |
Akito914 | 1:baab5b88a142 | 182 | if(rcTemp.byteNum == 3){ // データは揃った |
Akito914 | 1:baab5b88a142 | 183 | |
Akito914 | 3:6223efea43fe | 184 | led = !led; |
Akito914 | 1:baab5b88a142 | 185 | |
Akito914 | 1:baab5b88a142 | 186 | ems = RCData[3].emo != 0; |
Akito914 | 1:baab5b88a142 | 187 | |
Akito914 | 1:baab5b88a142 | 188 | rad = RCData[0].angle * 3.141592 / 8.0; |
Akito914 | 3:6223efea43fe | 189 | speed = omuni_speed[RCData[0].speed]; |
Akito914 | 3:6223efea43fe | 190 | if(RCData[0].speed == 0)speed = 0; |
Akito914 | 1:baab5b88a142 | 191 | speed_x = speed * cos(rad) * -1; |
Akito914 | 1:baab5b88a142 | 192 | speed_y = speed * sin(rad) * -1; |
Akito914 | 1:baab5b88a142 | 193 | |
Akito914 | 1:baab5b88a142 | 194 | f = RCData[1].coorSys; |
Akito914 | 1:baab5b88a142 | 195 | omega = RCData[1].omega * omega_max / 3.0f; |
Akito914 | 1:baab5b88a142 | 196 | omega *= RCData[1].dir ? 1 : -1; |
Akito914 | 1:baab5b88a142 | 197 | |
Akito914 | 1:baab5b88a142 | 198 | |
Akito914 | 1:baab5b88a142 | 199 | if(RCData[1].wrap_R || RCData[1].wrap_L){ |
Akito914 | 1:baab5b88a142 | 200 | speed_x = wrap_speed; |
Akito914 | 1:baab5b88a142 | 201 | speed_y = 0; |
Akito914 | 1:baab5b88a142 | 202 | f = 0; |
Akito914 | 1:baab5b88a142 | 203 | omega = wrap_speed / wrap_radius; |
Akito914 | 1:baab5b88a142 | 204 | speed_x *= RCData[1].wrap_L ? 1 : -1; |
Akito914 | 1:baab5b88a142 | 205 | omega *= RCData[1].wrap_L ? 1 : -1; |
Akito914 | 1:baab5b88a142 | 206 | } |
Akito914 | 1:baab5b88a142 | 207 | |
Akito914 | 1:baab5b88a142 | 208 | |
Akito914 | 1:baab5b88a142 | 209 | arm = RCData[2].arm != 0; |
Akito914 | 1:baab5b88a142 | 210 | |
Akito914 | 1:baab5b88a142 | 211 | spear = RCData[2].spear != 0; |
Akito914 | 1:baab5b88a142 | 212 | |
Akito914 | 1:baab5b88a142 | 213 | if(first_receive){ |
Akito914 | 1:baab5b88a142 | 214 | past_lift_gray = RCData[2].lift_gray; |
Akito914 | 1:baab5b88a142 | 215 | first_receive = false; |
Akito914 | 1:baab5b88a142 | 216 | } |
Akito914 | 1:baab5b88a142 | 217 | if(RCData[2].lift_gray != past_lift_gray){ // 段階移動 |
Akito914 | 2:c9de02d6d154 | 218 | int lift_currentTarg; |
Akito914 | 1:baab5b88a142 | 219 | int lift_diff = 0; |
Akito914 | 1:baab5b88a142 | 220 | int lift_nearest = 10000; |
Akito914 | 2:c9de02d6d154 | 221 | int lift_nextTarg; |
Akito914 | 2:c9de02d6d154 | 222 | |
Akito914 | 2:c9de02d6d154 | 223 | lift_currentTarg = lift_targ; |
Akito914 | 3:6223efea43fe | 224 | if(lift_stepMoving){ |
Akito914 | 3:6223efea43fe | 225 | lift_nextTarg = lift_stepTarg; |
Akito914 | 3:6223efea43fe | 226 | } |
Akito914 | 3:6223efea43fe | 227 | else{ |
Akito914 | 3:6223efea43fe | 228 | lift_nextTarg = lift_currentTarg; |
Akito914 | 3:6223efea43fe | 229 | } |
Akito914 | 2:c9de02d6d154 | 230 | |
Akito914 | 1:baab5b88a142 | 231 | lift_diff = grayDiffer2bit(RCData[2].lift_gray, past_lift_gray); |
Akito914 | 1:baab5b88a142 | 232 | for(int num = 0; num < 4; num++){ // 最寄りの段階 |
Akito914 | 2:c9de02d6d154 | 233 | if(lift_nearest > abs(lift_preset[num] - lift_currentTarg)){ |
Akito914 | 1:baab5b88a142 | 234 | lift_nearest_num = num; |
Akito914 | 2:c9de02d6d154 | 235 | lift_nearest = abs(lift_preset[num] - lift_currentTarg); |
Akito914 | 1:baab5b88a142 | 236 | } |
Akito914 | 1:baab5b88a142 | 237 | } |
Akito914 | 3:6223efea43fe | 238 | if(lift_diff != 0){ |
Akito914 | 3:6223efea43fe | 239 | if(lift_diff == 1){ |
Akito914 | 3:6223efea43fe | 240 | if(lift_preset[lift_nearest_num] >= lift_currentTarg){p.printf("$$"); |
Akito914 | 3:6223efea43fe | 241 | if(lift_nearest_num < 3)lift_nextTarg = lift_preset[lift_nearest_num + 1]; |
Akito914 | 3:6223efea43fe | 242 | } |
Akito914 | 3:6223efea43fe | 243 | else{ |
Akito914 | 3:6223efea43fe | 244 | lift_nextTarg = lift_preset[lift_nearest_num]; |
Akito914 | 3:6223efea43fe | 245 | } |
Akito914 | 1:baab5b88a142 | 246 | } |
Akito914 | 3:6223efea43fe | 247 | else if(lift_diff == -1){ |
Akito914 | 3:6223efea43fe | 248 | if(lift_preset[lift_nearest_num] <= lift_currentTarg){ |
Akito914 | 3:6223efea43fe | 249 | if(lift_nearest_num > 0)lift_nextTarg = lift_preset[lift_nearest_num - 1]; |
Akito914 | 3:6223efea43fe | 250 | } |
Akito914 | 3:6223efea43fe | 251 | else{ |
Akito914 | 3:6223efea43fe | 252 | lift_nextTarg = lift_preset[lift_nearest_num]; |
Akito914 | 3:6223efea43fe | 253 | } |
Akito914 | 1:baab5b88a142 | 254 | } |
Akito914 | 3:6223efea43fe | 255 | |
Akito914 | 3:6223efea43fe | 256 | lift_stepTarg = lift_nextTarg; |
Akito914 | 3:6223efea43fe | 257 | lift_stepMoving = true; |
Akito914 | 3:6223efea43fe | 258 | |
Akito914 | 1:baab5b88a142 | 259 | } |
Akito914 | 3:6223efea43fe | 260 | |
Akito914 | 1:baab5b88a142 | 261 | } |
Akito914 | 1:baab5b88a142 | 262 | past_lift_gray = RCData[2].lift_gray; |
Akito914 | 1:baab5b88a142 | 263 | |
Akito914 | 2:c9de02d6d154 | 264 | if(RCData[2].lift_down != 0)lift_inc = -2; |
Akito914 | 2:c9de02d6d154 | 265 | else if(RCData[2].lift_up != 0)lift_inc = 2; |
Akito914 | 1:baab5b88a142 | 266 | else lift_inc = 0; |
Akito914 | 1:baab5b88a142 | 267 | |
Akito914 | 1:baab5b88a142 | 268 | } // すっきりした // してない |
Akito914 | 1:baab5b88a142 | 269 | |
Akito914 | 1:baab5b88a142 | 270 | } |
Akito914 | 1:baab5b88a142 | 271 | |
Akito914 | 1:baab5b88a142 | 272 | |
Akito914 | 1:baab5b88a142 | 273 | void arm_control(){ |
Akito914 | 1:baab5b88a142 | 274 | char armData[2] = {0}; |
Akito914 | 1:baab5b88a142 | 275 | |
Akito914 | 1:baab5b88a142 | 276 | armData[0] = arm? armDuty[0] : 0 ; |
Akito914 | 1:baab5b88a142 | 277 | armData[1] = arm? armDuty[1] : 0 ; |
Akito914 | 1:baab5b88a142 | 278 | |
Akito914 | 1:baab5b88a142 | 279 | i2cMaster.write(armAddr[0], &armData[0], 1); |
Akito914 | 1:baab5b88a142 | 280 | i2cMaster.write(armAddr[1], &armData[1], 1); |
Akito914 | 1:baab5b88a142 | 281 | |
Akito914 | 1:baab5b88a142 | 282 | } |
Akito914 | 1:baab5b88a142 | 283 | |
Akito914 | 1:baab5b88a142 | 284 | void lift_control(){ |
Akito914 | 1:baab5b88a142 | 285 | int32_t meter = 0; |
Akito914 | 1:baab5b88a142 | 286 | signed int duty = 0; |
Akito914 | 3:6223efea43fe | 287 | int32_t error = 0; |
Akito914 | 1:baab5b88a142 | 288 | |
Akito914 | 3:6223efea43fe | 289 | error = lift_stepTarg - lift_targ; |
Akito914 | 3:6223efea43fe | 290 | if(lift_stepMoving){ |
Akito914 | 3:6223efea43fe | 291 | if(error > lift_up_speed){ |
Akito914 | 3:6223efea43fe | 292 | lift_targ += lift_up_speed; |
Akito914 | 3:6223efea43fe | 293 | } |
Akito914 | 3:6223efea43fe | 294 | else if(error < lift_down_speed * -1){ |
Akito914 | 3:6223efea43fe | 295 | lift_targ -= lift_down_speed; |
Akito914 | 2:c9de02d6d154 | 296 | } |
Akito914 | 2:c9de02d6d154 | 297 | else{ |
Akito914 | 3:6223efea43fe | 298 | lift_targ = lift_stepTarg; |
Akito914 | 3:6223efea43fe | 299 | lift_stepMoving = false; |
Akito914 | 2:c9de02d6d154 | 300 | } |
sawai | 0:6da7d0e457a2 | 301 | } |
Akito914 | 2:c9de02d6d154 | 302 | else{ |
Akito914 | 2:c9de02d6d154 | 303 | if(lift_inc < 0){ |
Akito914 | 2:c9de02d6d154 | 304 | if(lift_min < lift_targ + lift_inc)lift_targ += lift_inc; |
Akito914 | 2:c9de02d6d154 | 305 | } |
Akito914 | 2:c9de02d6d154 | 306 | else if(lift_inc > 0){ |
Akito914 | 2:c9de02d6d154 | 307 | if(lift_max > lift_targ + lift_inc)lift_targ += lift_inc; |
Akito914 | 2:c9de02d6d154 | 308 | } |
sawai | 0:6da7d0e457a2 | 309 | } |
Akito914 | 2:c9de02d6d154 | 310 | |
Akito914 | 1:baab5b88a142 | 311 | meter = lift_meter.read_u16() >> 4; |
Akito914 | 3:6223efea43fe | 312 | duty = lift_pid.get_pid(meter, lift_targ, -1); |
Akito914 | 1:baab5b88a142 | 313 | drive_motor(liftAddr, duty); |
Akito914 | 1:baab5b88a142 | 314 | |
Akito914 | 1:baab5b88a142 | 315 | } |
Akito914 | 1:baab5b88a142 | 316 | |
Akito914 | 1:baab5b88a142 | 317 | void spear_control(){ |
Akito914 | 1:baab5b88a142 | 318 | static int spear_state = 0; |
Akito914 | 1:baab5b88a142 | 319 | signed int duty = 0; |
Akito914 | 1:baab5b88a142 | 320 | int sensor = spear_sensor; // リミット時に1 |
Akito914 | 1:baab5b88a142 | 321 | |
Akito914 | 1:baab5b88a142 | 322 | switch(spear_state){ |
Akito914 | 1:baab5b88a142 | 323 | case 0 : // 待ち |
Akito914 | 1:baab5b88a142 | 324 | if(spear){ |
Akito914 | 1:baab5b88a142 | 325 | spear_state = 1; |
Akito914 | 1:baab5b88a142 | 326 | } |
Akito914 | 1:baab5b88a142 | 327 | else{ |
Akito914 | 1:baab5b88a142 | 328 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 329 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 330 | } |
Akito914 | 1:baab5b88a142 | 331 | } |
Akito914 | 1:baab5b88a142 | 332 | break; |
Akito914 | 1:baab5b88a142 | 333 | case 1 : // 初期位置から抜け出す |
Akito914 | 1:baab5b88a142 | 334 | duty = spearDuty; |
Akito914 | 1:baab5b88a142 | 335 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 336 | spear_state = 2; |
Akito914 | 1:baab5b88a142 | 337 | } |
Akito914 | 1:baab5b88a142 | 338 | break; |
Akito914 | 1:baab5b88a142 | 339 | case 2 : // 到達位置まで動かす |
Akito914 | 1:baab5b88a142 | 340 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 341 | duty = spearDuty; |
Akito914 | 1:baab5b88a142 | 342 | } |
Akito914 | 1:baab5b88a142 | 343 | else{ |
Akito914 | 1:baab5b88a142 | 344 | spear_state = 3; |
Akito914 | 1:baab5b88a142 | 345 | } |
Akito914 | 1:baab5b88a142 | 346 | break; |
Akito914 | 1:baab5b88a142 | 347 | case 3 : // 到達位置から抜け出す |
Akito914 | 1:baab5b88a142 | 348 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 349 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 350 | spear_state = 4; |
Akito914 | 1:baab5b88a142 | 351 | } |
Akito914 | 1:baab5b88a142 | 352 | break; |
Akito914 | 1:baab5b88a142 | 353 | case 4 : // 初期位置まで戻る |
Akito914 | 1:baab5b88a142 | 354 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 355 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 356 | } |
Akito914 | 1:baab5b88a142 | 357 | else{ |
Akito914 | 1:baab5b88a142 | 358 | spear_state = 0; |
Akito914 | 1:baab5b88a142 | 359 | } |
Akito914 | 1:baab5b88a142 | 360 | break; |
Akito914 | 1:baab5b88a142 | 361 | default : |
Akito914 | 1:baab5b88a142 | 362 | break; |
Akito914 | 1:baab5b88a142 | 363 | } |
Akito914 | 1:baab5b88a142 | 364 | drive_motor(spearAddr, duty); |
Akito914 | 1:baab5b88a142 | 365 | } |
Akito914 | 1:baab5b88a142 | 366 | |
Akito914 | 1:baab5b88a142 | 367 | |
Akito914 | 1:baab5b88a142 | 368 | void control(){ |
Akito914 | 1:baab5b88a142 | 369 | |
Akito914 | 1:baab5b88a142 | 370 | arm_control(); |
Akito914 | 1:baab5b88a142 | 371 | lift_control(); |
Akito914 | 1:baab5b88a142 | 372 | spear_control(); |
Akito914 | 1:baab5b88a142 | 373 | |
sawai | 0:6da7d0e457a2 | 374 | } |
sawai | 0:6da7d0e457a2 | 375 | |
sawai | 0:6da7d0e457a2 | 376 | int main() |
sawai | 0:6da7d0e457a2 | 377 | { |
Akito914 | 1:baab5b88a142 | 378 | int period_us = 0; |
Akito914 | 1:baab5b88a142 | 379 | int count = 0; |
Akito914 | 1:baab5b88a142 | 380 | |
sawai | 0:6da7d0e457a2 | 381 | p.baud(115200); |
sawai | 0:6da7d0e457a2 | 382 | pc.baud(9600); |
Akito914 | 1:baab5b88a142 | 383 | p.printf("Hello!\n"); |
sawai | 0:6da7d0e457a2 | 384 | pc.attach(pc_rx, Serial::RxIrq); |
Akito914 | 1:baab5b88a142 | 385 | |
Akito914 | 3:6223efea43fe | 386 | i2cMaster.frequency(400000); |
Akito914 | 1:baab5b88a142 | 387 | |
sawai | 0:6da7d0e457a2 | 388 | omuni.set_speed(0.0f, 0.0f); |
sawai | 0:6da7d0e457a2 | 389 | omuni.set_pid(0, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 390 | omuni.set_pid(1, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 391 | omuni.set_pid(2, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 392 | |
Akito914 | 3:6223efea43fe | 393 | lift_pid.param(0.4, 0.0, 0.0); |
Akito914 | 1:baab5b88a142 | 394 | lift_pid.period(0.001); |
Akito914 | 1:baab5b88a142 | 395 | lift_pid.output(-127, 127); |
Akito914 | 1:baab5b88a142 | 396 | |
Akito914 | 1:baab5b88a142 | 397 | //control_loop.attach_us(&control, 1000); |
Akito914 | 1:baab5b88a142 | 398 | |
Akito914 | 1:baab5b88a142 | 399 | led = 0; |
Akito914 | 1:baab5b88a142 | 400 | |
Akito914 | 1:baab5b88a142 | 401 | //mesPeriod.start(); |
Akito914 | 1:baab5b88a142 | 402 | |
sawai | 0:6da7d0e457a2 | 403 | while(1) |
sawai | 0:6da7d0e457a2 | 404 | { |
Akito914 | 2:c9de02d6d154 | 405 | wait(0.001); |
Akito914 | 1:baab5b88a142 | 406 | omuni.set_speed(speed_x, speed_y, omega, f); |
sawai | 0:6da7d0e457a2 | 407 | omuni.drive(); |
Akito914 | 1:baab5b88a142 | 408 | control(); |
sawai | 0:6da7d0e457a2 | 409 | |
Akito914 | 1:baab5b88a142 | 410 | if(ems){ |
Akito914 | 1:baab5b88a142 | 411 | emergencyStop(); |
Akito914 | 1:baab5b88a142 | 412 | } |
sawai | 0:6da7d0e457a2 | 413 | } |
Akito914 | 1:baab5b88a142 | 414 | } |
Akito914 | 1:baab5b88a142 | 415 | |
Akito914 | 1:baab5b88a142 | 416 | int drive_motor(int address,signed int duty){ /* アドレスを指定してモータを駆動 */ |
Akito914 | 1:baab5b88a142 | 417 | char send_data; |
Akito914 | 1:baab5b88a142 | 418 | int ack; |
Akito914 | 1:baab5b88a142 | 419 | if((duty>127)||(duty<-128))return -1; /* 範囲外なら送信しない */ |
Akito914 | 1:baab5b88a142 | 420 | send_data=duty; |
Akito914 | 1:baab5b88a142 | 421 | ack=i2cMaster.write(address,&send_data,1); |
Akito914 | 1:baab5b88a142 | 422 | return ack; |
Akito914 | 1:baab5b88a142 | 423 | } |
Akito914 | 1:baab5b88a142 | 424 | |
Akito914 | 1:baab5b88a142 | 425 | |
Akito914 | 1:baab5b88a142 | 426 | void emergencyStop(){ |
Akito914 | 1:baab5b88a142 | 427 | drive_motor(omuniAddr[0], 0); |
Akito914 | 1:baab5b88a142 | 428 | drive_motor(omuniAddr[1], 0); |
Akito914 | 1:baab5b88a142 | 429 | drive_motor(omuniAddr[2], 0); |
Akito914 | 1:baab5b88a142 | 430 | drive_motor(armAddr[0], 0); |
Akito914 | 1:baab5b88a142 | 431 | drive_motor(armAddr[1], 0); |
Akito914 | 1:baab5b88a142 | 432 | drive_motor(liftAddr, 0); |
Akito914 | 1:baab5b88a142 | 433 | drive_motor(spearAddr, 0); |
Akito914 | 1:baab5b88a142 | 434 | while(1); |
Akito914 | 1:baab5b88a142 | 435 | } |
Akito914 | 1:baab5b88a142 | 436 | |
Akito914 | 1:baab5b88a142 | 437 |