TomYumBoys / Mbed 2 deprecated MM2017

Dependencies:   mbed

Committer:
kolanery
Date:
Sun May 28 06:49:41 2017 +0000
Revision:
30:daf286ac049f
Parent:
29:2224bc8bb49d
Child:
31:f7a8a9b82bc1
calibration

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kolanery 0:cb667de3a336 1 #include "drivecontrol.h"
kolanery 4:73510c7fa316 2 #include "io_modules.h"
szh66 6:1bcfda49e146 3 #include "mbed.h"
ryan_whr 25:7155cb993870 4 #include "maze_solver.h"
kolanery 16:c26d8e007df5 5 //// PIN ASSIGNMENTS
szh66 6:1bcfda49e146 6 AnalogIn battery(PA_3);
szh66 6:1bcfda49e146 7 DigitalOut led_1(PB_12);
szh66 6:1bcfda49e146 8 DigitalOut led_2(PB_13);
szh66 6:1bcfda49e146 9 DigitalOut led_3(PB_14);
szh66 6:1bcfda49e146 10 DigitalOut led_4(PB_15);
szh66 6:1bcfda49e146 11 Serial serial (PA_9, PA_10);
kolanery 29:2224bc8bb49d 12
kolanery 29:2224bc8bb49d 13 // Algorithm Switch
kolanery 29:2224bc8bb49d 14 DigitalIn alg_pin (PC_10);
kolanery 29:2224bc8bb49d 15
kolanery 16:c26d8e007df5 16 // CONTROL CONSTANTS
szh66 27:b980fce784ea 17 const unsigned char STRAIGHT = 0, LEFT = 1, RIGHT = 2, UTURN = 3;
kolanery 16:c26d8e007df5 18 const int START_POS = 0, END_POS = 0;
kolanery 16:c26d8e007df5 19 const int CONTROL = 1;
kolanery 28:600932142201 20 unsigned char state;
kolanery 28:600932142201 21 int move = 0;
kolanery 2:619b02232144 22
kolanery 16:c26d8e007df5 23 void check_battery () {
szh66 27:b980fce784ea 24 // pc.baud(9600);
szh66 27:b980fce784ea 25 // using the serial functions will have an impact on timing.
szh66 27:b980fce784ea 26 // serial.printf("voltage value is: %3.3f%%\r\n", battery.read()*100.0f);
szh66 27:b980fce784ea 27 // serial.printf("normalized: 0x%04X \r\n", battery.read_u16());
kolanery 15:151e59899221 28 if (battery.read() < 0.70f){
szh66 27:b980fce784ea 29 // flash led
kolanery 4:73510c7fa316 30 led_1 = 1;
kolanery 4:73510c7fa316 31 led_2 = 1;
kolanery 4:73510c7fa316 32 led_3 = 1;
kolanery 4:73510c7fa316 33 led_4 = 1;
kolanery 15:151e59899221 34 }
kolanery 0:cb667de3a336 35 }
kolanery 0:cb667de3a336 36
kolanery 16:c26d8e007df5 37 void flash_led (int _led_1, int _led_2, int _led_3, int _led_4) {
kolanery 16:c26d8e007df5 38 led_1 = _led_1;
kolanery 16:c26d8e007df5 39 led_2 = _led_2;
kolanery 16:c26d8e007df5 40 led_3 = _led_3;
kolanery 16:c26d8e007df5 41 led_4 = _led_4;
kolanery 16:c26d8e007df5 42 }
kolanery 16:c26d8e007df5 43
kolanery 30:daf286ac049f 44 //void print_debug_message(){
kolanery 30:daf286ac049f 45 // serial.printf("Next mouse position <%u,%u> \r\n", my_mouse->mouse_x, my_mouse->mouse_y);
kolanery 30:daf286ac049f 46 // serial.printf("next state: %u \r\n", state);
kolanery 30:daf286ac049f 47 // serial.printf("previous mouse direction <%d> \r\n", my_mouse->get_prev_direction());
kolanery 30:daf286ac049f 48 // serial.printf("next cell direction <%d> \r\n", my_mouse->get_next_cell_direction());
kolanery 30:daf286ac049f 49 // move++;
kolanery 30:daf286ac049f 50 //}
kolanery 29:2224bc8bb49d 51
kolanery 29:2224bc8bb49d 52 void run_flood_fill_algorithm() {
kolanery 30:daf286ac049f 53 DriveControl * driver = new DriveControl (START_POS, END_POS);
kolanery 30:daf286ac049f 54 Mouse * my_mouse = new Mouse(driver);
kolanery 14:a646667ac9ea 55 driver->resetEncoders();
szh66 27:b980fce784ea 56 int count = 0;
kolanery 14:a646667ac9ea 57 bool finished_traverse_one_cell = true;
kolanery 30:daf286ac049f 58 wait(1);
kolanery 30:daf286ac049f 59 int count_move = 0;
szh66 27:b980fce784ea 60
szh66 27:b980fce784ea 61 while(CONTROL) {
szh66 27:b980fce784ea 62 check_battery();
szh66 27:b980fce784ea 63 wait_ms(1);
kolanery 30:daf286ac049f 64 // if(driver->right_wall_pid_debug()) {
kolanery 30:daf286ac049f 65 // flash_led(0,1,1,0);
kolanery 29:2224bc8bb49d 66 // }
kolanery 30:daf286ac049f 67 // if (my_mouse -> center_found()){
kolanery 30:daf286ac049f 68 // flash_led(1,1,1,1);
kolanery 30:daf286ac049f 69 // //wait(2);
kolanery 30:daf286ac049f 70 // //my_mouse = new Mouse(driver);
kolanery 30:daf286ac049f 71 // }
kolanery 26:191ec0e78774 72 if (finished_traverse_one_cell == true) {
kolanery 30:daf286ac049f 73 count_move++;
kolanery 30:daf286ac049f 74 // if (count_move > 18 && my_mouse->can_reset_mouse) {
kolanery 30:daf286ac049f 75 // my_mouse->clear_stack();
kolanery 30:daf286ac049f 76 // delete my_mouse;
kolanery 30:daf286ac049f 77 // count_move = 0;
kolanery 30:daf286ac049f 78 // flash_led(0,1,1,1);
kolanery 30:daf286ac049f 79 // wait(2);
kolanery 30:daf286ac049f 80 // run_flood_fill_algorithm();
kolanery 30:daf286ac049f 81 // }
kolanery 30:daf286ac049f 82 if (count_move > 40) {
kolanery 30:daf286ac049f 83 my_mouse->clear_stack();
kolanery 30:daf286ac049f 84 delete my_mouse;
kolanery 30:daf286ac049f 85 count_move = 0;
kolanery 30:daf286ac049f 86 flash_led(0,1,1,1);
kolanery 30:daf286ac049f 87 wait(2);
kolanery 30:daf286ac049f 88 }
kolanery 26:191ec0e78774 89 state = my_mouse->solve_maze();
kolanery 29:2224bc8bb49d 90 wait(0.5);
kolanery 26:191ec0e78774 91 if(state == RIGHT){
szh66 27:b980fce784ea 92 flash_led(0,0,1,1);
kolanery 26:191ec0e78774 93 wait(0.25);
kolanery 26:191ec0e78774 94 driver->resetEncoders();
kolanery 26:191ec0e78774 95 }
kolanery 26:191ec0e78774 96 else if(state == LEFT){
szh66 27:b980fce784ea 97 flash_led(1,1,0,0);
kolanery 26:191ec0e78774 98 wait(0.25);
kolanery 26:191ec0e78774 99 driver->resetEncoders();
kolanery 26:191ec0e78774 100 }
kolanery 26:191ec0e78774 101 else if(state == UTURN){
kolanery 26:191ec0e78774 102 flash_led(1,1,1,0);
kolanery 26:191ec0e78774 103 wait(0.25);
kolanery 26:191ec0e78774 104 driver->resetEncoders();
kolanery 26:191ec0e78774 105 count = 0;
szh66 27:b980fce784ea 106 }else{
szh66 27:b980fce784ea 107 state = STRAIGHT;
szh66 27:b980fce784ea 108 flash_led(1, 0, 0, 0);
kolanery 26:191ec0e78774 109 }
szh66 27:b980fce784ea 110
kolanery 26:191ec0e78774 111 finished_traverse_one_cell = false;
kolanery 26:191ec0e78774 112 }
szh66 27:b980fce784ea 113
kolanery 26:191ec0e78774 114 if (state == STRAIGHT) {
kolanery 26:191ec0e78774 115 if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
kolanery 26:191ec0e78774 116 driver->drive_forward();
szh66 27:b980fce784ea 117
kolanery 26:191ec0e78774 118 }
kolanery 26:191ec0e78774 119 else {
kolanery 26:191ec0e78774 120 driver->stop();
kolanery 28:600932142201 121 wait(0.25);
kolanery 26:191ec0e78774 122 driver->resetEncoders();
kolanery 26:191ec0e78774 123 finished_traverse_one_cell = true;
kolanery 26:191ec0e78774 124 continue;
kolanery 26:191ec0e78774 125 }
kolanery 26:191ec0e78774 126 }
kolanery 26:191ec0e78774 127 if (state == RIGHT) {
kolanery 26:191ec0e78774 128 if (!driver->should_finish_turn_right()) {
kolanery 26:191ec0e78774 129 driver->turn_right();
kolanery 26:191ec0e78774 130 }
kolanery 26:191ec0e78774 131 else {
kolanery 26:191ec0e78774 132 driver->stop();
kolanery 26:191ec0e78774 133 state = STRAIGHT;
kolanery 28:600932142201 134 wait(0.25);
kolanery 26:191ec0e78774 135 driver->resetEncoders();
kolanery 26:191ec0e78774 136 driver->clear_pid();
kolanery 26:191ec0e78774 137 continue;
kolanery 26:191ec0e78774 138 }
kolanery 26:191ec0e78774 139 }
kolanery 26:191ec0e78774 140 if (state == LEFT) {
kolanery 26:191ec0e78774 141 if (!driver->should_finish_turn_left()) {
kolanery 26:191ec0e78774 142 driver->turn_left();
kolanery 26:191ec0e78774 143 }
kolanery 26:191ec0e78774 144 else {
kolanery 26:191ec0e78774 145 driver->stop();
kolanery 26:191ec0e78774 146 state = STRAIGHT;
kolanery 28:600932142201 147 wait(0.25);
kolanery 26:191ec0e78774 148 driver->resetEncoders();
kolanery 26:191ec0e78774 149 driver->clear_pid();
kolanery 26:191ec0e78774 150 continue;
kolanery 26:191ec0e78774 151 }
kolanery 26:191ec0e78774 152 }
kolanery 26:191ec0e78774 153
kolanery 26:191ec0e78774 154 if (state == UTURN){
kolanery 26:191ec0e78774 155 if (!driver->should_finish_turn_left()) {
kolanery 26:191ec0e78774 156 driver->turn_left();
kolanery 26:191ec0e78774 157 }
kolanery 26:191ec0e78774 158 else {
kolanery 26:191ec0e78774 159 driver->stop();
kolanery 26:191ec0e78774 160 driver->resetEncoders();
szh66 27:b980fce784ea 161 wait(0.25);
szh66 27:b980fce784ea 162 if(count == 1) {
szh66 27:b980fce784ea 163 state = STRAIGHT;
ryan_whr 22:1a02d66218e4 164 }
szh66 27:b980fce784ea 165 count ++;//
kolanery 16:c26d8e007df5 166 continue;
kolanery 16:c26d8e007df5 167 }
kolanery 20:b18eed69ee32 168 }
kolanery 16:c26d8e007df5 169 }
kolanery 29:2224bc8bb49d 170 }
kolanery 29:2224bc8bb49d 171
kolanery 29:2224bc8bb49d 172 void run_heuristic_wall_follower_algorithm() {
kolanery 29:2224bc8bb49d 173 DriveControl * driver = new DriveControl (START_POS, END_POS);
kolanery 30:daf286ac049f 174 driver->set_wall_follower_speed();
kolanery 29:2224bc8bb49d 175 driver->resetEncoders();
kolanery 29:2224bc8bb49d 176 int state, count = 0;
kolanery 30:daf286ac049f 177 int heuristic = 0;
kolanery 29:2224bc8bb49d 178 bool finished_traverse_one_cell = true;
kolanery 30:daf286ac049f 179 wait(1);
kolanery 29:2224bc8bb49d 180 while(CONTROL) {
kolanery 29:2224bc8bb49d 181 check_battery();
kolanery 29:2224bc8bb49d 182 wait_ms(1);
kolanery 29:2224bc8bb49d 183 if (finished_traverse_one_cell == true) {
kolanery 30:daf286ac049f 184 heuristic ++;
kolanery 30:daf286ac049f 185 if (heuristic % 10 == 0) {
kolanery 30:daf286ac049f 186 if (!driver->has_front_wall()){
kolanery 30:daf286ac049f 187 wait(0.25);
kolanery 30:daf286ac049f 188 state = STRAIGHT;
kolanery 30:daf286ac049f 189 driver->resetEncoders();
kolanery 30:daf286ac049f 190 }
kolanery 30:daf286ac049f 191 }
kolanery 29:2224bc8bb49d 192 if (!driver->has_right_wall() && !driver->has_left_wall()) {
kolanery 29:2224bc8bb49d 193 if ((rand() % 3) == 1) {
kolanery 29:2224bc8bb49d 194 state = LEFT;
kolanery 29:2224bc8bb49d 195 driver->resetEncoders();
kolanery 29:2224bc8bb49d 196 }
kolanery 29:2224bc8bb49d 197 else {
kolanery 29:2224bc8bb49d 198 state = RIGHT;
kolanery 29:2224bc8bb49d 199 driver->resetEncoders();
kolanery 30:daf286ac049f 200 }
kolanery 30:daf286ac049f 201 wait(0.25);
kolanery 29:2224bc8bb49d 202 }
kolanery 29:2224bc8bb49d 203 else if (!driver->has_right_wall()) {
kolanery 29:2224bc8bb49d 204 wait(0.25);
kolanery 29:2224bc8bb49d 205 state = RIGHT;
kolanery 29:2224bc8bb49d 206 driver->resetEncoders();
kolanery 29:2224bc8bb49d 207 }
kolanery 29:2224bc8bb49d 208 else if (!driver->has_left_wall()) {
kolanery 29:2224bc8bb49d 209 wait(0.25);
kolanery 29:2224bc8bb49d 210 state = LEFT;
kolanery 29:2224bc8bb49d 211 driver->resetEncoders();
kolanery 29:2224bc8bb49d 212 }
kolanery 29:2224bc8bb49d 213 else if(!driver->has_front_wall()){
kolanery 29:2224bc8bb49d 214 state = STRAIGHT;
kolanery 29:2224bc8bb49d 215 driver->resetEncoders();
kolanery 29:2224bc8bb49d 216 }
kolanery 29:2224bc8bb49d 217 else{
kolanery 29:2224bc8bb49d 218 wait(0.25);
kolanery 29:2224bc8bb49d 219 state = UTURN;
kolanery 29:2224bc8bb49d 220 driver->resetEncoders();
kolanery 29:2224bc8bb49d 221 count = 0;
kolanery 29:2224bc8bb49d 222 }
kolanery 29:2224bc8bb49d 223 finished_traverse_one_cell = false;
kolanery 29:2224bc8bb49d 224 }
kolanery 29:2224bc8bb49d 225
kolanery 29:2224bc8bb49d 226 if (state == STRAIGHT) {
kolanery 29:2224bc8bb49d 227 if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
kolanery 29:2224bc8bb49d 228 driver->drive_forward();
kolanery 29:2224bc8bb49d 229 flash_led(1, 0, 0, 0);
kolanery 29:2224bc8bb49d 230 }
kolanery 29:2224bc8bb49d 231 else {
kolanery 29:2224bc8bb49d 232 driver->stop();
kolanery 29:2224bc8bb49d 233 driver->resetEncoders();
kolanery 29:2224bc8bb49d 234 flash_led (0, 0, 0, 0);
kolanery 29:2224bc8bb49d 235 finished_traverse_one_cell = true;
kolanery 29:2224bc8bb49d 236 continue;
kolanery 29:2224bc8bb49d 237 }
kolanery 29:2224bc8bb49d 238 }
kolanery 29:2224bc8bb49d 239 if (state == RIGHT) {
kolanery 29:2224bc8bb49d 240 if (!driver->should_finish_turn_right()) {
kolanery 29:2224bc8bb49d 241 driver->turn_right();
kolanery 29:2224bc8bb49d 242 flash_led (0, 1, 0, 0);
kolanery 29:2224bc8bb49d 243 }
kolanery 29:2224bc8bb49d 244 else {
kolanery 29:2224bc8bb49d 245 driver->stop();
kolanery 29:2224bc8bb49d 246 flash_led (0, 0, 0, 0);
kolanery 29:2224bc8bb49d 247 state = STRAIGHT;
kolanery 29:2224bc8bb49d 248 driver->resetEncoders();
kolanery 29:2224bc8bb49d 249 driver->clear_pid();
kolanery 29:2224bc8bb49d 250 continue;
kolanery 29:2224bc8bb49d 251 }
kolanery 29:2224bc8bb49d 252 }
kolanery 29:2224bc8bb49d 253 if (state == LEFT) {
kolanery 29:2224bc8bb49d 254 if (!driver->should_finish_turn_left()) {
kolanery 29:2224bc8bb49d 255 driver->turn_left();
kolanery 29:2224bc8bb49d 256 flash_led (0, 0, 1, 0);
kolanery 29:2224bc8bb49d 257 }
kolanery 29:2224bc8bb49d 258 else {
kolanery 29:2224bc8bb49d 259 driver->stop();
kolanery 29:2224bc8bb49d 260 flash_led (0, 0, 0, 0);
kolanery 29:2224bc8bb49d 261 state = STRAIGHT;
kolanery 29:2224bc8bb49d 262 driver->resetEncoders();
kolanery 29:2224bc8bb49d 263 driver->clear_pid();
kolanery 29:2224bc8bb49d 264 continue;
kolanery 29:2224bc8bb49d 265 }
kolanery 29:2224bc8bb49d 266 }
kolanery 29:2224bc8bb49d 267
kolanery 29:2224bc8bb49d 268 if (state == UTURN){
kolanery 29:2224bc8bb49d 269 if (!driver->should_finish_turn_left()) {
kolanery 29:2224bc8bb49d 270 driver->turn_left();
kolanery 29:2224bc8bb49d 271 flash_led (0, 1, 1, 0);
kolanery 29:2224bc8bb49d 272 }
kolanery 29:2224bc8bb49d 273 else {
kolanery 29:2224bc8bb49d 274 driver->stop();
kolanery 29:2224bc8bb49d 275 driver->resetEncoders();
kolanery 29:2224bc8bb49d 276 flash_led (0, 0, 0, 0);
kolanery 29:2224bc8bb49d 277 if (count == 1) {
kolanery 29:2224bc8bb49d 278 finished_traverse_one_cell = true;
kolanery 29:2224bc8bb49d 279 }
kolanery 29:2224bc8bb49d 280 else {
kolanery 29:2224bc8bb49d 281 state = LEFT;
kolanery 29:2224bc8bb49d 282 wait(0.25);
kolanery 29:2224bc8bb49d 283 count++;
kolanery 29:2224bc8bb49d 284 }
kolanery 29:2224bc8bb49d 285 continue;
kolanery 29:2224bc8bb49d 286 }
kolanery 29:2224bc8bb49d 287 }
kolanery 29:2224bc8bb49d 288 }
kolanery 29:2224bc8bb49d 289 }
kolanery 29:2224bc8bb49d 290
kolanery 29:2224bc8bb49d 291 int main() {
kolanery 29:2224bc8bb49d 292 if (alg_pin) {
kolanery 29:2224bc8bb49d 293 flash_led(1,0,1,0);
kolanery 29:2224bc8bb49d 294 wait(2);
kolanery 29:2224bc8bb49d 295 run_flood_fill_algorithm();
kolanery 29:2224bc8bb49d 296 }
kolanery 29:2224bc8bb49d 297 else {
kolanery 29:2224bc8bb49d 298 flash_led(1,1,1,0);
kolanery 29:2224bc8bb49d 299 wait(2);
kolanery 29:2224bc8bb49d 300 run_heuristic_wall_follower_algorithm();
kolanery 29:2224bc8bb49d 301 }
kolanery 26:191ec0e78774 302 }