this code is completely restructured, but should do the same thing. did not want to directly commit, since it may not work at all. compiles though.
Dependencies: AVEncoder mbed-src-AV
Fork of Test by
main.cpp@12:0849b16c2672, 2015-12-05 (annotated)
- Committer:
- jimmery
- Date:
- Sat Dec 05 00:26:26 2015 +0000
- Revision:
- 12:0849b16c2672
- Parent:
- 11:cde87eaf3f0f
- Child:
- 13:5f08195456a4
gyro turn readded. more robust;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jimmery | 0:13d8a77fb1d7 | 1 | #include "mbed.h" |
jimmery | 0:13d8a77fb1d7 | 2 | #include "AVEncoder.h" |
jimmery | 0:13d8a77fb1d7 | 3 | |
jimmery | 0:13d8a77fb1d7 | 4 | // set things |
jimmery | 0:13d8a77fb1d7 | 5 | Serial pc(SERIAL_TX, SERIAL_RX); |
jimmery | 0:13d8a77fb1d7 | 6 | Ticker Systicker; |
jimmery | 0:13d8a77fb1d7 | 7 | |
jimmery | 0:13d8a77fb1d7 | 8 | PwmOut right_forward(PB_10); |
jimmery | 0:13d8a77fb1d7 | 9 | PwmOut right_reverse(PA_6); |
jimmery | 0:13d8a77fb1d7 | 10 | PwmOut left_forward(PA_7); |
jimmery | 0:13d8a77fb1d7 | 11 | PwmOut left_reverse(PB_6); |
jimmery | 0:13d8a77fb1d7 | 12 | |
jimmery | 0:13d8a77fb1d7 | 13 | // TODO: change our encoder pins from AnalogIn into: |
jimmery | 0:13d8a77fb1d7 | 14 | // otherwise, we can also use the AVEncoder thing as well. |
jimmery | 0:13d8a77fb1d7 | 15 | AVEncoder l_enco(PA_15, PB_3); |
jimmery | 0:13d8a77fb1d7 | 16 | AVEncoder r_enco(PA_1, PA_10); |
jimmery | 0:13d8a77fb1d7 | 17 | |
jimmery | 0:13d8a77fb1d7 | 18 | // gyro |
jimmery | 0:13d8a77fb1d7 | 19 | AnalogIn _gyro(PA_0); |
jimmery | 0:13d8a77fb1d7 | 20 | // AnalogIn gyro_cal(PC_1) ?? currently this isn't connected. |
jimmery | 0:13d8a77fb1d7 | 21 | |
jimmery | 0:13d8a77fb1d7 | 22 | //Left Front IR |
jimmery | 0:13d8a77fb1d7 | 23 | DigitalOut eLF(PC_3); |
jimmery | 0:13d8a77fb1d7 | 24 | AnalogIn rLF(PC_0); |
jimmery | 0:13d8a77fb1d7 | 25 | //PC_4 is an ADC |
jimmery | 0:13d8a77fb1d7 | 26 | //Left Side IR |
jimmery | 0:13d8a77fb1d7 | 27 | DigitalOut eLS(PC_2); |
jimmery | 0:13d8a77fb1d7 | 28 | AnalogIn rLS(PC_1); |
jimmery | 0:13d8a77fb1d7 | 29 | |
intgsull | 3:40333f38771d | 30 | //Right Side IR |
intgsull | 3:40333f38771d | 31 | DigitalOut eRS(PC_12); |
intgsull | 3:40333f38771d | 32 | AnalogIn rRS(PA_4); |
jimmery | 0:13d8a77fb1d7 | 33 | |
intgsull | 3:40333f38771d | 34 | //Right Front IR |
intgsull | 3:40333f38771d | 35 | DigitalOut eRF(PC_15); |
intgsull | 3:40333f38771d | 36 | AnalogIn rRF(PB_0); |
jimmery | 0:13d8a77fb1d7 | 37 | |
jimmery | 0:13d8a77fb1d7 | 38 | DigitalOut myled(LED1); |
jimmery | 0:13d8a77fb1d7 | 39 | |
jimmery | 0:13d8a77fb1d7 | 40 | volatile float gyro_offset = 0; |
jimmery | 0:13d8a77fb1d7 | 41 | |
jimmery | 0:13d8a77fb1d7 | 42 | volatile float line_prevError = 0; |
jimmery | 0:13d8a77fb1d7 | 43 | volatile float enco_prevError = 0; |
jimmery | 0:13d8a77fb1d7 | 44 | volatile float gyro_prevError = 0; |
jimmery | 0:13d8a77fb1d7 | 45 | |
jimmery | 0:13d8a77fb1d7 | 46 | volatile float line_accumulator = 0; |
jimmery | 0:13d8a77fb1d7 | 47 | volatile float line_decayFactor = 1; |
jimmery | 0:13d8a77fb1d7 | 48 | volatile float enco_accumulator = 0; |
jimmery | 9:ad6f60953086 | 49 | volatile float enco_decayFactor = 1; |
jimmery | 0:13d8a77fb1d7 | 50 | volatile float gyro_accumulator = 0; |
jimmery | 12:0849b16c2672 | 51 | volatile float gyro_decayFactor = 1.1; |
jimmery | 0:13d8a77fb1d7 | 52 | |
intgsull | 4:112f3d35bd2d | 53 | volatile float set_speed = .75; |
intgsull | 4:112f3d35bd2d | 54 | volatile float left_speed = .75; |
intgsull | 4:112f3d35bd2d | 55 | volatile float right_speed = .75; |
jimmery | 0:13d8a77fb1d7 | 56 | |
intgsull | 4:112f3d35bd2d | 57 | const float left_max_speed = 5; // max speed is 6 encoder pulses per ms. |
intgsull | 4:112f3d35bd2d | 58 | const float right_max_speed = 5; |
jimmery | 0:13d8a77fb1d7 | 59 | |
jimmery | 2:82a11e992619 | 60 | const float gyro_propo = 6.5; |
jimmery | 0:13d8a77fb1d7 | 61 | const float gyro_integ = 0; |
jimmery | 2:82a11e992619 | 62 | const float gyro_deriv = 10; |
jimmery | 0:13d8a77fb1d7 | 63 | |
aduriseti | 6:61b503990cd6 | 64 | const float enco_propo = 6; |
jimmery | 9:ad6f60953086 | 65 | const float enco_integ = 0;//1; |
jimmery | 7:b866e3aae05f | 66 | const float enco_deriv = 1000;//.0002; |
jimmery | 0:13d8a77fb1d7 | 67 | |
intgsull | 3:40333f38771d | 68 | const float spin_enco_weight = 1; |
jimmery | 0:13d8a77fb1d7 | 69 | const float spin_gyro_weight = 1 - spin_enco_weight; |
jimmery | 0:13d8a77fb1d7 | 70 | |
jimmery | 7:b866e3aae05f | 71 | const float base_RS = 0.2; |
jimmery | 7:b866e3aae05f | 72 | const float base_LS = 0.1; |
jimmery | 7:b866e3aae05f | 73 | const float base_RF = 0.002; |
jimmery | 7:b866e3aae05f | 74 | const float base_LF = 0.15; |
jimmery | 7:b866e3aae05f | 75 | |
jimmery | 12:0849b16c2672 | 76 | const float thresh_LF = 0.3; |
jimmery | 7:b866e3aae05f | 77 | const float thresh_RF = 0.0045; // TODO: CAUTION USING THIS ALONE. |
intgsull | 8:03e5c3aaa9c9 | 78 | |
intgsull | 8:03e5c3aaa9c9 | 79 | const float open_left = 0.22; //calibrate these two |
intgsull | 8:03e5c3aaa9c9 | 80 | const float open_right = 0.18; |
intgsull | 8:03e5c3aaa9c9 | 81 | const float wall_left = 0; |
intgsull | 8:03e5c3aaa9c9 | 82 | const float wall_right = 0; |
intgsull | 8:03e5c3aaa9c9 | 83 | |
jimmery | 10:d2907773f9a3 | 84 | volatile float lf_val; |
jimmery | 10:d2907773f9a3 | 85 | volatile float rf_val; |
jimmery | 10:d2907773f9a3 | 86 | volatile float ls_val; |
jimmery | 10:d2907773f9a3 | 87 | volatile float rs_val; |
intgsull | 1:98efd8dd9077 | 88 | |
jimmery | 0:13d8a77fb1d7 | 89 | volatile float enco_error; |
jimmery | 0:13d8a77fb1d7 | 90 | volatile float enco_pid; |
jimmery | 0:13d8a77fb1d7 | 91 | volatile float gyro_error; |
jimmery | 0:13d8a77fb1d7 | 92 | volatile float gyro_pid; |
jimmery | 0:13d8a77fb1d7 | 93 | volatile float w_error; |
jimmery | 0:13d8a77fb1d7 | 94 | |
intgsull | 8:03e5c3aaa9c9 | 95 | typedef enum |
intgsull | 8:03e5c3aaa9c9 | 96 | { |
intgsull | 8:03e5c3aaa9c9 | 97 | LEFT, |
jimmery | 9:ad6f60953086 | 98 | RIGHT, |
jimmery | 9:ad6f60953086 | 99 | INVALID |
intgsull | 8:03e5c3aaa9c9 | 100 | } TURN_DIRECTION; |
intgsull | 8:03e5c3aaa9c9 | 101 | volatile TURN_DIRECTION turn_direction; |
aduriseti | 5:f704940c9c7e | 102 | |
jimmery | 9:ad6f60953086 | 103 | //volatile int turn_counter; |
intgsull | 8:03e5c3aaa9c9 | 104 | volatile int right_turn_count; |
intgsull | 8:03e5c3aaa9c9 | 105 | volatile int examined_left; |
intgsull | 8:03e5c3aaa9c9 | 106 | volatile int examined_right; |
intgsull | 8:03e5c3aaa9c9 | 107 | |
intgsull | 8:03e5c3aaa9c9 | 108 | //time to make a 90 degree turn and move forward one cell length, repectively |
intgsull | 8:03e5c3aaa9c9 | 109 | //should be replaced with encoder counts |
intgsull | 11:cde87eaf3f0f | 110 | const int lmax_turn_count = 620; //I think we need different constants for left/right |
intgsull | 11:cde87eaf3f0f | 111 | const int rmax_turn_count = 0; |
jimmery | 12:0849b16c2672 | 112 | const int cell_length_count = 875; |
jimmery | 12:0849b16c2672 | 113 | const float gyro_90 = 0.595; |
intgsull | 4:112f3d35bd2d | 114 | |
intgsull | 8:03e5c3aaa9c9 | 115 | volatile int forward_counter = 0; |
intgsull | 4:112f3d35bd2d | 116 | |
jimmery | 2:82a11e992619 | 117 | // this is just so that we can maintain what state our mouse is in. |
jimmery | 2:82a11e992619 | 118 | // currently this has no real use, but it may in the future. |
jimmery | 2:82a11e992619 | 119 | // or we could just remove this entirely. |
jimmery | 2:82a11e992619 | 120 | typedef enum |
jimmery | 2:82a11e992619 | 121 | { |
jimmery | 2:82a11e992619 | 122 | STOPPED, |
jimmery | 2:82a11e992619 | 123 | FORWARD, |
aduriseti | 5:f704940c9c7e | 124 | TURNING, |
intgsull | 8:03e5c3aaa9c9 | 125 | MOVECELL, |
aduriseti | 5:f704940c9c7e | 126 | FINISHED, |
jimmery | 2:82a11e992619 | 127 | UNKNOWN |
jimmery | 2:82a11e992619 | 128 | } STATE; |
jimmery | 2:82a11e992619 | 129 | volatile STATE mouse_state; |
jimmery | 2:82a11e992619 | 130 | |
aduriseti | 6:61b503990cd6 | 131 | volatile int wall_in_front = 0; |
aduriseti | 6:61b503990cd6 | 132 | volatile int opening_left_ahead = 0; |
aduriseti | 6:61b503990cd6 | 133 | volatile int opening_right_ahead = 0; |
intgsull | 8:03e5c3aaa9c9 | 134 | volatile int opening_left = 0; |
intgsull | 8:03e5c3aaa9c9 | 135 | volatile int opening_right = 0; |
aduriseti | 6:61b503990cd6 | 136 | |
intgsull | 8:03e5c3aaa9c9 | 137 | void Scan(); |
jimmery | 2:82a11e992619 | 138 | void offsetCalc(); |
jimmery | 2:82a11e992619 | 139 | void stop(); |
jimmery | 2:82a11e992619 | 140 | |
aduriseti | 5:f704940c9c7e | 141 | void encoder_reset() |
jimmery | 0:13d8a77fb1d7 | 142 | { |
jimmery | 0:13d8a77fb1d7 | 143 | l_enco.reset(); |
jimmery | 0:13d8a77fb1d7 | 144 | r_enco.reset(); |
jimmery | 12:0849b16c2672 | 145 | |
jimmery | 12:0849b16c2672 | 146 | enco_accumulator = 0; |
jimmery | 12:0849b16c2672 | 147 | gyro_accumulator = 0; |
jimmery | 0:13d8a77fb1d7 | 148 | } |
jimmery | 0:13d8a77fb1d7 | 149 | |
intgsull | 8:03e5c3aaa9c9 | 150 | //combining detect opening and watch out |
jimmery | 10:d2907773f9a3 | 151 | bool forward_wall_detected() |
jimmery | 10:d2907773f9a3 | 152 | { |
jimmery | 10:d2907773f9a3 | 153 | return lf_val > thresh_LF; |
jimmery | 10:d2907773f9a3 | 154 | } |
jimmery | 10:d2907773f9a3 | 155 | |
jimmery | 10:d2907773f9a3 | 156 | bool side_wall_detected() |
jimmery | 10:d2907773f9a3 | 157 | { |
jimmery | 10:d2907773f9a3 | 158 | if (rs_val < open_right) |
jimmery | 10:d2907773f9a3 | 159 | { |
jimmery | 10:d2907773f9a3 | 160 | mouse_state = MOVECELL; |
jimmery | 10:d2907773f9a3 | 161 | turn_direction = RIGHT; |
jimmery | 10:d2907773f9a3 | 162 | return true; |
jimmery | 10:d2907773f9a3 | 163 | } |
jimmery | 10:d2907773f9a3 | 164 | else if (ls_val < open_left) |
jimmery | 10:d2907773f9a3 | 165 | { |
jimmery | 10:d2907773f9a3 | 166 | mouse_state = MOVECELL; |
jimmery | 10:d2907773f9a3 | 167 | turn_direction = LEFT; |
jimmery | 10:d2907773f9a3 | 168 | return true; |
jimmery | 10:d2907773f9a3 | 169 | } |
jimmery | 10:d2907773f9a3 | 170 | |
jimmery | 10:d2907773f9a3 | 171 | return false; |
jimmery | 10:d2907773f9a3 | 172 | } |
jimmery | 10:d2907773f9a3 | 173 | |
jimmery | 10:d2907773f9a3 | 174 | // updates PID values. |
jimmery | 10:d2907773f9a3 | 175 | void scan() |
intgsull | 8:03e5c3aaa9c9 | 176 | { |
jimmery | 9:ad6f60953086 | 177 | eRS = 1; |
jimmery | 9:ad6f60953086 | 178 | wait_us(50); |
jimmery | 10:d2907773f9a3 | 179 | rs_val = rRS.read(); |
aduriseti | 6:61b503990cd6 | 180 | eRS = 0; |
intgsull | 8:03e5c3aaa9c9 | 181 | |
aduriseti | 6:61b503990cd6 | 182 | eLS = 1; |
intgsull | 8:03e5c3aaa9c9 | 183 | wait_us(50); |
jimmery | 10:d2907773f9a3 | 184 | ls_val = rLS.read(); |
aduriseti | 6:61b503990cd6 | 185 | eLS = 0; |
jimmery | 10:d2907773f9a3 | 186 | |
intgsull | 8:03e5c3aaa9c9 | 187 | eLF = 1; |
jimmery | 9:ad6f60953086 | 188 | wait_us(50); |
jimmery | 10:d2907773f9a3 | 189 | lf_val = rLF.read(); |
intgsull | 8:03e5c3aaa9c9 | 190 | } |
intgsull | 8:03e5c3aaa9c9 | 191 | |
aduriseti | 6:61b503990cd6 | 192 | |
jimmery | 0:13d8a77fb1d7 | 193 | void systick() |
jimmery | 0:13d8a77fb1d7 | 194 | { |
jimmery | 10:d2907773f9a3 | 195 | scan(); // get the IR values. |
jimmery | 9:ad6f60953086 | 196 | // these values are useful regardless of what mouse_state we are in. |
jimmery | 9:ad6f60953086 | 197 | switch (mouse_state) |
jimmery | 2:82a11e992619 | 198 | { |
jimmery | 9:ad6f60953086 | 199 | case STOPPED: |
jimmery | 9:ad6f60953086 | 200 | offsetCalc(); |
jimmery | 9:ad6f60953086 | 201 | encoder_reset(); |
jimmery | 9:ad6f60953086 | 202 | break; |
jimmery | 9:ad6f60953086 | 203 | case FORWARD: |
jimmery | 10:d2907773f9a3 | 204 | if ( forward_wall_detected() ) |
jimmery | 10:d2907773f9a3 | 205 | { |
jimmery | 10:d2907773f9a3 | 206 | mouse_state = STOPPED; |
jimmery | 10:d2907773f9a3 | 207 | turn_direction = LEFT; |
jimmery | 10:d2907773f9a3 | 208 | return; |
jimmery | 10:d2907773f9a3 | 209 | } |
jimmery | 10:d2907773f9a3 | 210 | |
jimmery | 10:d2907773f9a3 | 211 | // if ( side_wall_detected() ) |
jimmery | 10:d2907773f9a3 | 212 | // { |
jimmery | 10:d2907773f9a3 | 213 | // return; |
jimmery | 10:d2907773f9a3 | 214 | // } |
jimmery | 10:d2907773f9a3 | 215 | |
jimmery | 9:ad6f60953086 | 216 | enco_error = l_enco.getPulses() - r_enco.getPulses(); |
jimmery | 9:ad6f60953086 | 217 | gyro_error = _gyro.read() - gyro_offset; |
jimmery | 9:ad6f60953086 | 218 | |
jimmery | 9:ad6f60953086 | 219 | enco_accumulator += enco_error; |
jimmery | 9:ad6f60953086 | 220 | gyro_accumulator += gyro_error; |
jimmery | 9:ad6f60953086 | 221 | |
jimmery | 9:ad6f60953086 | 222 | enco_pid = 0; |
jimmery | 9:ad6f60953086 | 223 | enco_pid += enco_propo * enco_error; |
jimmery | 9:ad6f60953086 | 224 | enco_pid += enco_integ * enco_accumulator; |
jimmery | 9:ad6f60953086 | 225 | enco_pid += enco_deriv * (enco_error - enco_prevError); |
aduriseti | 5:f704940c9c7e | 226 | |
jimmery | 9:ad6f60953086 | 227 | gyro_pid = 0; |
jimmery | 9:ad6f60953086 | 228 | gyro_pid += gyro_propo * gyro_error; |
jimmery | 9:ad6f60953086 | 229 | gyro_pid += gyro_integ * gyro_accumulator; |
jimmery | 9:ad6f60953086 | 230 | gyro_pid += gyro_deriv * (gyro_error - gyro_prevError); |
jimmery | 9:ad6f60953086 | 231 | |
jimmery | 9:ad6f60953086 | 232 | w_error = spin_enco_weight * enco_pid + spin_gyro_weight * gyro_pid; |
jimmery | 9:ad6f60953086 | 233 | left_speed = set_speed + w_error; |
jimmery | 9:ad6f60953086 | 234 | right_speed = set_speed - w_error; |
jimmery | 9:ad6f60953086 | 235 | |
jimmery | 9:ad6f60953086 | 236 | enco_prevError = enco_error; |
jimmery | 9:ad6f60953086 | 237 | gyro_prevError = gyro_error; |
jimmery | 9:ad6f60953086 | 238 | |
jimmery | 9:ad6f60953086 | 239 | enco_accumulator += enco_error; |
jimmery | 9:ad6f60953086 | 240 | gyro_accumulator += gyro_error; |
jimmery | 9:ad6f60953086 | 241 | |
jimmery | 9:ad6f60953086 | 242 | enco_accumulator /= enco_decayFactor; |
jimmery | 9:ad6f60953086 | 243 | gyro_accumulator /= gyro_decayFactor; |
jimmery | 9:ad6f60953086 | 244 | break; |
jimmery | 9:ad6f60953086 | 245 | default: |
jimmery | 9:ad6f60953086 | 246 | // don't do anything. |
jimmery | 9:ad6f60953086 | 247 | break; |
jimmery | 2:82a11e992619 | 248 | } |
jimmery | 0:13d8a77fb1d7 | 249 | } |
jimmery | 0:13d8a77fb1d7 | 250 | |
jimmery | 0:13d8a77fb1d7 | 251 | // computes gyro_offset |
jimmery | 0:13d8a77fb1d7 | 252 | // uses a "weighted" average. |
jimmery | 0:13d8a77fb1d7 | 253 | // idea is that the current gyro offset is weighted more than previous ones. |
jimmery | 0:13d8a77fb1d7 | 254 | // uses the following y(n) = 1/2 * y(n-1) + 1/2 * x(n). |
jimmery | 0:13d8a77fb1d7 | 255 | // (therefore y(n) = sum of x(i)/2^i from i from 0 to n.) |
jimmery | 0:13d8a77fb1d7 | 256 | // this maintains that there will be some influence from previous factors, but keeps the current value at a higher weight. |
jimmery | 0:13d8a77fb1d7 | 257 | // currently this is only in the setup function. we can run this when the mouse is running in a line |
jimmery | 0:13d8a77fb1d7 | 258 | // when we figure out good line running pid. |
jimmery | 0:13d8a77fb1d7 | 259 | void offsetCalc() |
jimmery | 0:13d8a77fb1d7 | 260 | { |
jimmery | 0:13d8a77fb1d7 | 261 | gyro_offset = gyro_offset / 2 + _gyro.read() / 2; |
jimmery | 0:13d8a77fb1d7 | 262 | } |
jimmery | 0:13d8a77fb1d7 | 263 | |
jimmery | 0:13d8a77fb1d7 | 264 | |
intgsull | 1:98efd8dd9077 | 265 | void stop() |
intgsull | 1:98efd8dd9077 | 266 | { |
intgsull | 11:cde87eaf3f0f | 267 | left_forward = 0; |
intgsull | 11:cde87eaf3f0f | 268 | left_reverse = 0; |
intgsull | 11:cde87eaf3f0f | 269 | right_forward = 0; |
intgsull | 11:cde87eaf3f0f | 270 | right_reverse = 0; |
jimmery | 2:82a11e992619 | 271 | } |
aduriseti | 6:61b503990cd6 | 272 | |
aduriseti | 5:f704940c9c7e | 273 | void turn() { |
jimmery | 9:ad6f60953086 | 274 | // reopen for business. |
jimmery | 9:ad6f60953086 | 275 | |
jimmery | 12:0849b16c2672 | 276 | float angle_change = 0; |
jimmery | 9:ad6f60953086 | 277 | |
jimmery | 12:0849b16c2672 | 278 | switch(turn_direction) |
jimmery | 9:ad6f60953086 | 279 | { |
jimmery | 12:0849b16c2672 | 280 | case LEFT: |
jimmery | 12:0849b16c2672 | 281 | while (angle_change < gyro_90) |
jimmery | 12:0849b16c2672 | 282 | { |
jimmery | 12:0849b16c2672 | 283 | left_forward = 0; |
jimmery | 12:0849b16c2672 | 284 | right_forward = set_speed / right_max_speed; |
jimmery | 12:0849b16c2672 | 285 | left_reverse = set_speed / left_max_speed; |
jimmery | 12:0849b16c2672 | 286 | right_reverse = 0; |
jimmery | 12:0849b16c2672 | 287 | |
jimmery | 12:0849b16c2672 | 288 | pc.printf("gyro read: %f\r\n", _gyro.read()); |
jimmery | 12:0849b16c2672 | 289 | angle_change += _gyro.read() - gyro_offset; |
jimmery | 12:0849b16c2672 | 290 | } |
jimmery | 12:0849b16c2672 | 291 | break; |
jimmery | 12:0849b16c2672 | 292 | case RIGHT: |
jimmery | 12:0849b16c2672 | 293 | while (angle_change < gyro_90) |
jimmery | 9:ad6f60953086 | 294 | { |
jimmery | 12:0849b16c2672 | 295 | left_forward = set_speed / left_max_speed; |
jimmery | 12:0849b16c2672 | 296 | right_forward = 0; |
jimmery | 12:0849b16c2672 | 297 | left_reverse = 0; |
jimmery | 12:0849b16c2672 | 298 | right_forward = set_speed / right_max_speed; |
jimmery | 12:0849b16c2672 | 299 | |
jimmery | 12:0849b16c2672 | 300 | pc.printf("gyro read: %f\r\n", _gyro.read()); |
jimmery | 12:0849b16c2672 | 301 | angle_change += gyro_offset - _gyro.read(); |
jimmery | 9:ad6f60953086 | 302 | } |
jimmery | 12:0849b16c2672 | 303 | break; |
jimmery | 12:0849b16c2672 | 304 | default: |
jimmery | 12:0849b16c2672 | 305 | // error state. |
jimmery | 12:0849b16c2672 | 306 | break; |
jimmery | 9:ad6f60953086 | 307 | } |
jimmery | 12:0849b16c2672 | 308 | |
jimmery | 12:0849b16c2672 | 309 | // while ( turn_counter < lmax_turn_count ) |
jimmery | 12:0849b16c2672 | 310 | // { |
jimmery | 12:0849b16c2672 | 311 | // left_pulses = l_enco.getPulses(); |
jimmery | 12:0849b16c2672 | 312 | // right_pulses = r_enco.getPulses(); |
jimmery | 12:0849b16c2672 | 313 | // |
jimmery | 12:0849b16c2672 | 314 | // turn_counter = ((left_pulses - base_left_pulses) + (right_pulses - base_right_pulses)) / 2; |
jimmery | 12:0849b16c2672 | 315 | // |
jimmery | 12:0849b16c2672 | 316 | // switch(turn_direction) |
jimmery | 12:0849b16c2672 | 317 | // { |
jimmery | 12:0849b16c2672 | 318 | // case LEFT: |
jimmery | 12:0849b16c2672 | 319 | // left_forward = 0; |
jimmery | 12:0849b16c2672 | 320 | // right_forward = set_speed / right_max_speed; |
jimmery | 12:0849b16c2672 | 321 | // left_reverse = set_speed / left_max_speed; |
jimmery | 12:0849b16c2672 | 322 | // right_reverse = 0; |
jimmery | 12:0849b16c2672 | 323 | // break; |
jimmery | 12:0849b16c2672 | 324 | // case RIGHT: |
jimmery | 12:0849b16c2672 | 325 | // left_forward = set_speed / left_max_speed; |
jimmery | 12:0849b16c2672 | 326 | // right_forward = 0; |
jimmery | 12:0849b16c2672 | 327 | // left_reverse = 0; |
jimmery | 12:0849b16c2672 | 328 | // right_reverse = set_speed / right_max_speed; |
jimmery | 12:0849b16c2672 | 329 | // break; |
jimmery | 12:0849b16c2672 | 330 | // default: |
jimmery | 12:0849b16c2672 | 331 | // // invalid state. did not set a turn direction. |
jimmery | 12:0849b16c2672 | 332 | // mouse_state = STOPPED; |
jimmery | 12:0849b16c2672 | 333 | // break; |
jimmery | 12:0849b16c2672 | 334 | // } |
jimmery | 12:0849b16c2672 | 335 | // |
jimmery | 12:0849b16c2672 | 336 | // } |
aduriseti | 5:f704940c9c7e | 337 | } |
aduriseti | 6:61b503990cd6 | 338 | |
jimmery | 10:d2907773f9a3 | 339 | // TODO move_cell is not complete. this is copied code from systick. |
aduriseti | 6:61b503990cd6 | 340 | void move_cell() { |
jimmery | 10:d2907773f9a3 | 341 | //bacl in business boys. |
jimmery | 9:ad6f60953086 | 342 | if (mouse_state == MOVECELL) |
jimmery | 9:ad6f60953086 | 343 | { |
jimmery | 9:ad6f60953086 | 344 | forward_counter = 0.5 * (r_enco.getPulses() + l_enco.getPulses()); |
jimmery | 9:ad6f60953086 | 345 | if (forward_counter > 2000) |
jimmery | 9:ad6f60953086 | 346 | { |
jimmery | 9:ad6f60953086 | 347 | forward_counter = 0; |
jimmery | 9:ad6f60953086 | 348 | mouse_state = TURNING; |
jimmery | 9:ad6f60953086 | 349 | if (opening_left_ahead) |
jimmery | 9:ad6f60953086 | 350 | { |
jimmery | 9:ad6f60953086 | 351 | opening_left_ahead = 0; |
jimmery | 9:ad6f60953086 | 352 | turn_direction = LEFT; |
jimmery | 9:ad6f60953086 | 353 | } |
jimmery | 9:ad6f60953086 | 354 | else if (opening_right_ahead) |
jimmery | 9:ad6f60953086 | 355 | { |
jimmery | 9:ad6f60953086 | 356 | opening_right_ahead = 0; |
jimmery | 9:ad6f60953086 | 357 | } |
jimmery | 9:ad6f60953086 | 358 | encoder_reset(); //right? prepare for turn |
jimmery | 9:ad6f60953086 | 359 | } |
jimmery | 9:ad6f60953086 | 360 | } |
aduriseti | 6:61b503990cd6 | 361 | } |
aduriseti | 5:f704940c9c7e | 362 | |
jimmery | 0:13d8a77fb1d7 | 363 | void setup() |
jimmery | 0:13d8a77fb1d7 | 364 | { |
jimmery | 9:ad6f60953086 | 365 | eRS = 0; |
jimmery | 9:ad6f60953086 | 366 | eRF = 0; |
jimmery | 9:ad6f60953086 | 367 | eLS = 0; |
jimmery | 9:ad6f60953086 | 368 | eLF = 0; |
jimmery | 0:13d8a77fb1d7 | 369 | |
jimmery | 2:82a11e992619 | 370 | mouse_state = FORWARD; |
jimmery | 9:ad6f60953086 | 371 | turn_direction = INVALID; |
jimmery | 0:13d8a77fb1d7 | 372 | myled = 1; |
jimmery | 0:13d8a77fb1d7 | 373 | for ( int i = 0; i < 1000; i++ ) |
jimmery | 0:13d8a77fb1d7 | 374 | { |
jimmery | 0:13d8a77fb1d7 | 375 | offsetCalc(); |
jimmery | 0:13d8a77fb1d7 | 376 | } |
jimmery | 0:13d8a77fb1d7 | 377 | wait(2); |
jimmery | 0:13d8a77fb1d7 | 378 | |
jimmery | 0:13d8a77fb1d7 | 379 | Systicker.attach_us(&systick, 1000); |
jimmery | 0:13d8a77fb1d7 | 380 | } |
jimmery | 9:ad6f60953086 | 381 | |
jimmery | 10:d2907773f9a3 | 382 | int main() { |
jimmery | 10:d2907773f9a3 | 383 | setup(); |
jimmery | 10:d2907773f9a3 | 384 | while(1) { |
jimmery | 10:d2907773f9a3 | 385 | switch (mouse_state) |
jimmery | 10:d2907773f9a3 | 386 | { |
jimmery | 10:d2907773f9a3 | 387 | case STOPPED: |
jimmery | 10:d2907773f9a3 | 388 | stop(); |
jimmery | 10:d2907773f9a3 | 389 | wait(1); |
jimmery | 10:d2907773f9a3 | 390 | if ( turn_direction == INVALID ) |
jimmery | 10:d2907773f9a3 | 391 | { |
jimmery | 10:d2907773f9a3 | 392 | mouse_state = FORWARD; |
jimmery | 10:d2907773f9a3 | 393 | } |
jimmery | 10:d2907773f9a3 | 394 | else |
jimmery | 10:d2907773f9a3 | 395 | { |
jimmery | 10:d2907773f9a3 | 396 | mouse_state = TURNING; |
jimmery | 10:d2907773f9a3 | 397 | } |
jimmery | 10:d2907773f9a3 | 398 | break; |
jimmery | 10:d2907773f9a3 | 399 | case FORWARD: |
jimmery | 10:d2907773f9a3 | 400 | left_forward = left_speed / left_max_speed; |
jimmery | 10:d2907773f9a3 | 401 | left_reverse = 0; |
jimmery | 10:d2907773f9a3 | 402 | right_forward = right_speed / right_max_speed; |
jimmery | 10:d2907773f9a3 | 403 | right_reverse = 0; |
jimmery | 10:d2907773f9a3 | 404 | break; |
jimmery | 10:d2907773f9a3 | 405 | case TURNING: |
jimmery | 10:d2907773f9a3 | 406 | turn(); |
jimmery | 10:d2907773f9a3 | 407 | mouse_state = STOPPED; |
jimmery | 10:d2907773f9a3 | 408 | turn_direction = INVALID; |
jimmery | 10:d2907773f9a3 | 409 | break; |
jimmery | 10:d2907773f9a3 | 410 | case MOVECELL: |
jimmery | 10:d2907773f9a3 | 411 | move_cell(); |
jimmery | 12:0849b16c2672 | 412 | mouse_state = STOPPED; |
jimmery | 10:d2907773f9a3 | 413 | break; |
jimmery | 10:d2907773f9a3 | 414 | default: |
jimmery | 10:d2907773f9a3 | 415 | // idk lmao. show some error message? |
jimmery | 10:d2907773f9a3 | 416 | break; |
jimmery | 10:d2907773f9a3 | 417 | } |
jimmery | 10:d2907773f9a3 | 418 | } |
jimmery | 10:d2907773f9a3 | 419 | } |
jimmery | 10:d2907773f9a3 | 420 | |
jimmery | 10:d2907773f9a3 | 421 | |
jimmery | 9:ad6f60953086 | 422 | void test_IR_sensors() |
jimmery | 9:ad6f60953086 | 423 | { |
jimmery | 9:ad6f60953086 | 424 | eRS = 1; |
jimmery | 9:ad6f60953086 | 425 | wait_us(50); |
jimmery | 9:ad6f60953086 | 426 | float right_side = rRS.read(); |
jimmery | 9:ad6f60953086 | 427 | eRS = 0; |
jimmery | 9:ad6f60953086 | 428 | eLS = 1; |
jimmery | 9:ad6f60953086 | 429 | wait_us(50); |
jimmery | 9:ad6f60953086 | 430 | float left_side = rLS.read(); |
jimmery | 9:ad6f60953086 | 431 | eLS = 0; |
jimmery | 9:ad6f60953086 | 432 | eRF = 1; |
jimmery | 9:ad6f60953086 | 433 | wait_us(50); |
jimmery | 9:ad6f60953086 | 434 | float right_front = rRF.read(); |
jimmery | 9:ad6f60953086 | 435 | eRF = 0; |
jimmery | 9:ad6f60953086 | 436 | eLF = 1; |
jimmery | 9:ad6f60953086 | 437 | wait_us(50); |
jimmery | 9:ad6f60953086 | 438 | float left_front = rLF.read(); |
jimmery | 9:ad6f60953086 | 439 | eLF = 0; |
jimmery | 9:ad6f60953086 | 440 | pc.printf("right side: %f, left side: %f right_front: %f, left_front: %f \r\n", right_side, left_side, right_front, left_front); |
jimmery | 9:ad6f60953086 | 441 | wait(1); |
jimmery | 9:ad6f60953086 | 442 | } |
jimmery | 0:13d8a77fb1d7 | 443 | |
jimmery | 10:d2907773f9a3 | 444 | void test_motors() |
jimmery | 10:d2907773f9a3 | 445 | { |
jimmery | 10:d2907773f9a3 | 446 | encoder_reset(); |
jimmery | 10:d2907773f9a3 | 447 | |
jimmery | 10:d2907773f9a3 | 448 | right_forward = 1; |
jimmery | 10:d2907773f9a3 | 449 | left_forward = 1; |
jimmery | 10:d2907773f9a3 | 450 | right_reverse = 0; |
jimmery | 10:d2907773f9a3 | 451 | left_reverse = 0; |
jimmery | 10:d2907773f9a3 | 452 | |
jimmery | 10:d2907773f9a3 | 453 | wait(10); |
jimmery | 10:d2907773f9a3 | 454 | pc.printf("left pulses: %d, right pulses: %d", l_enco.getPulses(), r_enco.getPulses()); |
jimmery | 10:d2907773f9a3 | 455 | } |