TomYumBoys / Mbed 2 deprecated MM2017

Dependencies:   mbed

Committer:
ryan_whr
Date:
Tue May 16 20:34:34 2017 +0000
Revision:
11:61c9b9bb9294
Parent:
10:e69cb200dc15
add reset_pid and reset_encoder

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
ryan_whr 10:e69cb200dc15 35 float turn_degree = 0.0f;
ryan_whr 10:e69cb200dc15 36
kolanery 7:7215adbae3da 37 namespace pid_controller {
kolanery 7:7215adbae3da 38 void navigate() {
kolanery 7:7215adbae3da 39 bool has_left_wall = leftDiagonalIR.readIR() > LEFT_WALL_THRES;
kolanery 7:7215adbae3da 40 bool has_right_wall = rightDiagonalIR.readIR() > RIGHT_WALL_THRES;
kolanery 7:7215adbae3da 41
kolanery 7:7215adbae3da 42 if (has_left_wall && has_right_wall) {
kolanery 7:7215adbae3da 43 if (rightDiagonalIR - RIGHT_WALL_THRES < 0) {
kolanery 7:7215adbae3da 44 error_p = rightDiagonalIR - RIGHT_WALL_THRES;
kolanery 7:7215adbae3da 45 }
kolanery 7:7215adbae3da 46 else if (leftDiagonalIR - LEFT_WALL_THRES < 0) {
kolanery 7:7215adbae3da 47 error_p = leftDiagonalIR - LEFT_WALL_THRES;
kolanery 7:7215adbae3da 48 }
kolanery 7:7215adbae3da 49 else{
kolanery 7:7215adbae3da 50 error_p = rightDiagonalIR - leftDiagonalIR;
kolanery 7:7215adbae3da 51 }
kolanery 7:7215adbae3da 52 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 53 }
kolanery 7:7215adbae3da 54 else if (has_left_wall) {
kolanery 7:7215adbae3da 55 error_p = 2 * (LEFT_WALL_THRES - leftDiagonalIR.readIR());
kolanery 7:7215adbae3da 56 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 57 }
kolanery 7:7215adbae3da 58 else if (has_right_wall) {
kolanery 7:7215adbae3da 59 error_p = 2 * (rightDiagonalIR.readIR() - RIGHT_WALL_THRES);
kolanery 7:7215adbae3da 60 error_d = error_p - old_error_p;
kolanery 7:7215adbae3da 61 }
kolanery 7:7215adbae3da 62 else if (!has_left_wall && !has_right_wall) {
kolanery 7:7215adbae3da 63 error_p = 0;
kolanery 7:7215adbae3da 64 error_d = 0;
kolanery 7:7215adbae3da 65 }
kolanery 7:7215adbae3da 66 total_error = P * error_p + D * (error_d - old_error_d);
kolanery 7:7215adbae3da 67 old_error_p = error_p;
kolanery 7:7215adbae3da 68 old_error_d = error_d;
kolanery 7:7215adbae3da 69
kolanery 7:7215adbae3da 70
kolanery 7:7215adbae3da 71 if(total_error < 7.5f){
kolanery 7:7215adbae3da 72 leftMotor -> speed(MOTOR_BASE_SPEED - total_error);
kolanery 7:7215adbae3da 73 rightMotor -> speed(MOTOR_BASE_SPEED + total_error);
kolanery 7:7215adbae3da 74 }
kolanery 7:7215adbae3da 75 else{
kolanery 7:7215adbae3da 76 leftMotor->speed(MOTOR_BASE_SPEED);
kolanery 7:7215adbae3da 77 rightMotor->speed(MOTOR_BASE_SPEED);
kolanery 7:7215adbae3da 78 }
kolanery 7:7215adbae3da 79 }
kolanery 7:7215adbae3da 80
kolanery 7:7215adbae3da 81 // todo
kolanery 7:7215adbae3da 82 void turn (int dir) {
kolanery 7:7215adbae3da 83 // https://github.com/austinxiao-ucsd/Falcon-MicroMouse/blob/master/Micromouse_test/drive_control.h
ryan_whr 10:e69cb200dc15 84 if (dir == TURN_LEFT) {
ryan_whr 10:e69cb200dc15 85 turn_degree = -90.0;
kolanery 7:7215adbae3da 86 }
ryan_whr 10:e69cb200dc15 87 else if (dir == TURN_RIGHT){
ryan_whr 10:e69cb200dc15 88 turn_degree = 90.0;
ryan_whr 10:e69cb200dc15 89 }
ryan_whr 10:e69cb200dc15 90 else{
ryan_whr 10:e69cb200dc15 91 turn_degree = 180.0;
kolanery 7:7215adbae3da 92 }
kolanery 7:7215adbae3da 93 }
ryan_whr 11:61c9b9bb9294 94
ryan_whr 11:61c9b9bb9294 95 void reset_encoders() {
ryan_whr 11:61c9b9bb9294 96
ryan_whr 11:61c9b9bb9294 97 }
ryan_whr 11:61c9b9bb9294 98
ryan_whr 11:61c9b9bb9294 99 void reset_pid_constants() {
ryan_whr 11:61c9b9bb9294 100
ryan_whr 11:61c9b9bb9294 101 }
kolanery 7:7215adbae3da 102 }
kolanery 7:7215adbae3da 103
kolanery 0:cb667de3a336 104 // Currently only have the x, y position fields for
kolanery 0:cb667de3a336 105 // each cell.
kolanery 0:cb667de3a336 106 DriveControl::DriveControl (int start_x, int start_y) {
kolanery 0:cb667de3a336 107 curr_cell = new Cell (start_x, start_y);
kolanery 2:619b02232144 108 leftMotor= new LeftMotor();
kolanery 2:619b02232144 109 rightMotor = new RightMotor();
kolanery 0:cb667de3a336 110 }
kolanery 0:cb667de3a336 111
kolanery 0:cb667de3a336 112 // Defines the next cell to traverse.
kolanery 0:cb667de3a336 113 Cell * next_cell() {
kolanery 0:cb667de3a336 114 return curr_cell;
kolanery 0:cb667de3a336 115 }
kolanery 0:cb667de3a336 116
kolanery 0:cb667de3a336 117 void DriveControl::turn_left() {
kolanery 0:cb667de3a336 118 // TODO: Add PID Control
kolanery 7:7215adbae3da 119 pid_controller::turn(TURN_LEFT);
kolanery 0:cb667de3a336 120 }
kolanery 0:cb667de3a336 121
kolanery 0:cb667de3a336 122 int DriveControl::get_next_direction() {
kolanery 0:cb667de3a336 123 // TODO: Define the direction based on heuristic eval.
kolanery 0:cb667de3a336 124 return 1;
kolanery 0:cb667de3a336 125 }
kolanery 0:cb667de3a336 126
kolanery 0:cb667de3a336 127 int DriveControl::get_next_state(int state) {
kolanery 2:619b02232144 128 // Simply drives the mouse for testing
kolanery 2:619b02232144 129 return DRIVE;
kolanery 0:cb667de3a336 130 }
kolanery 0:cb667de3a336 131
kolanery 0:cb667de3a336 132 void DriveControl::turn_right() {
kolanery 4:73510c7fa316 133 // TODO: Add PID Control
kolanery 7:7215adbae3da 134 pid_controller::turn(TURN_RIGHT);
kolanery 7:7215adbae3da 135 }
kolanery 7:7215adbae3da 136
kolanery 7:7215adbae3da 137 void DriveControl::turn_around() {
kolanery 7:7215adbae3da 138 // TODO: Add PID Control
kolanery 7:7215adbae3da 139 pid_controller::turn(TURN_AROUND);
kolanery 0:cb667de3a336 140 }
kolanery 0:cb667de3a336 141
kolanery 0:cb667de3a336 142 void DriveControl::stop() {
kolanery 2:619b02232144 143 leftMotor->stop();
kolanery 2:619b02232144 144 rightMotor->stop();
kolanery 0:cb667de3a336 145 }
kolanery 0:cb667de3a336 146
kolanery 7:7215adbae3da 147 void DriveControl::drive_forward() {
kolanery 7:7215adbae3da 148 pid_controller::navigate();
kolanery 4:73510c7fa316 149 }
kolanery 4:73510c7fa316 150
kolanery 0:cb667de3a336 151
kolanery 7:7215adbae3da 152 // TODO: Test top right ir sensor
kolanery 0:cb667de3a336 153 bool DriveControl::has_front_wall() {
kolanery 7:7215adbae3da 154 return rightFrontIR > FRONT_SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 155 }
kolanery 0:cb667de3a336 156
kolanery 0:cb667de3a336 157 bool DriveControl::has_left_wall() {
kolanery 0:cb667de3a336 158 return leftIR < SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 159 }
kolanery 0:cb667de3a336 160
kolanery 0:cb667de3a336 161 bool DriveControl::has_right_wall() {
kolanery 0:cb667de3a336 162 return rightIR < SENSOR_THRESHOLD;
kolanery 0:cb667de3a336 163 }