![](/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@10:f17b33dd837d, 2017-10-09 (annotated)
- Committer:
- Akito914
- Date:
- Mon Oct 09 02:29:36 2017 +0000
- Revision:
- 10:f17b33dd837d
- Parent:
- 9:bf6d20813364
???????????8?????
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 | 4:5591d3c8a761 | 4 | #include "FastPWM.h" |
Akito914 | 9:bf6d20813364 | 5 | #include "sound_data.h" |
sawai | 0:6da7d0e457a2 | 6 | |
Akito914 | 6:22ad12682a5d | 7 | #define LIFT_METER_INVERSION 1 |
Akito914 | 6:22ad12682a5d | 8 | |
Akito914 | 4:5591d3c8a761 | 9 | const int comTimeout_ms = 200; |
Akito914 | 10:f17b33dd837d | 10 | const float omuni_speed_max = 4.5f; |
Akito914 | 10:f17b33dd837d | 11 | const float omuni_burst_coeff = 1.5f; |
Akito914 | 10:f17b33dd837d | 12 | const float omega_max = 1.5 * 2 * 3.14159265f; |
Akito914 | 10:f17b33dd837d | 13 | const float omega_f = 1.0 * 2 * 3.14159265f; |
Akito914 | 10:f17b33dd837d | 14 | const float wrap_radius = 1.5f; |
Akito914 | 10:f17b33dd837d | 15 | const float wrap_speed = 3.5f; |
Akito914 | 6:22ad12682a5d | 16 | const int8_t armDuty[] = {-100, -100}; |
Akito914 | 1:baab5b88a142 | 17 | const signed int spearDuty = 127; |
Akito914 | 10:f17b33dd837d | 18 | const int32_t lift_preset_min = 150; |
Akito914 | 10:f17b33dd837d | 19 | const int32_t lift_preset_max = 410; // + 260 |
Akito914 | 3:6223efea43fe | 20 | const int32_t lift_preset[4] = { |
Akito914 | 3:6223efea43fe | 21 | lift_preset_min, |
Akito914 | 10:f17b33dd837d | 22 | (int32_t)((lift_preset_max - lift_preset_min) / 3.0 + lift_preset_min), |
Akito914 | 10:f17b33dd837d | 23 | (int32_t)((lift_preset_max - lift_preset_min) * 2.0 / 3.0 + lift_preset_min), |
Akito914 | 3:6223efea43fe | 24 | lift_preset_max, |
Akito914 | 3:6223efea43fe | 25 | }; // 12bit 0 ~ 4095 |
Akito914 | 3:6223efea43fe | 26 | const int32_t lift_max = lift_preset_max; |
Akito914 | 3:6223efea43fe | 27 | const int32_t lift_min = lift_preset_min; |
Akito914 | 10:f17b33dd837d | 28 | const int32_t lift_up_speed = 50; |
Akito914 | 10:f17b33dd837d | 29 | const int32_t lift_down_speed = 50; |
Akito914 | 9:bf6d20813364 | 30 | const int32_t lift_prescaler = 5; |
Akito914 | 3:6223efea43fe | 31 | |
Akito914 | 1:baab5b88a142 | 32 | |
Akito914 | 1:baab5b88a142 | 33 | const int omuniAddr[] = {0x10, 0x12, 0x14}; // 0000 , 1000 , 0100 |
Akito914 | 1:baab5b88a142 | 34 | const int armAddr[] = {0x16, 0x18}; // 1100 , 0010 |
Akito914 | 1:baab5b88a142 | 35 | const int spearAddr = 0x1a; // 1010 |
Akito914 | 1:baab5b88a142 | 36 | const int liftAddr = 0x1c; // 0110 |
Akito914 | 4:5591d3c8a761 | 37 | const int EMO_Addr = 0x1e; // 1110 |
Akito914 | 4:5591d3c8a761 | 38 | |
Akito914 | 4:5591d3c8a761 | 39 | int comTimeout_count = 0; |
Akito914 | 1:baab5b88a142 | 40 | |
Akito914 | 7:5cdd805ca8a3 | 41 | bool comTimeout_state = true; |
Akito914 | 1:baab5b88a142 | 42 | |
Akito914 | 10:f17b33dd837d | 43 | volatile bool ems = false; |
Akito914 | 8:956a76b98da0 | 44 | bool recovery = false; |
Akito914 | 1:baab5b88a142 | 45 | |
sawai | 0:6da7d0e457a2 | 46 | bool arm = false; |
Akito914 | 1:baab5b88a142 | 47 | bool spear = false; |
Akito914 | 2:c9de02d6d154 | 48 | |
Akito914 | 9:bf6d20813364 | 49 | bool check_beep = false; |
Akito914 | 9:bf6d20813364 | 50 | |
Akito914 | 1:baab5b88a142 | 51 | int lift_targ = lift_preset[0]; |
Akito914 | 2:c9de02d6d154 | 52 | int lift_stepTarg; |
Akito914 | 3:6223efea43fe | 53 | bool lift_stepMoving = false; |
Akito914 | 1:baab5b88a142 | 54 | bool first_receive = true; |
Akito914 | 1:baab5b88a142 | 55 | int past_lift_gray = 0b00; |
Akito914 | 1:baab5b88a142 | 56 | int lift_inc = 0; |
Akito914 | 1:baab5b88a142 | 57 | |
Akito914 | 9:bf6d20813364 | 58 | int sound_count = 0; |
Akito914 | 4:5591d3c8a761 | 59 | |
Akito914 | 6:22ad12682a5d | 60 | DigitalIn button(USER_BUTTON); |
Akito914 | 1:baab5b88a142 | 61 | DigitalOut led(LED1); |
sawai | 0:6da7d0e457a2 | 62 | |
Akito914 | 4:5591d3c8a761 | 63 | Serial pc(USBTX, USBRX); |
Akito914 | 10:f17b33dd837d | 64 | Serial comMain(PA_11, PA_12); |
Akito914 | 10:f17b33dd837d | 65 | Serial comSub(PB_6, PA_10); |
Akito914 | 10:f17b33dd837d | 66 | |
Akito914 | 10:f17b33dd837d | 67 | |
sawai | 0:6da7d0e457a2 | 68 | I2C i2cMaster(D14, D15); |
Akito914 | 9:bf6d20813364 | 69 | Omuni omuni(&i2cMaster, TIM1, TIM2, TIM3, 533, 2.0f, omuniAddr, 0.4704f, 0.1f); |
Akito914 | 1:baab5b88a142 | 70 | AnalogIn lift_meter(PC_0); |
Akito914 | 1:baab5b88a142 | 71 | DigitalIn spear_sensor(PC_3); |
Akito914 | 1:baab5b88a142 | 72 | Timer mesPeriod; |
Akito914 | 1:baab5b88a142 | 73 | cal_pid lift_pid; |
Akito914 | 4:5591d3c8a761 | 74 | Ticker comTimeout; |
Akito914 | 3:6223efea43fe | 75 | |
Akito914 | 9:bf6d20813364 | 76 | FastPWM soundOut(PB_7); |
Akito914 | 1:baab5b88a142 | 77 | |
Akito914 | 1:baab5b88a142 | 78 | float speed_x, speed_y, omega; |
Akito914 | 1:baab5b88a142 | 79 | bool f; |
sawai | 0:6da7d0e457a2 | 80 | |
Akito914 | 1:baab5b88a142 | 81 | typedef union{ |
Akito914 | 1:baab5b88a142 | 82 | struct{ |
Akito914 | 5:12be2ac0f395 | 83 | unsigned startByte :8; |
Akito914 | 5:12be2ac0f395 | 84 | unsigned joyLX :8; |
Akito914 | 5:12be2ac0f395 | 85 | unsigned joyLY :8; |
Akito914 | 5:12be2ac0f395 | 86 | unsigned joyRX :8; |
Akito914 | 5:12be2ac0f395 | 87 | unsigned joyRY :8; |
Akito914 | 5:12be2ac0f395 | 88 | unsigned L2 :8; |
Akito914 | 5:12be2ac0f395 | 89 | unsigned R2 :8; |
Akito914 | 5:12be2ac0f395 | 90 | unsigned arrowL :1; |
Akito914 | 5:12be2ac0f395 | 91 | unsigned arrowR :1; |
Akito914 | 5:12be2ac0f395 | 92 | unsigned arrowU :1; |
Akito914 | 5:12be2ac0f395 | 93 | unsigned arrowD :1; |
Akito914 | 5:12be2ac0f395 | 94 | unsigned L1 :1; |
Akito914 | 5:12be2ac0f395 | 95 | unsigned R1 :1; |
Akito914 | 5:12be2ac0f395 | 96 | unsigned SELECT :2; |
Akito914 | 5:12be2ac0f395 | 97 | unsigned lift_gray :2; |
Akito914 | 5:12be2ac0f395 | 98 | unsigned spear :1; |
Akito914 | 5:12be2ac0f395 | 99 | unsigned arm :1; |
Akito914 | 5:12be2ac0f395 | 100 | unsigned pushL :1; |
Akito914 | 5:12be2ac0f395 | 101 | unsigned pushR :1; |
Akito914 | 5:12be2ac0f395 | 102 | unsigned EMO :2; |
Akito914 | 5:12be2ac0f395 | 103 | unsigned checksum :8; |
Akito914 | 1:baab5b88a142 | 104 | }; |
Akito914 | 5:12be2ac0f395 | 105 | |
Akito914 | 5:12be2ac0f395 | 106 | uint8_t list[10]; |
Akito914 | 5:12be2ac0f395 | 107 | }comBuf_t; |
Akito914 | 1:baab5b88a142 | 108 | |
Akito914 | 5:12be2ac0f395 | 109 | void received_processing(comBuf_t *buf); |
Akito914 | 5:12be2ac0f395 | 110 | int byteSum(int8_t byte); |
Akito914 | 5:12be2ac0f395 | 111 | bool checksum_check(comBuf_t *buf); |
Akito914 | 5:12be2ac0f395 | 112 | int drive_motor(int address,signed int duty); |
Akito914 | 5:12be2ac0f395 | 113 | void emergencyStop(); |
Akito914 | 1:baab5b88a142 | 114 | |
Akito914 | 9:bf6d20813364 | 115 | /***** sound *****/ |
Akito914 | 9:bf6d20813364 | 116 | void pi(int times); |
Akito914 | 9:bf6d20813364 | 117 | void esc_sound(int key); |
Akito914 | 9:bf6d20813364 | 118 | void q_sound(); |
Akito914 | 9:bf6d20813364 | 119 | void ans_sound(); |
Akito914 | 9:bf6d20813364 | 120 | void piroro(); |
Akito914 | 9:bf6d20813364 | 121 | void beep(int T_us,int t_ms); |
Akito914 | 9:bf6d20813364 | 122 | void beep_freq(int freq, int t_ms); |
Akito914 | 9:bf6d20813364 | 123 | void beep_note(int note, int t_ms); |
Akito914 | 9:bf6d20813364 | 124 | void check_beep_turn(bool turn); |
Akito914 | 9:bf6d20813364 | 125 | int getPeriod(int freq); |
Akito914 | 9:bf6d20813364 | 126 | int freq2period_us(int freq); |
Akito914 | 9:bf6d20813364 | 127 | int note2period_us(int note); |
Akito914 | 9:bf6d20813364 | 128 | |
Akito914 | 9:bf6d20813364 | 129 | /*****************/ |
Akito914 | 9:bf6d20813364 | 130 | |
Akito914 | 10:f17b33dd837d | 131 | comBuf_t comMainBuf; |
Akito914 | 10:f17b33dd837d | 132 | comBuf_t comSubBuf; |
Akito914 | 10:f17b33dd837d | 133 | |
Akito914 | 5:12be2ac0f395 | 134 | |
Akito914 | 8:956a76b98da0 | 135 | void reset(){ |
Akito914 | 8:956a76b98da0 | 136 | NVIC_SystemReset(); |
Akito914 | 8:956a76b98da0 | 137 | } |
Akito914 | 1:baab5b88a142 | 138 | |
Akito914 | 1:baab5b88a142 | 139 | int grayDiffer2bit(int gray, int origin){ |
Akito914 | 1:baab5b88a142 | 140 | |
Akito914 | 1:baab5b88a142 | 141 | switch(origin){ |
Akito914 | 1:baab5b88a142 | 142 | case 0b00: |
Akito914 | 1:baab5b88a142 | 143 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 144 | case 0b01: return 1; |
Akito914 | 1:baab5b88a142 | 145 | case 0b10: return -1; |
Akito914 | 1:baab5b88a142 | 146 | default : return 0; |
Akito914 | 1:baab5b88a142 | 147 | } |
Akito914 | 1:baab5b88a142 | 148 | case 0b01: |
Akito914 | 1:baab5b88a142 | 149 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 150 | case 0b11: return 1; |
Akito914 | 1:baab5b88a142 | 151 | case 0b00: return -1; |
Akito914 | 1:baab5b88a142 | 152 | default : return 0; |
Akito914 | 1:baab5b88a142 | 153 | } |
Akito914 | 1:baab5b88a142 | 154 | case 0b11: |
Akito914 | 1:baab5b88a142 | 155 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 156 | case 0b10: return 1; |
Akito914 | 1:baab5b88a142 | 157 | case 0b01: return -1; |
Akito914 | 1:baab5b88a142 | 158 | default : return 0; |
Akito914 | 1:baab5b88a142 | 159 | } |
Akito914 | 1:baab5b88a142 | 160 | case 0b10: |
Akito914 | 1:baab5b88a142 | 161 | switch(gray){ |
Akito914 | 1:baab5b88a142 | 162 | case 0b00: return 1; |
Akito914 | 1:baab5b88a142 | 163 | case 0b11: return -1; |
Akito914 | 1:baab5b88a142 | 164 | default : return 0; |
Akito914 | 1:baab5b88a142 | 165 | } |
Akito914 | 1:baab5b88a142 | 166 | } |
Akito914 | 1:baab5b88a142 | 167 | return 0; |
Akito914 | 1:baab5b88a142 | 168 | } |
Akito914 | 1:baab5b88a142 | 169 | |
Akito914 | 5:12be2ac0f395 | 170 | bool checksum_check(comBuf_t *buf){ |
Akito914 | 5:12be2ac0f395 | 171 | int sum = 0; |
Akito914 | 5:12be2ac0f395 | 172 | |
Akito914 | 5:12be2ac0f395 | 173 | for(int count = 0; count < 9; count++){ |
Akito914 | 6:22ad12682a5d | 174 | sum += buf->list[count]; |
Akito914 | 5:12be2ac0f395 | 175 | } |
Akito914 | 6:22ad12682a5d | 176 | return (sum & 0b01111111) == buf->checksum; |
Akito914 | 5:12be2ac0f395 | 177 | } |
Akito914 | 5:12be2ac0f395 | 178 | |
sawai | 0:6da7d0e457a2 | 179 | |
Akito914 | 10:f17b33dd837d | 180 | void comMain_rx() |
sawai | 0:6da7d0e457a2 | 181 | { |
Akito914 | 5:12be2ac0f395 | 182 | static int byteCount = 0; |
Akito914 | 10:f17b33dd837d | 183 | char temp = comMain.getc(); |
Akito914 | 5:12be2ac0f395 | 184 | |
Akito914 | 5:12be2ac0f395 | 185 | if(temp == 0b10000000){ |
Akito914 | 10:f17b33dd837d | 186 | comMainBuf.list[0] = temp; |
Akito914 | 5:12be2ac0f395 | 187 | byteCount = 1; |
Akito914 | 5:12be2ac0f395 | 188 | } |
Akito914 | 6:22ad12682a5d | 189 | else if((temp & 0b10000000) != 0){ // 想定外のデータ |
Akito914 | 5:12be2ac0f395 | 190 | byteCount = 0; |
Akito914 | 5:12be2ac0f395 | 191 | } |
Akito914 | 5:12be2ac0f395 | 192 | else if(byteCount > 0){ |
Akito914 | 5:12be2ac0f395 | 193 | |
Akito914 | 10:f17b33dd837d | 194 | comMainBuf.list[byteCount] = temp; |
Akito914 | 5:12be2ac0f395 | 195 | |
Akito914 | 5:12be2ac0f395 | 196 | if(byteCount < 9)byteCount += 1; |
Akito914 | 5:12be2ac0f395 | 197 | else{ // データは揃った |
Akito914 | 6:22ad12682a5d | 198 | |
Akito914 | 10:f17b33dd837d | 199 | if(checksum_check(&comMainBuf)){ |
Akito914 | 5:12be2ac0f395 | 200 | led = !led; |
Akito914 | 5:12be2ac0f395 | 201 | comTimeout_count = 0; |
Akito914 | 7:5cdd805ca8a3 | 202 | comTimeout_state = false; |
Akito914 | 10:f17b33dd837d | 203 | received_processing(&comMainBuf); |
Akito914 | 10:f17b33dd837d | 204 | } |
Akito914 | 10:f17b33dd837d | 205 | else{ |
Akito914 | 10:f17b33dd837d | 206 | byteCount = 0; |
Akito914 | 10:f17b33dd837d | 207 | } |
Akito914 | 10:f17b33dd837d | 208 | } |
Akito914 | 10:f17b33dd837d | 209 | |
Akito914 | 10:f17b33dd837d | 210 | } |
Akito914 | 10:f17b33dd837d | 211 | |
Akito914 | 10:f17b33dd837d | 212 | } |
Akito914 | 10:f17b33dd837d | 213 | |
Akito914 | 10:f17b33dd837d | 214 | void comSub_rx() |
Akito914 | 10:f17b33dd837d | 215 | { |
Akito914 | 10:f17b33dd837d | 216 | static int byteCount = 0; |
Akito914 | 10:f17b33dd837d | 217 | char temp = comSub.getc(); |
Akito914 | 10:f17b33dd837d | 218 | |
Akito914 | 10:f17b33dd837d | 219 | if(temp == 0b10000000){ |
Akito914 | 10:f17b33dd837d | 220 | comSubBuf.list[0] = temp; |
Akito914 | 10:f17b33dd837d | 221 | byteCount = 1; |
Akito914 | 10:f17b33dd837d | 222 | } |
Akito914 | 10:f17b33dd837d | 223 | else if((temp & 0b10000000) != 0){ // 想定外のデータ |
Akito914 | 10:f17b33dd837d | 224 | byteCount = 0; |
Akito914 | 10:f17b33dd837d | 225 | } |
Akito914 | 10:f17b33dd837d | 226 | else if(byteCount > 0){ |
Akito914 | 10:f17b33dd837d | 227 | |
Akito914 | 10:f17b33dd837d | 228 | comSubBuf.list[byteCount] = temp; |
Akito914 | 10:f17b33dd837d | 229 | |
Akito914 | 10:f17b33dd837d | 230 | if(byteCount < 9)byteCount += 1; |
Akito914 | 10:f17b33dd837d | 231 | else{ // データは揃った |
Akito914 | 10:f17b33dd837d | 232 | |
Akito914 | 10:f17b33dd837d | 233 | if(checksum_check(&comSubBuf)){ |
Akito914 | 10:f17b33dd837d | 234 | led = !led; |
Akito914 | 10:f17b33dd837d | 235 | comTimeout_count = 0; |
Akito914 | 10:f17b33dd837d | 236 | comTimeout_state = false; |
Akito914 | 10:f17b33dd837d | 237 | received_processing(&comSubBuf); |
Akito914 | 5:12be2ac0f395 | 238 | } |
Akito914 | 5:12be2ac0f395 | 239 | else{ |
Akito914 | 5:12be2ac0f395 | 240 | byteCount = 0; |
Akito914 | 5:12be2ac0f395 | 241 | } |
Akito914 | 5:12be2ac0f395 | 242 | } |
Akito914 | 5:12be2ac0f395 | 243 | |
Akito914 | 5:12be2ac0f395 | 244 | } |
Akito914 | 5:12be2ac0f395 | 245 | |
Akito914 | 5:12be2ac0f395 | 246 | } |
Akito914 | 5:12be2ac0f395 | 247 | |
Akito914 | 5:12be2ac0f395 | 248 | int getJoy7bit(int raw){ |
Akito914 | 5:12be2ac0f395 | 249 | return raw - 64; |
Akito914 | 5:12be2ac0f395 | 250 | } |
Akito914 | 5:12be2ac0f395 | 251 | |
Akito914 | 5:12be2ac0f395 | 252 | void received_processing(comBuf_t *buf){ |
Akito914 | 5:12be2ac0f395 | 253 | |
Akito914 | 1:baab5b88a142 | 254 | int lift_nearest_num = 0; |
Akito914 | 10:f17b33dd837d | 255 | float speed = 0; |
Akito914 | 10:f17b33dd837d | 256 | float raw_speed_x, raw_speed_y; |
Akito914 | 10:f17b33dd837d | 257 | float degree; |
Akito914 | 10:f17b33dd837d | 258 | int angle_num; |
Akito914 | 10:f17b33dd837d | 259 | const int omuni_angle_split_num = 8; |
sawai | 0:6da7d0e457a2 | 260 | |
Akito914 | 8:956a76b98da0 | 261 | if(buf->EMO != 0){ |
Akito914 | 8:956a76b98da0 | 262 | ems = true; |
Akito914 | 8:956a76b98da0 | 263 | } |
Akito914 | 8:956a76b98da0 | 264 | else if(ems == true){ |
Akito914 | 8:956a76b98da0 | 265 | reset(); |
Akito914 | 8:956a76b98da0 | 266 | } |
Akito914 | 1:baab5b88a142 | 267 | |
Akito914 | 9:bf6d20813364 | 268 | |
Akito914 | 9:bf6d20813364 | 269 | if(check_beep == false && buf->SELECT == true){ |
Akito914 | 9:bf6d20813364 | 270 | check_beep_turn(true); |
Akito914 | 9:bf6d20813364 | 271 | } |
Akito914 | 9:bf6d20813364 | 272 | else if(check_beep == true && buf->SELECT == false){ |
Akito914 | 9:bf6d20813364 | 273 | check_beep_turn(false); |
Akito914 | 9:bf6d20813364 | 274 | } |
Akito914 | 9:bf6d20813364 | 275 | check_beep = buf->SELECT; |
Akito914 | 9:bf6d20813364 | 276 | |
Akito914 | 10:f17b33dd837d | 277 | raw_speed_x = -1 * omuni_speed_max * getJoy7bit(buf->joyLX) / 64.0f; |
Akito914 | 10:f17b33dd837d | 278 | raw_speed_y = -1 * omuni_speed_max * getJoy7bit(buf->joyLY) / 64.0f; |
Akito914 | 10:f17b33dd837d | 279 | |
Akito914 | 10:f17b33dd837d | 280 | speed = sqrt(raw_speed_x * raw_speed_x + raw_speed_y * raw_speed_y); |
Akito914 | 10:f17b33dd837d | 281 | |
Akito914 | 10:f17b33dd837d | 282 | degree = atan2((double)raw_speed_y, (double)raw_speed_x) * 180.0 / 3.14159265358979; |
Akito914 | 10:f17b33dd837d | 283 | |
Akito914 | 10:f17b33dd837d | 284 | angle_num = (double)degree * omuni_angle_split_num / 360.0 + ((degree < 0)?-0.5:0.5); |
Akito914 | 10:f17b33dd837d | 285 | |
Akito914 | 10:f17b33dd837d | 286 | speed_x = speed * cos(angle_num * 2 * 3.14159265358979 / omuni_angle_split_num); |
Akito914 | 10:f17b33dd837d | 287 | speed_y = speed * sin(angle_num * 2 * 3.14159265358979 / omuni_angle_split_num); |
Akito914 | 10:f17b33dd837d | 288 | |
Akito914 | 10:f17b33dd837d | 289 | /* |
Akito914 | 9:bf6d20813364 | 290 | speed_x = -1 * omuni_speed_max * getJoy7bit(buf->joyLX) / 64.0f; |
Akito914 | 9:bf6d20813364 | 291 | speed_y = -1 * omuni_speed_max * getJoy7bit(buf->joyLY) / 64.0f; |
Akito914 | 10:f17b33dd837d | 292 | */ |
sawai | 0:6da7d0e457a2 | 293 | |
Akito914 | 7:5cdd805ca8a3 | 294 | if(buf->pushL == 1){ |
Akito914 | 7:5cdd805ca8a3 | 295 | speed_x *= omuni_burst_coeff; |
Akito914 | 7:5cdd805ca8a3 | 296 | speed_y *= omuni_burst_coeff; |
Akito914 | 7:5cdd805ca8a3 | 297 | } |
Akito914 | 7:5cdd805ca8a3 | 298 | |
Akito914 | 6:22ad12682a5d | 299 | if(abs(getJoy7bit(buf->joyRY)) < 20 && abs(getJoy7bit(buf->joyRX)) > 50){ |
Akito914 | 5:12be2ac0f395 | 300 | f = 1; |
Akito914 | 5:12be2ac0f395 | 301 | omega = omega_f; |
Akito914 | 9:bf6d20813364 | 302 | if(getJoy7bit(buf->joyRX) > 0)omega *= -1; |
Akito914 | 5:12be2ac0f395 | 303 | } |
Akito914 | 7:5cdd805ca8a3 | 304 | else{ |
Akito914 | 9:bf6d20813364 | 305 | int diff = (int)buf->L2 - (int)buf->R2; |
Akito914 | 7:5cdd805ca8a3 | 306 | omega = omega_max * diff / 127.0f; |
Akito914 | 7:5cdd805ca8a3 | 307 | f = 0; |
Akito914 | 7:5cdd805ca8a3 | 308 | } |
Akito914 | 7:5cdd805ca8a3 | 309 | |
Akito914 | 5:12be2ac0f395 | 310 | if(buf->R1 || buf->L1){ |
Akito914 | 9:bf6d20813364 | 311 | float speed_wrap_x; |
Akito914 | 9:bf6d20813364 | 312 | float speed_wrap_y; |
Akito914 | 9:bf6d20813364 | 313 | float omega_wrap; |
Akito914 | 9:bf6d20813364 | 314 | |
Akito914 | 9:bf6d20813364 | 315 | speed_wrap_x = wrap_speed; |
Akito914 | 9:bf6d20813364 | 316 | speed_wrap_y = 0; |
Akito914 | 9:bf6d20813364 | 317 | omega_wrap = wrap_speed / wrap_radius; |
Akito914 | 9:bf6d20813364 | 318 | speed_wrap_x *= buf->R1 ? -1 : 1; |
Akito914 | 9:bf6d20813364 | 319 | omega_wrap *= buf->R1 ? 1 : -1; |
Akito914 | 9:bf6d20813364 | 320 | |
Akito914 | 9:bf6d20813364 | 321 | if(f == 1){ |
Akito914 | 9:bf6d20813364 | 322 | speed_x = 0; |
Akito914 | 9:bf6d20813364 | 323 | speed_y = 0; |
Akito914 | 9:bf6d20813364 | 324 | omega = 0; |
Akito914 | 9:bf6d20813364 | 325 | } |
Akito914 | 9:bf6d20813364 | 326 | speed_x += speed_wrap_x; |
Akito914 | 9:bf6d20813364 | 327 | speed_y += speed_wrap_y; |
Akito914 | 9:bf6d20813364 | 328 | omega += omega_wrap; |
Akito914 | 5:12be2ac0f395 | 329 | } |
Akito914 | 5:12be2ac0f395 | 330 | |
Akito914 | 5:12be2ac0f395 | 331 | arm = buf->arm != 0; |
Akito914 | 5:12be2ac0f395 | 332 | |
Akito914 | 5:12be2ac0f395 | 333 | spear = buf->spear != 0; |
Akito914 | 5:12be2ac0f395 | 334 | |
Akito914 | 5:12be2ac0f395 | 335 | if(first_receive){ |
Akito914 | 5:12be2ac0f395 | 336 | past_lift_gray = buf->lift_gray; |
Akito914 | 5:12be2ac0f395 | 337 | first_receive = false; |
Akito914 | 5:12be2ac0f395 | 338 | } |
Akito914 | 5:12be2ac0f395 | 339 | if(buf->lift_gray != past_lift_gray){ // 段階移動 |
Akito914 | 5:12be2ac0f395 | 340 | int lift_currentTarg; |
Akito914 | 5:12be2ac0f395 | 341 | int lift_diff = 0; |
Akito914 | 5:12be2ac0f395 | 342 | int lift_nearest = 10000; |
Akito914 | 5:12be2ac0f395 | 343 | int lift_nextTarg; |
Akito914 | 1:baab5b88a142 | 344 | |
Akito914 | 5:12be2ac0f395 | 345 | lift_currentTarg = lift_targ; |
Akito914 | 5:12be2ac0f395 | 346 | if(lift_stepMoving){ |
Akito914 | 5:12be2ac0f395 | 347 | lift_nextTarg = lift_stepTarg; |
Akito914 | 5:12be2ac0f395 | 348 | } |
Akito914 | 5:12be2ac0f395 | 349 | else{ |
Akito914 | 5:12be2ac0f395 | 350 | lift_nextTarg = lift_currentTarg; |
Akito914 | 1:baab5b88a142 | 351 | } |
Akito914 | 1:baab5b88a142 | 352 | |
Akito914 | 5:12be2ac0f395 | 353 | lift_diff = grayDiffer2bit(buf->lift_gray, past_lift_gray); |
Akito914 | 5:12be2ac0f395 | 354 | for(int num = 0; num < 4; num++){ // 最寄りの段階 |
Akito914 | 5:12be2ac0f395 | 355 | if(lift_nearest > abs(lift_preset[num] - lift_currentTarg)){ |
Akito914 | 5:12be2ac0f395 | 356 | lift_nearest_num = num; |
Akito914 | 5:12be2ac0f395 | 357 | lift_nearest = abs(lift_preset[num] - lift_currentTarg); |
Akito914 | 5:12be2ac0f395 | 358 | } |
Akito914 | 1:baab5b88a142 | 359 | } |
Akito914 | 5:12be2ac0f395 | 360 | if(lift_diff != 0){ |
Akito914 | 5:12be2ac0f395 | 361 | if(lift_diff == 1){ |
Akito914 | 7:5cdd805ca8a3 | 362 | if(lift_preset[lift_nearest_num] <= lift_currentTarg){ |
Akito914 | 5:12be2ac0f395 | 363 | if(lift_nearest_num < 3)lift_nextTarg = lift_preset[lift_nearest_num + 1]; |
Akito914 | 5:12be2ac0f395 | 364 | } |
Akito914 | 5:12be2ac0f395 | 365 | else{ |
Akito914 | 5:12be2ac0f395 | 366 | lift_nextTarg = lift_preset[lift_nearest_num]; |
Akito914 | 1:baab5b88a142 | 367 | } |
Akito914 | 1:baab5b88a142 | 368 | } |
Akito914 | 5:12be2ac0f395 | 369 | else if(lift_diff == -1){ |
Akito914 | 7:5cdd805ca8a3 | 370 | if(lift_preset[lift_nearest_num] >= lift_currentTarg){ |
Akito914 | 5:12be2ac0f395 | 371 | if(lift_nearest_num > 0)lift_nextTarg = lift_preset[lift_nearest_num - 1]; |
Akito914 | 1:baab5b88a142 | 372 | } |
Akito914 | 5:12be2ac0f395 | 373 | else{ |
Akito914 | 5:12be2ac0f395 | 374 | lift_nextTarg = lift_preset[lift_nearest_num]; |
Akito914 | 1:baab5b88a142 | 375 | } |
Akito914 | 1:baab5b88a142 | 376 | } |
Akito914 | 3:6223efea43fe | 377 | |
Akito914 | 5:12be2ac0f395 | 378 | lift_stepTarg = lift_nextTarg; |
Akito914 | 5:12be2ac0f395 | 379 | lift_stepMoving = true; |
Akito914 | 5:12be2ac0f395 | 380 | |
Akito914 | 1:baab5b88a142 | 381 | } |
Akito914 | 1:baab5b88a142 | 382 | |
Akito914 | 5:12be2ac0f395 | 383 | } |
Akito914 | 5:12be2ac0f395 | 384 | past_lift_gray = buf->lift_gray; |
Akito914 | 5:12be2ac0f395 | 385 | |
Akito914 | 7:5cdd805ca8a3 | 386 | |
Akito914 | 6:22ad12682a5d | 387 | if(abs(getJoy7bit(buf->joyRY)) > 50 && abs(getJoy7bit(buf->joyRX)) < 20){ |
Akito914 | 7:5cdd805ca8a3 | 388 | if(getJoy7bit(buf->joyRY) > 0)lift_inc = -5; |
Akito914 | 7:5cdd805ca8a3 | 389 | else lift_inc = 5; |
Akito914 | 5:12be2ac0f395 | 390 | } |
Akito914 | 5:12be2ac0f395 | 391 | else{ |
Akito914 | 5:12be2ac0f395 | 392 | lift_inc = 0; |
Akito914 | 5:12be2ac0f395 | 393 | } |
Akito914 | 1:baab5b88a142 | 394 | |
Akito914 | 1:baab5b88a142 | 395 | } |
Akito914 | 1:baab5b88a142 | 396 | |
Akito914 | 4:5591d3c8a761 | 397 | void comTimeout_intr(){ |
Akito914 | 4:5591d3c8a761 | 398 | |
Akito914 | 4:5591d3c8a761 | 399 | if(comTimeout_count >= comTimeout_ms){ |
Akito914 | 4:5591d3c8a761 | 400 | speed_x = 0; |
Akito914 | 4:5591d3c8a761 | 401 | speed_y = 0; |
Akito914 | 4:5591d3c8a761 | 402 | omega = 0; |
Akito914 | 4:5591d3c8a761 | 403 | arm = 0; |
Akito914 | 4:5591d3c8a761 | 404 | spear = 0; |
Akito914 | 4:5591d3c8a761 | 405 | lift_inc = 0; |
Akito914 | 6:22ad12682a5d | 406 | comTimeout_state = true; |
Akito914 | 4:5591d3c8a761 | 407 | } |
Akito914 | 4:5591d3c8a761 | 408 | else{ |
Akito914 | 4:5591d3c8a761 | 409 | comTimeout_count += 1; |
Akito914 | 4:5591d3c8a761 | 410 | } |
Akito914 | 4:5591d3c8a761 | 411 | |
Akito914 | 10:f17b33dd837d | 412 | |
Akito914 | 4:5591d3c8a761 | 413 | } |
Akito914 | 4:5591d3c8a761 | 414 | |
Akito914 | 4:5591d3c8a761 | 415 | |
Akito914 | 1:baab5b88a142 | 416 | void arm_control(){ |
Akito914 | 1:baab5b88a142 | 417 | char armData[2] = {0}; |
Akito914 | 1:baab5b88a142 | 418 | |
Akito914 | 1:baab5b88a142 | 419 | armData[0] = arm? armDuty[0] : 0 ; |
Akito914 | 1:baab5b88a142 | 420 | armData[1] = arm? armDuty[1] : 0 ; |
Akito914 | 1:baab5b88a142 | 421 | |
Akito914 | 1:baab5b88a142 | 422 | i2cMaster.write(armAddr[0], &armData[0], 1); |
Akito914 | 1:baab5b88a142 | 423 | i2cMaster.write(armAddr[1], &armData[1], 1); |
Akito914 | 1:baab5b88a142 | 424 | |
Akito914 | 1:baab5b88a142 | 425 | } |
Akito914 | 1:baab5b88a142 | 426 | |
Akito914 | 1:baab5b88a142 | 427 | void lift_control(){ |
Akito914 | 7:5cdd805ca8a3 | 428 | static int prescaler_count = 0; |
Akito914 | 1:baab5b88a142 | 429 | int32_t meter = 0; |
Akito914 | 1:baab5b88a142 | 430 | signed int duty = 0; |
Akito914 | 3:6223efea43fe | 431 | int32_t error = 0; |
Akito914 | 1:baab5b88a142 | 432 | |
Akito914 | 7:5cdd805ca8a3 | 433 | if(prescaler_count >= lift_prescaler){ |
Akito914 | 7:5cdd805ca8a3 | 434 | prescaler_count = 0; |
Akito914 | 7:5cdd805ca8a3 | 435 | |
Akito914 | 7:5cdd805ca8a3 | 436 | error = lift_stepTarg - lift_targ; |
Akito914 | 7:5cdd805ca8a3 | 437 | if(lift_stepMoving){ |
Akito914 | 7:5cdd805ca8a3 | 438 | if(error > lift_up_speed){ |
Akito914 | 7:5cdd805ca8a3 | 439 | lift_targ += lift_up_speed; |
Akito914 | 7:5cdd805ca8a3 | 440 | } |
Akito914 | 7:5cdd805ca8a3 | 441 | else if(error < lift_down_speed * -1){ |
Akito914 | 7:5cdd805ca8a3 | 442 | lift_targ -= lift_down_speed; |
Akito914 | 7:5cdd805ca8a3 | 443 | } |
Akito914 | 7:5cdd805ca8a3 | 444 | else{ |
Akito914 | 7:5cdd805ca8a3 | 445 | lift_targ = lift_stepTarg; |
Akito914 | 7:5cdd805ca8a3 | 446 | lift_stepMoving = false; |
Akito914 | 7:5cdd805ca8a3 | 447 | } |
Akito914 | 2:c9de02d6d154 | 448 | } |
Akito914 | 2:c9de02d6d154 | 449 | else{ |
Akito914 | 7:5cdd805ca8a3 | 450 | if(lift_inc < 0){ |
Akito914 | 7:5cdd805ca8a3 | 451 | if(lift_min < lift_targ + lift_inc)lift_targ += lift_inc; |
Akito914 | 7:5cdd805ca8a3 | 452 | } |
Akito914 | 7:5cdd805ca8a3 | 453 | else if(lift_inc > 0){ |
Akito914 | 7:5cdd805ca8a3 | 454 | if(lift_max > lift_targ + lift_inc)lift_targ += lift_inc; |
Akito914 | 7:5cdd805ca8a3 | 455 | } |
Akito914 | 2:c9de02d6d154 | 456 | } |
sawai | 0:6da7d0e457a2 | 457 | } |
Akito914 | 2:c9de02d6d154 | 458 | else{ |
Akito914 | 7:5cdd805ca8a3 | 459 | prescaler_count += 1; |
sawai | 0:6da7d0e457a2 | 460 | } |
Akito914 | 2:c9de02d6d154 | 461 | |
Akito914 | 4:5591d3c8a761 | 462 | meter = lift_meter.read_u16() >> 6; |
Akito914 | 6:22ad12682a5d | 463 | #if LIFT_METER_INVERSION |
Akito914 | 6:22ad12682a5d | 464 | meter = 1023 - meter; |
Akito914 | 6:22ad12682a5d | 465 | #endif |
Akito914 | 6:22ad12682a5d | 466 | duty = lift_pid.get_pid(meter, lift_targ, 1); |
Akito914 | 1:baab5b88a142 | 467 | drive_motor(liftAddr, duty); |
Akito914 | 1:baab5b88a142 | 468 | |
Akito914 | 1:baab5b88a142 | 469 | } |
Akito914 | 1:baab5b88a142 | 470 | |
Akito914 | 1:baab5b88a142 | 471 | void spear_control(){ |
Akito914 | 4:5591d3c8a761 | 472 | const int spear_timeout_short = 100; |
Akito914 | 10:f17b33dd837d | 473 | const int spear_timeout_long = 200; |
Akito914 | 1:baab5b88a142 | 474 | static int spear_state = 0; |
Akito914 | 4:5591d3c8a761 | 475 | static int spear_timeout_count = 0; |
Akito914 | 1:baab5b88a142 | 476 | signed int duty = 0; |
Akito914 | 1:baab5b88a142 | 477 | int sensor = spear_sensor; // リミット時に1 |
Akito914 | 1:baab5b88a142 | 478 | |
Akito914 | 1:baab5b88a142 | 479 | switch(spear_state){ |
Akito914 | 1:baab5b88a142 | 480 | case 0 : // 待ち |
Akito914 | 1:baab5b88a142 | 481 | if(spear){ |
Akito914 | 1:baab5b88a142 | 482 | spear_state = 1; |
Akito914 | 1:baab5b88a142 | 483 | } |
Akito914 | 1:baab5b88a142 | 484 | else{ |
Akito914 | 1:baab5b88a142 | 485 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 486 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 487 | } |
Akito914 | 1:baab5b88a142 | 488 | } |
Akito914 | 1:baab5b88a142 | 489 | break; |
Akito914 | 1:baab5b88a142 | 490 | case 1 : // 初期位置から抜け出す |
Akito914 | 1:baab5b88a142 | 491 | duty = spearDuty; |
Akito914 | 4:5591d3c8a761 | 492 | if(sensor != 0){ |
Akito914 | 4:5591d3c8a761 | 493 | if(spear_timeout_count < spear_timeout_short){ |
Akito914 | 4:5591d3c8a761 | 494 | spear_timeout_count += 1; |
Akito914 | 4:5591d3c8a761 | 495 | } |
Akito914 | 4:5591d3c8a761 | 496 | else{ |
Akito914 | 4:5591d3c8a761 | 497 | spear_timeout_count = 0; |
Akito914 | 4:5591d3c8a761 | 498 | spear_state = 0; |
Akito914 | 4:5591d3c8a761 | 499 | } |
Akito914 | 4:5591d3c8a761 | 500 | } |
Akito914 | 4:5591d3c8a761 | 501 | else{ |
Akito914 | 4:5591d3c8a761 | 502 | spear_timeout_count = 0; |
Akito914 | 1:baab5b88a142 | 503 | spear_state = 2; |
Akito914 | 1:baab5b88a142 | 504 | } |
Akito914 | 1:baab5b88a142 | 505 | break; |
Akito914 | 1:baab5b88a142 | 506 | case 2 : // 到達位置まで動かす |
Akito914 | 1:baab5b88a142 | 507 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 508 | duty = spearDuty; |
Akito914 | 4:5591d3c8a761 | 509 | if(spear_timeout_count < spear_timeout_long){ |
Akito914 | 4:5591d3c8a761 | 510 | spear_timeout_count += 1; |
Akito914 | 4:5591d3c8a761 | 511 | } |
Akito914 | 4:5591d3c8a761 | 512 | else{ |
Akito914 | 4:5591d3c8a761 | 513 | spear_timeout_count = 0; |
Akito914 | 4:5591d3c8a761 | 514 | spear_state = 3; |
Akito914 | 4:5591d3c8a761 | 515 | } |
Akito914 | 1:baab5b88a142 | 516 | } |
Akito914 | 1:baab5b88a142 | 517 | else{ |
Akito914 | 4:5591d3c8a761 | 518 | spear_timeout_count = 0; |
Akito914 | 1:baab5b88a142 | 519 | spear_state = 3; |
Akito914 | 1:baab5b88a142 | 520 | } |
Akito914 | 1:baab5b88a142 | 521 | break; |
Akito914 | 1:baab5b88a142 | 522 | case 3 : // 到達位置から抜け出す |
Akito914 | 1:baab5b88a142 | 523 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 524 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 525 | spear_state = 4; |
Akito914 | 1:baab5b88a142 | 526 | } |
Akito914 | 1:baab5b88a142 | 527 | break; |
Akito914 | 1:baab5b88a142 | 528 | case 4 : // 初期位置まで戻る |
Akito914 | 1:baab5b88a142 | 529 | if(sensor == 0){ |
Akito914 | 1:baab5b88a142 | 530 | duty = spearDuty * -1; |
Akito914 | 1:baab5b88a142 | 531 | } |
Akito914 | 1:baab5b88a142 | 532 | else{ |
Akito914 | 1:baab5b88a142 | 533 | spear_state = 0; |
Akito914 | 1:baab5b88a142 | 534 | } |
Akito914 | 1:baab5b88a142 | 535 | break; |
Akito914 | 1:baab5b88a142 | 536 | default : |
Akito914 | 1:baab5b88a142 | 537 | break; |
Akito914 | 1:baab5b88a142 | 538 | } |
Akito914 | 1:baab5b88a142 | 539 | drive_motor(spearAddr, duty); |
Akito914 | 1:baab5b88a142 | 540 | } |
Akito914 | 1:baab5b88a142 | 541 | |
Akito914 | 1:baab5b88a142 | 542 | |
Akito914 | 1:baab5b88a142 | 543 | void control(){ |
Akito914 | 1:baab5b88a142 | 544 | |
Akito914 | 6:22ad12682a5d | 545 | drive_motor(EMO_Addr, 1); |
Akito914 | 6:22ad12682a5d | 546 | |
Akito914 | 6:22ad12682a5d | 547 | omuni.set_speed(speed_x, speed_y, omega, f); |
Akito914 | 6:22ad12682a5d | 548 | omuni.drive(); |
Akito914 | 6:22ad12682a5d | 549 | |
Akito914 | 1:baab5b88a142 | 550 | arm_control(); |
Akito914 | 1:baab5b88a142 | 551 | lift_control(); |
Akito914 | 1:baab5b88a142 | 552 | spear_control(); |
Akito914 | 1:baab5b88a142 | 553 | |
sawai | 0:6da7d0e457a2 | 554 | } |
sawai | 0:6da7d0e457a2 | 555 | |
sawai | 0:6da7d0e457a2 | 556 | int main() |
sawai | 0:6da7d0e457a2 | 557 | { |
Akito914 | 10:f17b33dd837d | 558 | bool ex_comTimeout_state = true; |
Akito914 | 10:f17b33dd837d | 559 | char currentState; |
Akito914 | 10:f17b33dd837d | 560 | |
Akito914 | 4:5591d3c8a761 | 561 | pc.baud(115200); |
Akito914 | 10:f17b33dd837d | 562 | comMain.baud(19200); |
Akito914 | 10:f17b33dd837d | 563 | comSub.baud(115200); |
Akito914 | 4:5591d3c8a761 | 564 | pc.printf("Hello!\n"); |
Akito914 | 10:f17b33dd837d | 565 | comMain.attach(comMain_rx, Serial::RxIrq); |
Akito914 | 10:f17b33dd837d | 566 | comSub.attach(comSub_rx, Serial::RxIrq); |
Akito914 | 1:baab5b88a142 | 567 | |
Akito914 | 3:6223efea43fe | 568 | i2cMaster.frequency(400000); |
Akito914 | 1:baab5b88a142 | 569 | |
sawai | 0:6da7d0e457a2 | 570 | omuni.set_speed(0.0f, 0.0f); |
sawai | 0:6da7d0e457a2 | 571 | omuni.set_pid(0, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 572 | omuni.set_pid(1, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 573 | omuni.set_pid(2, 3.0f, 0.07f, 0.05f); |
sawai | 0:6da7d0e457a2 | 574 | |
Akito914 | 10:f17b33dd837d | 575 | omuni.change_motor_direction(0, false); |
Akito914 | 10:f17b33dd837d | 576 | omuni.change_motor_direction(1, false); |
Akito914 | 10:f17b33dd837d | 577 | omuni.change_motor_direction(2, false); |
Akito914 | 10:f17b33dd837d | 578 | omuni.change_coordinates_direction(true, true); |
Akito914 | 10:f17b33dd837d | 579 | |
Akito914 | 10:f17b33dd837d | 580 | lift_pid.param(1.0, 0.0, 0.0); |
Akito914 | 1:baab5b88a142 | 581 | lift_pid.period(0.001); |
Akito914 | 1:baab5b88a142 | 582 | lift_pid.output(-127, 127); |
Akito914 | 1:baab5b88a142 | 583 | |
Akito914 | 4:5591d3c8a761 | 584 | comTimeout.attach_us(comTimeout_intr, 1000); |
Akito914 | 1:baab5b88a142 | 585 | |
Akito914 | 1:baab5b88a142 | 586 | led = 0; |
Akito914 | 1:baab5b88a142 | 587 | |
Akito914 | 9:bf6d20813364 | 588 | //esc_sound(0); |
Akito914 | 4:5591d3c8a761 | 589 | /* |
Akito914 | 9:bf6d20813364 | 590 | beep_note(96, 150); |
Akito914 | 9:bf6d20813364 | 591 | beep_note(98, 150); |
Akito914 | 9:bf6d20813364 | 592 | beep_note(100, 220); |
Akito914 | 4:5591d3c8a761 | 593 | */ |
Akito914 | 9:bf6d20813364 | 594 | beep_note(100, 500); |
Akito914 | 1:baab5b88a142 | 595 | |
Akito914 | 10:f17b33dd837d | 596 | |
Akito914 | 10:f17b33dd837d | 597 | int initial_meter = lift_meter.read_u16() >> 6; |
Akito914 | 10:f17b33dd837d | 598 | #if LIFT_METER_INVERSION |
Akito914 | 10:f17b33dd837d | 599 | initial_meter = 1023 - initial_meter; |
Akito914 | 10:f17b33dd837d | 600 | #endif |
Akito914 | 10:f17b33dd837d | 601 | |
Akito914 | 10:f17b33dd837d | 602 | lift_targ = initial_meter; |
Akito914 | 10:f17b33dd837d | 603 | |
Akito914 | 10:f17b33dd837d | 604 | lift_stepTarg = lift_preset[0]; |
Akito914 | 10:f17b33dd837d | 605 | lift_stepMoving = true; |
Akito914 | 10:f17b33dd837d | 606 | |
Akito914 | 10:f17b33dd837d | 607 | drive_motor(EMO_Addr, 3); |
Akito914 | 10:f17b33dd837d | 608 | |
Akito914 | 10:f17b33dd837d | 609 | |
sawai | 0:6da7d0e457a2 | 610 | while(1) |
sawai | 0:6da7d0e457a2 | 611 | { |
Akito914 | 2:c9de02d6d154 | 612 | wait(0.001); |
sawai | 0:6da7d0e457a2 | 613 | |
Akito914 | 10:f17b33dd837d | 614 | i2cMaster.read(EMO_Addr, ¤tState, 1); |
Akito914 | 10:f17b33dd837d | 615 | if((currentState & 0b00000010) != 0){ |
Akito914 | 10:f17b33dd837d | 616 | for(int count = 0; count < 15; count++){ |
Akito914 | 10:f17b33dd837d | 617 | beep_note(100, 100); |
Akito914 | 10:f17b33dd837d | 618 | wait_ms(100); |
Akito914 | 10:f17b33dd837d | 619 | } |
Akito914 | 10:f17b33dd837d | 620 | while(ems == false); |
Akito914 | 10:f17b33dd837d | 621 | emergencyStop(); |
Akito914 | 10:f17b33dd837d | 622 | } |
Akito914 | 10:f17b33dd837d | 623 | |
Akito914 | 6:22ad12682a5d | 624 | if(comTimeout_state == false){ |
Akito914 | 6:22ad12682a5d | 625 | control(); |
Akito914 | 6:22ad12682a5d | 626 | } |
Akito914 | 6:22ad12682a5d | 627 | else{ |
Akito914 | 6:22ad12682a5d | 628 | drive_motor(EMO_Addr, 0); |
Akito914 | 6:22ad12682a5d | 629 | } |
Akito914 | 4:5591d3c8a761 | 630 | |
Akito914 | 10:f17b33dd837d | 631 | if(ex_comTimeout_state == false && comTimeout_state == true){ |
Akito914 | 10:f17b33dd837d | 632 | beep_note(100, 100); |
Akito914 | 10:f17b33dd837d | 633 | beep_note(96, 100); |
Akito914 | 10:f17b33dd837d | 634 | } |
Akito914 | 10:f17b33dd837d | 635 | else if(ex_comTimeout_state == true && comTimeout_state == false){ |
Akito914 | 10:f17b33dd837d | 636 | beep_note(96, 100); |
Akito914 | 10:f17b33dd837d | 637 | beep_note(100, 100); |
Akito914 | 10:f17b33dd837d | 638 | } |
Akito914 | 10:f17b33dd837d | 639 | |
Akito914 | 10:f17b33dd837d | 640 | ex_comTimeout_state = comTimeout_state; |
Akito914 | 10:f17b33dd837d | 641 | |
Akito914 | 1:baab5b88a142 | 642 | if(ems){ |
Akito914 | 1:baab5b88a142 | 643 | emergencyStop(); |
Akito914 | 1:baab5b88a142 | 644 | } |
sawai | 0:6da7d0e457a2 | 645 | } |
Akito914 | 1:baab5b88a142 | 646 | } |
Akito914 | 1:baab5b88a142 | 647 | |
Akito914 | 1:baab5b88a142 | 648 | int drive_motor(int address,signed int duty){ /* アドレスを指定してモータを駆動 */ |
Akito914 | 1:baab5b88a142 | 649 | char send_data; |
Akito914 | 1:baab5b88a142 | 650 | int ack; |
Akito914 | 1:baab5b88a142 | 651 | if((duty>127)||(duty<-128))return -1; /* 範囲外なら送信しない */ |
Akito914 | 1:baab5b88a142 | 652 | send_data=duty; |
Akito914 | 1:baab5b88a142 | 653 | ack=i2cMaster.write(address,&send_data,1); |
Akito914 | 1:baab5b88a142 | 654 | return ack; |
Akito914 | 1:baab5b88a142 | 655 | } |
Akito914 | 1:baab5b88a142 | 656 | |
Akito914 | 1:baab5b88a142 | 657 | void emergencyStop(){ |
Akito914 | 1:baab5b88a142 | 658 | drive_motor(omuniAddr[0], 0); |
Akito914 | 1:baab5b88a142 | 659 | drive_motor(omuniAddr[1], 0); |
Akito914 | 1:baab5b88a142 | 660 | drive_motor(omuniAddr[2], 0); |
Akito914 | 1:baab5b88a142 | 661 | drive_motor(armAddr[0], 0); |
Akito914 | 1:baab5b88a142 | 662 | drive_motor(armAddr[1], 0); |
Akito914 | 1:baab5b88a142 | 663 | drive_motor(liftAddr, 0); |
Akito914 | 1:baab5b88a142 | 664 | drive_motor(spearAddr, 0); |
Akito914 | 4:5591d3c8a761 | 665 | |
Akito914 | 4:5591d3c8a761 | 666 | drive_motor(EMO_Addr, 0); |
Akito914 | 4:5591d3c8a761 | 667 | |
Akito914 | 10:f17b33dd837d | 668 | beep_note(100, 100); |
Akito914 | 10:f17b33dd837d | 669 | beep_note(96, 100); |
Akito914 | 10:f17b33dd837d | 670 | |
Akito914 | 10:f17b33dd837d | 671 | while(1){ |
Akito914 | 10:f17b33dd837d | 672 | } |
Akito914 | 8:956a76b98da0 | 673 | |
Akito914 | 1:baab5b88a142 | 674 | } |
Akito914 | 1:baab5b88a142 | 675 | |
Akito914 | 1:baab5b88a142 | 676 | |
Akito914 | 9:bf6d20813364 | 677 | |
Akito914 | 9:bf6d20813364 | 678 | /*************** sound ***************/ |
Akito914 | 9:bf6d20813364 | 679 | |
Akito914 | 9:bf6d20813364 | 680 | void pi(int times){ |
Akito914 | 9:bf6d20813364 | 681 | int count=0; |
Akito914 | 9:bf6d20813364 | 682 | |
Akito914 | 9:bf6d20813364 | 683 | for(count=0;count<times;count++){ |
Akito914 | 9:bf6d20813364 | 684 | beep(379,50); |
Akito914 | 9:bf6d20813364 | 685 | wait_ms(50); |
Akito914 | 9:bf6d20813364 | 686 | } |
Akito914 | 9:bf6d20813364 | 687 | wait_ms(300); |
Akito914 | 9:bf6d20813364 | 688 | } |
Akito914 | 9:bf6d20813364 | 689 | |
Akito914 | 9:bf6d20813364 | 690 | void esc_sound(int key){ |
Akito914 | 9:bf6d20813364 | 691 | int count=0; |
Akito914 | 9:bf6d20813364 | 692 | |
Akito914 | 9:bf6d20813364 | 693 | wait_ms(60); |
Akito914 | 9:bf6d20813364 | 694 | beep_note(96 + key,150); |
Akito914 | 9:bf6d20813364 | 695 | beep_note(98 + key,150); |
Akito914 | 9:bf6d20813364 | 696 | beep_note(100 + key,220); |
Akito914 | 9:bf6d20813364 | 697 | wait_ms(1200); |
Akito914 | 9:bf6d20813364 | 698 | for(count=0;count<6;count++){ |
Akito914 | 9:bf6d20813364 | 699 | beep_note(96 + key,110); |
Akito914 | 9:bf6d20813364 | 700 | wait_ms(150); |
Akito914 | 9:bf6d20813364 | 701 | } |
Akito914 | 9:bf6d20813364 | 702 | wait_ms(1000); |
Akito914 | 9:bf6d20813364 | 703 | beep_note(96 + key,300); |
Akito914 | 9:bf6d20813364 | 704 | wait_ms(100); |
Akito914 | 9:bf6d20813364 | 705 | } |
Akito914 | 9:bf6d20813364 | 706 | |
Akito914 | 9:bf6d20813364 | 707 | void q_sound(void){ |
Akito914 | 9:bf6d20813364 | 708 | beep(478,100); |
Akito914 | 9:bf6d20813364 | 709 | beep(379,100); |
Akito914 | 9:bf6d20813364 | 710 | } |
Akito914 | 9:bf6d20813364 | 711 | |
Akito914 | 9:bf6d20813364 | 712 | void ans_sound(void){ |
Akito914 | 9:bf6d20813364 | 713 | beep(379,100); |
Akito914 | 9:bf6d20813364 | 714 | beep(478,100); |
Akito914 | 9:bf6d20813364 | 715 | } |
Akito914 | 9:bf6d20813364 | 716 | |
Akito914 | 9:bf6d20813364 | 717 | void piroro(void){ |
Akito914 | 9:bf6d20813364 | 718 | beep(379,100); |
Akito914 | 9:bf6d20813364 | 719 | beep(426,100); |
Akito914 | 9:bf6d20813364 | 720 | beep(478,100); |
Akito914 | 9:bf6d20813364 | 721 | } |
Akito914 | 9:bf6d20813364 | 722 | |
Akito914 | 9:bf6d20813364 | 723 | void beep(int T_us,int t_ms){ |
Akito914 | 9:bf6d20813364 | 724 | |
Akito914 | 9:bf6d20813364 | 725 | if(T_us==0 || t_ms==0)return; |
Akito914 | 9:bf6d20813364 | 726 | |
Akito914 | 9:bf6d20813364 | 727 | soundOut.period_us(T_us); |
Akito914 | 9:bf6d20813364 | 728 | soundOut.write(0.50); |
Akito914 | 9:bf6d20813364 | 729 | |
Akito914 | 9:bf6d20813364 | 730 | wait_ms(t_ms); |
Akito914 | 9:bf6d20813364 | 731 | |
Akito914 | 9:bf6d20813364 | 732 | soundOut.write(0.0); |
Akito914 | 9:bf6d20813364 | 733 | soundOut.period_us(100); |
Akito914 | 9:bf6d20813364 | 734 | |
Akito914 | 9:bf6d20813364 | 735 | return; |
Akito914 | 9:bf6d20813364 | 736 | } |
Akito914 | 9:bf6d20813364 | 737 | |
Akito914 | 9:bf6d20813364 | 738 | void beep_freq(int freq,int t_ms){ |
Akito914 | 9:bf6d20813364 | 739 | beep(1000000.0 / freq, t_ms); |
Akito914 | 9:bf6d20813364 | 740 | } |
Akito914 | 9:bf6d20813364 | 741 | |
Akito914 | 9:bf6d20813364 | 742 | void beep_note(int note, int t_ms){ |
Akito914 | 9:bf6d20813364 | 743 | beep(pow(2.0, (69 - note) / 12.0) * 1000000.0 / 440.0, t_ms); |
Akito914 | 9:bf6d20813364 | 744 | } |
Akito914 | 9:bf6d20813364 | 745 | |
Akito914 | 9:bf6d20813364 | 746 | void check_beep_turn(bool turn){ |
Akito914 | 9:bf6d20813364 | 747 | if(turn){ |
Akito914 | 9:bf6d20813364 | 748 | soundOut.period_us(note2period_us(note_kouka[sound_count] + kouka_key)); |
Akito914 | 9:bf6d20813364 | 749 | soundOut.write(0.50); |
Akito914 | 9:bf6d20813364 | 750 | if(sound_count < kouka_size - 1)sound_count++; |
Akito914 | 9:bf6d20813364 | 751 | else sound_count = 0; |
Akito914 | 9:bf6d20813364 | 752 | } |
Akito914 | 9:bf6d20813364 | 753 | else{ |
Akito914 | 9:bf6d20813364 | 754 | soundOut.write(0.0); |
Akito914 | 9:bf6d20813364 | 755 | } |
Akito914 | 9:bf6d20813364 | 756 | } |
Akito914 | 9:bf6d20813364 | 757 | |
Akito914 | 9:bf6d20813364 | 758 | int getPeriod_us(int freq){ |
Akito914 | 9:bf6d20813364 | 759 | if(freq<=0)return 0; |
Akito914 | 9:bf6d20813364 | 760 | return 1000000.0/freq ; |
Akito914 | 9:bf6d20813364 | 761 | } |
Akito914 | 9:bf6d20813364 | 762 | |
Akito914 | 9:bf6d20813364 | 763 | |
Akito914 | 9:bf6d20813364 | 764 | int freq2period_us(int freq){ |
Akito914 | 9:bf6d20813364 | 765 | if(freq<=0)return 0; |
Akito914 | 9:bf6d20813364 | 766 | return 1000000.0/freq ; |
Akito914 | 9:bf6d20813364 | 767 | } |
Akito914 | 9:bf6d20813364 | 768 | |
Akito914 | 9:bf6d20813364 | 769 | int note2period_us(int note){ |
Akito914 | 9:bf6d20813364 | 770 | return freq2period_us(440.0 * pow(2.0, (note - 69) / 12.0)); |
Akito914 | 9:bf6d20813364 | 771 | } |
Akito914 | 9:bf6d20813364 | 772 | |
Akito914 | 9:bf6d20813364 | 773 | |
Akito914 | 9:bf6d20813364 | 774 | /*******************************************/ |
Akito914 | 9:bf6d20813364 | 775 |