TomYumBoys / Mbed 2 deprecated MM2017

Dependencies:   mbed

Committer:
kolanery
Date:
Sun May 14 19:57:34 2017 +0000
Revision:
7:7215adbae3da
Parent:
6:1bcfda49e146
Child:
8:4a32fc9ee939
Child:
10:e69cb200dc15
refactor code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kolanery 0:cb667de3a336 1 #include "drivecontrol.h"
kolanery 0:cb667de3a336 2 #include "Cell.h"
kolanery 0:cb667de3a336 3 #include "ir_sensor.h"
kolanery 2:619b02232144 4 #include "left_motor.h"
kolanery 2:619b02232144 5 #include "right_motor.h"
szh66 6:1bcfda49e146 6 #include "pin_assignment.h"
kolanery 0:cb667de3a336 7
szh66 6:1bcfda49e146 8 IRSensor leftIR(PA_8, PC_5);
szh66 6:1bcfda49e146 9 IRSensor rightIR(PB_0, PA_4);
kolanery 7:7215adbae3da 10
kolanery 0:cb667de3a336 11 // Define states for debugging the mouse hardware
szh66 6:1bcfda49e146 12 const int DRIVE = 0, TURN = 2, STOP = 4;
kolanery 7:7215adbae3da 13 const int TURN_LEFT = 0, TURN_RIGHT = 1, TURN_AROUND = 2;
kolanery 7:7215adbae3da 14
kolanery 2:619b02232144 15 LeftMotor * leftMotor;
kolanery 2:619b02232144 16 RightMotor * rightMotor;
kolanery 0:cb667de3a336 17 Cell * curr_cell;
szh66 6:1bcfda49e146 18 Serial pc(PA_9, PA_10);
szh66 6:1bcfda49e146 19
szh66 6:1bcfda49e146 20 float motor_speed;
kolanery 7:7215adbae3da 21 float MOTOR_BASE_SPEED = 15.0f;
kolanery 7:7215adbae3da 22
kolanery 7:7215adbae3da 23 float FRONT_SENSOR_THRESHOLD = 0.90f;
kolanery 7:7215adbae3da 24 const int SENSOR_THRESHOLD = 12;
szh66 6:1bcfda49e146 25 float LEFT_WALL_THRES = 0.46f, RIGHT_WALL_THRES = 0.21f;
szh66 6:1bcfda49e146 26 float SENSOR_ERROR_OFFSET = 0.0f;
szh66 6:1bcfda49e146 27
kolanery 7:7215adbae3da 28
szh66 6:1bcfda49e146 29 float left_speed;
szh66 6:1bcfda49e146 30 float right_speed;
szh66 6:1bcfda49e146 31 float error_p = 0.0f, old_error_p = 0.0f, old_error_d = 0.0f, error_d = 0.0f;
szh66 6:1bcfda49e146 32 float total_error = 0.0f;
szh66 6:1bcfda49e146 33 float P = 18.0f, D = 3.0f;
kolanery 4:73510c7fa316 34
kolanery 7:7215adbae3da 35 namespace pid_controller {
kolanery 7:7215adbae3da 36 void navigate() {
kolanery 7:7215adbae3da 37 bool has_left_wall = leftDiagonalIR.readIR() > LEFT_WALL_THRES;
kolanery 7:7215adbae3da 38 bool has_right_wall = rightDiagonalIR.readIR() > RIGHT_WALL_THRES;
kolanery 7:7215adbae3da 39
kolanery 7:7215adbae3da 40 if (has_left_wall && has_right_wall) {
kolanery 7:7215adbae3da 41 if (rightDiagonalIR - RIGHT_WALL_THRES < 0) {
kolanery 7:7215adbae3da 42 error_p = rightDiagonalIR - RIGHT_WALL_THRES;
kolanery 7:7215adbae3da 43 }
kolanery 7:7215adbae3da 44 else if (leftDiagonalIR - LEFT_WALL_THRES < 0) {
kolanery 7:7215adbae3da 45 error_p = leftDiagonalIR - LEFT_WALL_THRES;
kolanery 7:7215adbae3da 46 }
kolanery 7:7215adbae3da 47 else{
kolanery 7:7215adbae3da 48 error_p = rightDiagonalIR - leftDiagonalIR;
kolanery 7:7215adbae3da 49 }
kolanery 7:7215adbae3da 50 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 51 }
kolanery 7:7215adbae3da 52 else if (has_left_wall) {
kolanery 7:7215adbae3da 53 error_p = 2 * (LEFT_WALL_THRES - leftDiagonalIR.readIR());
kolanery 7:7215adbae3da 54 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 55 }
kolanery 7:7215adbae3da 56 else if (has_right_wall) {
kolanery 7:7215adbae3da 57 error_p = 2 * (rightDiagonalIR.readIR() - RIGHT_WALL_THRES);
kolanery 7:7215adbae3da 58 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 59 }
kolanery 7:7215adbae3da 60 else if (!has_left_wall && !has_right_wall) {
kolanery 7:7215adbae3da 61 error_p = 0;
kolanery 7:7215adbae3da 62 error_d = 0;
kolanery 7:7215adbae3da 63 }
kolanery 7:7215adbae3da 64 total_error = P * error_p + D * (error_d - old_error_d);
kolanery 7:7215adbae3da 65 old_error_p = error_p;
kolanery 7:7215adbae3da 66 old_error_d = error_d;
kolanery 7:7215adbae3da 67
kolanery 7:7215adbae3da 68
kolanery 7:7215adbae3da 69 if(total_error < 7.5f){
kolanery 7:7215adbae3da 70 leftMotor -> speed(MOTOR_BASE_SPEED - total_error);
kolanery 7:7215adbae3da 71 rightMotor -> speed(MOTOR_BASE_SPEED + total_error);
kolanery 7:7215adbae3da 72 }
kolanery 7:7215adbae3da 73 else{
kolanery 7:7215adbae3da 74 leftMotor->speed(MOTOR_BASE_SPEED);
kolanery 7:7215adbae3da 75 rightMotor->speed(MOTOR_BASE_SPEED);
kolanery 7:7215adbae3da 76 }
kolanery 7:7215adbae3da 77 }
kolanery 7:7215adbae3da 78
kolanery 7:7215adbae3da 79 // todo
kolanery 7:7215adbae3da 80 void turn (int dir) {
kolanery 7:7215adbae3da 81 // https://github.com/austinxiao-ucsd/Falcon-MicroMouse/blob/master/Micromouse_test/drive_control.h
kolanery 7:7215adbae3da 82 if (TURN_LEFT) { // Flip motor
kolanery 7:7215adbae3da 83 }
kolanery 7:7215adbae3da 84 else { // TODO: ...
kolanery 7:7215adbae3da 85 }
kolanery 7:7215adbae3da 86 }
kolanery 7:7215adbae3da 87 }
kolanery 7:7215adbae3da 88
kolanery 0:cb667de3a336 89 // Currently only have the x, y position fields for
kolanery 0:cb667de3a336 90 // each cell.
kolanery 0:cb667de3a336 91 DriveControl::DriveControl (int start_x, int start_y) {
kolanery 0:cb667de3a336 92 curr_cell = new Cell (start_x, start_y);
kolanery 2:619b02232144 93 leftMotor= new LeftMotor();
kolanery 2:619b02232144 94 rightMotor = new RightMotor();
kolanery 0:cb667de3a336 95 }
kolanery 0:cb667de3a336 96
kolanery 0:cb667de3a336 97 // Defines the next cell to traverse.
kolanery 0:cb667de3a336 98 Cell * next_cell() {
kolanery 0:cb667de3a336 99 return curr_cell;
kolanery 0:cb667de3a336 100 }
kolanery 0:cb667de3a336 101
kolanery 0:cb667de3a336 102 void DriveControl::turn_left() {
kolanery 0:cb667de3a336 103 // TODO: Add PID Control
kolanery 7:7215adbae3da 104 pid_controller::turn(TURN_LEFT);
kolanery 0:cb667de3a336 105 }
kolanery 0:cb667de3a336 106
kolanery 0:cb667de3a336 107 int DriveControl::get_next_direction() {
kolanery 0:cb667de3a336 108 // TODO: Define the direction based on heuristic eval.
kolanery 0:cb667de3a336 109 return 1;
kolanery 0:cb667de3a336 110 }
kolanery 0:cb667de3a336 111
kolanery 0:cb667de3a336 112 int DriveControl::get_next_state(int state) {
kolanery 2:619b02232144 113 // Simply drives the mouse for testing
kolanery 2:619b02232144 114 return DRIVE;
kolanery 0:cb667de3a336 115 }
kolanery 0:cb667de3a336 116
kolanery 0:cb667de3a336 117 void DriveControl::turn_right() {
kolanery 4:73510c7fa316 118 // TODO: Add PID Control
kolanery 7:7215adbae3da 119 pid_controller::turn(TURN_RIGHT);
kolanery 7:7215adbae3da 120 }
kolanery 7:7215adbae3da 121
kolanery 7:7215adbae3da 122 void DriveControl::turn_around() {
kolanery 7:7215adbae3da 123 // TODO: Add PID Control
kolanery 7:7215adbae3da 124 pid_controller::turn(TURN_AROUND);
kolanery 0:cb667de3a336 125 }
kolanery 0:cb667de3a336 126
kolanery 0:cb667de3a336 127 void DriveControl::stop() {
kolanery 2:619b02232144 128 leftMotor->stop();
kolanery 2:619b02232144 129 rightMotor->stop();
kolanery 0:cb667de3a336 130 }
kolanery 0:cb667de3a336 131
kolanery 7:7215adbae3da 132 void DriveControl::drive_forward() {
kolanery 7:7215adbae3da 133 pid_controller::navigate();
kolanery 4:73510c7fa316 134 }
kolanery 4:73510c7fa316 135
kolanery 0:cb667de3a336 136
kolanery 7:7215adbae3da 137 // TODO: Test top right ir sensor
kolanery 0:cb667de3a336 138 bool DriveControl::has_front_wall() {
kolanery 7:7215adbae3da 139 return rightFrontIR > FRONT_SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 140 }
kolanery 0:cb667de3a336 141
kolanery 0:cb667de3a336 142 bool DriveControl::has_left_wall() {
kolanery 0:cb667de3a336 143 return leftIR < SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 144 }
kolanery 0:cb667de3a336 145
kolanery 0:cb667de3a336 146 bool DriveControl::has_right_wall() {
kolanery 0:cb667de3a336 147 return rightIR < SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 148 }