Alpha Tango / Mbed 2 deprecated R5_Robotics

Dependencies:   mbed

Committer:
alpha_tango
Date:
Sat Mar 31 19:42:16 2018 +0000
Revision:
7:1640572360de
Parent:
6:3e133819d792
Child:
8:a6080c27f8c5
First for loop within main

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alpha_tango 0:7e54f0e2be67 1 #include "mbed.h"
alpha_tango 0:7e54f0e2be67 2
alpha_tango 4:9b1c6b9dae1c 3
alpha_tango 4:9b1c6b9dae1c 4 // PIN DECLARATIONS
alpha_tango 0:7e54f0e2be67 5 DigitalOut FLdirection(PTB18);
alpha_tango 0:7e54f0e2be67 6 DigitalOut FRdirection(PTA4);
alpha_tango 0:7e54f0e2be67 7 DigitalOut magDirection(PTB19);
alpha_tango 0:7e54f0e2be67 8 PwmOut stepFL(PTD3);
alpha_tango 0:7e54f0e2be67 9 PwmOut stepFR(PTA5);
alpha_tango 0:7e54f0e2be67 10 PwmOut magArm(PTA12);
alpha_tango 0:7e54f0e2be67 11 InterruptIn killAll(PTC3);
alpha_tango 1:4ab886b72870 12 DigitalIn Start(PTC12);
alpha_tango 0:7e54f0e2be67 13 DigitalOut enableH(PTC11);
alpha_tango 0:7e54f0e2be67 14 DigitalOut highH(PTC10);
alpha_tango 4:9b1c6b9dae1c 15 DigitalOut enableL(PTC11);
alpha_tango 4:9b1c6b9dae1c 16 DigitalOut highL(PTC7);
alpha_tango 4:9b1c6b9dae1c 17 I2C i2c(PTC9, PTC8); //pins for I2C communication (SDA, SCL)
alpha_tango 4:9b1c6b9dae1c 18 Serial pc(USBTX, USBRX);
alpha_tango 4:9b1c6b9dae1c 19 DigitalOut LED(PTC4);
alpha_tango 4:9b1c6b9dae1c 20 DigitalOut green(LED_GREEN);
alpha_tango 0:7e54f0e2be67 21
alpha_tango 4:9b1c6b9dae1c 22
alpha_tango 4:9b1c6b9dae1c 23 // PROTOTYPE FUNCTION DECLARATIONS
alpha_tango 4:9b1c6b9dae1c 24 void move(float dist, bool direction);
alpha_tango 4:9b1c6b9dae1c 25 void grabToken();//Picks up the token for reading
alpha_tango 4:9b1c6b9dae1c 26 void dropToken();//Drops the token off
alpha_tango 4:9b1c6b9dae1c 27 void kill();
alpha_tango 4:9b1c6b9dae1c 28 void turnRight(float, bool);
alpha_tango 4:9b1c6b9dae1c 29 void turnLeft(float, bool);
alpha_tango 4:9b1c6b9dae1c 30 void rot180(); //Turns the robot around
alpha_tango 5:17a8d8395a50 31 int findColor(); //Figures out what color the disk is and makes a decision on where to take the disk
alpha_tango 4:9b1c6b9dae1c 32
alpha_tango 4:9b1c6b9dae1c 33 // GLOBAL VARIABLES
alpha_tango 4:9b1c6b9dae1c 34 const int FORWARD = 0;
alpha_tango 4:9b1c6b9dae1c 35 const int BACKWARD = 1;
alpha_tango 4:9b1c6b9dae1c 36 const float stepSize = 0.001212; //in meters
alpha_tango 4:9b1c6b9dae1c 37 const float FREQUENCY = 500; //steps per second
alpha_tango 4:9b1c6b9dae1c 38 int sensor_addr = 41 << 1;
alpha_tango 7:1640572360de 39 float leg;
alpha_tango 7:1640572360de 40 int color;
alpha_tango 4:9b1c6b9dae1c 41
alpha_tango 4:9b1c6b9dae1c 42
alpha_tango 4:9b1c6b9dae1c 43 // NOTES
alpha_tango 0:7e54f0e2be67 44 /*
alpha_tango 0:7e54f0e2be67 45 -36 prewriten functions for the drop off decision
alpha_tango 0:7e54f0e2be67 46 -Possibly use another RGB sensor as a line follower
alpha_tango 0:7e54f0e2be67 47 -Decides function based on color
alpha_tango 0:7e54f0e2be67 48 -findPath
alpha_tango 0:7e54f0e2be67 49 -starting at bottomLeft
alpha_tango 0:7e54f0e2be67 50 -travel up one leg
alpha_tango 0:7e54f0e2be67 51 -turn right if rgb
alpha_tango 0:7e54f0e2be67 52 -turn left if cmy
alpha_tango 0:7e54f0e2be67 53 -turn right, left, or stay based on color choice
alpha_tango 4:9b1c6b9dae1c 54
alpha_tango 0:7e54f0e2be67 55 void findPath(); //Figures out the path to take to take the disk to its drop off position
alpha_tango 0:7e54f0e2be67 56 void returnHome(); //Returns to the home white square
alpha_tango 0:7e54f0e2be67 57 void returnPrevPos(); //Does the opposite of findPath() to return to the previous position
alpha_tango 0:7e54f0e2be67 58
alpha_tango 0:7e54f0e2be67 59 //Variables
alpha_tango 4:9b1c6b9dae1c 60
alpha_tango 0:7e54f0e2be67 61 -boxSizes, 2x2, 3x3, 4x4, etc
alpha_tango 0:7e54f0e2be67 62 -legSize, 1 foot, 1.5 feet, 2 feet, etc.
alpha_tango 0:7e54f0e2be67 63 -direction choices for findPath
alpha_tango 0:7e54f0e2be67 64 */
alpha_tango 0:7e54f0e2be67 65
alpha_tango 0:7e54f0e2be67 66
alpha_tango 0:7e54f0e2be67 67 int main()
alpha_tango 0:7e54f0e2be67 68 {
alpha_tango 0:7e54f0e2be67 69 //Start a timer
alpha_tango 0:7e54f0e2be67 70 //Will need to be a variable timer based on round number
alpha_tango 0:7e54f0e2be67 71
alpha_tango 5:17a8d8395a50 72 float radDistance = 0.5;
alpha_tango 5:17a8d8395a50 73 float posDistance = 0.5;
alpha_tango 5:17a8d8395a50 74 float armDistance = 0.5;
alpha_tango 5:17a8d8395a50 75
alpha_tango 0:7e54f0e2be67 76
alpha_tango 0:7e54f0e2be67 77 enableH = 0; //Making sure the H-Bridge starts low and off
alpha_tango 4:9b1c6b9dae1c 78 highH = 0; //This starts high for the H-Bridge
alpha_tango 4:9b1c6b9dae1c 79 highL = 1; //This starts low for the H-Bridge
alpha_tango 4:9b1c6b9dae1c 80 while(true) //The start button
alpha_tango 1:4ab886b72870 81 {
alpha_tango 1:4ab886b72870 82 if (Start == 0)
alpha_tango 1:4ab886b72870 83 break;
alpha_tango 1:4ab886b72870 84 }
alpha_tango 4:9b1c6b9dae1c 85
alpha_tango 4:9b1c6b9dae1c 86 killAll.rise(&kill); //The kill interupt
alpha_tango 5:17a8d8395a50 87
alpha_tango 4:9b1c6b9dae1c 88
alpha_tango 5:17a8d8395a50 89 // RGB Sensor Settings
alpha_tango 4:9b1c6b9dae1c 90 pc.baud(115200);
alpha_tango 5:17a8d8395a50 91 green = 1; // off
alpha_tango 7:1640572360de 92 i2c.frequency(200000);
alpha_tango 7:1640572360de 93 char id_regval[1] = {146};
alpha_tango 7:1640572360de 94 char data[1] = {0};
alpha_tango 7:1640572360de 95 i2c.write(sensor_addr,id_regval,1, true);
alpha_tango 7:1640572360de 96 i2c.read(sensor_addr,data,1,false);
alpha_tango 7:1640572360de 97 if (data[0]==68)
alpha_tango 7:1640572360de 98 {
alpha_tango 4:9b1c6b9dae1c 99 green = 0;
alpha_tango 4:9b1c6b9dae1c 100 wait (2);
alpha_tango 4:9b1c6b9dae1c 101 green = 1;
alpha_tango 4:9b1c6b9dae1c 102 } else {
alpha_tango 4:9b1c6b9dae1c 103 green = 1;
alpha_tango 7:1640572360de 104 }
alpha_tango 4:9b1c6b9dae1c 105
alpha_tango 4:9b1c6b9dae1c 106 // Initialize color sensor
alpha_tango 4:9b1c6b9dae1c 107 char timing_register[2] = {129,0};
alpha_tango 4:9b1c6b9dae1c 108 i2c.write(sensor_addr,timing_register,2,false);
alpha_tango 4:9b1c6b9dae1c 109
alpha_tango 4:9b1c6b9dae1c 110 char control_register[2] = {143,0};
alpha_tango 4:9b1c6b9dae1c 111 i2c.write(sensor_addr,control_register,2,false);
alpha_tango 4:9b1c6b9dae1c 112
alpha_tango 4:9b1c6b9dae1c 113 char enable_register[2] = {128,3};
alpha_tango 4:9b1c6b9dae1c 114 i2c.write(sensor_addr,enable_register,2,false);
alpha_tango 4:9b1c6b9dae1c 115
alpha_tango 5:17a8d8395a50 116 // Initialize the robot position
alpha_tango 5:17a8d8395a50 117 move((0.6096-radDistance+posDistance+armDistance),FORWARD);
alpha_tango 5:17a8d8395a50 118 turnLeft();
alpha_tango 5:17a8d8395a50 119 move(radDistance,BACKWARD);
alpha_tango 0:7e54f0e2be67 120
alpha_tango 0:7e54f0e2be67 121 while(true)
alpha_tango 4:9b1c6b9dae1c 122 {
alpha_tango 7:1640572360de 123 for(int i = 0; i <=8; i++)
alpha_tango 7:1640572360de 124 {
alpha_tango 7:1640572360de 125 leg = 0.762; //2.5 feet in meters
alpha_tango 7:1640572360de 126 grabToken();
alpha_tango 7:1640572360de 127 color = findColor();
alpha_tango 7:1640572360de 128 if (color = 9)
alpha_tango 7:1640572360de 129 {
alpha_tango 7:1640572360de 130 break;
alpha_tango 7:1640572360de 131 }
alpha_tango 7:1640572360de 132 else
alpha_tango 7:1640572360de 133 {
alpha_tango 7:1640572360de 134 findPath(color)
alpha_tango 7:1640572360de 135 }
alpha_tango 7:1640572360de 136 move(leg, FORWARD);
alpha_tango 7:1640572360de 137
alpha_tango 7:1640572360de 138 }
alpha_tango 0:7e54f0e2be67 139 grabToken();
alpha_tango 0:7e54f0e2be67 140 move(1,FORWARD);
alpha_tango 5:17a8d8395a50 141 turnLeft();
alpha_tango 4:9b1c6b9dae1c 142 wait(0.5);
alpha_tango 5:17a8d8395a50 143 turnLeft();
alpha_tango 0:7e54f0e2be67 144 wait(2);
alpha_tango 0:7e54f0e2be67 145 dropToken();
alpha_tango 0:7e54f0e2be67 146 wait(2);
alpha_tango 0:7e54f0e2be67 147 }
alpha_tango 0:7e54f0e2be67 148 }
alpha_tango 4:9b1c6b9dae1c 149
alpha_tango 0:7e54f0e2be67 150 //Distance is in meters
alpha_tango 4:9b1c6b9dae1c 151 void move(float dist, bool direction)
alpha_tango 0:7e54f0e2be67 152 {
alpha_tango 0:7e54f0e2be67 153 FLdirection = direction;
alpha_tango 0:7e54f0e2be67 154 FRdirection = !direction;
alpha_tango 0:7e54f0e2be67 155
alpha_tango 4:9b1c6b9dae1c 156 stepFL.period(1.0/FREQUENCY);
alpha_tango 0:7e54f0e2be67 157 stepFR.period(1/FREQUENCY);
alpha_tango 4:9b1c6b9dae1c 158 stepFL.write(0.5f);
alpha_tango 4:9b1c6b9dae1c 159 stepFR.write(0.5f);
alpha_tango 0:7e54f0e2be67 160 //dist/stepSize is the number of steps
alpha_tango 0:7e54f0e2be67 161 //1/FREQUENCY is the time per step
alpha_tango 4:9b1c6b9dae1c 162 wait(4*(dist/stepSize)*(1/FREQUENCY));
alpha_tango 4:9b1c6b9dae1c 163 stepFL.period(0.0f);
alpha_tango 4:9b1c6b9dae1c 164 stepFR.period(0.0f);
alpha_tango 4:9b1c6b9dae1c 165 stepFL.write(0.0f);
alpha_tango 4:9b1c6b9dae1c 166 stepFR.write(0.0f);
alpha_tango 0:7e54f0e2be67 167
alpha_tango 0:7e54f0e2be67 168 }
alpha_tango 4:9b1c6b9dae1c 169
alpha_tango 0:7e54f0e2be67 170 void grabToken()
alpha_tango 0:7e54f0e2be67 171 {
alpha_tango 4:9b1c6b9dae1c 172 highL = 0;
alpha_tango 4:9b1c6b9dae1c 173 highH = 1;
alpha_tango 0:7e54f0e2be67 174 enableH = 1;
alpha_tango 0:7e54f0e2be67 175 wait(1);
alpha_tango 0:7e54f0e2be67 176 magDirection = 1;
alpha_tango 0:7e54f0e2be67 177 magArm.period(0.002);
alpha_tango 0:7e54f0e2be67 178 magArm.write(0.5);
alpha_tango 0:7e54f0e2be67 179 wait(0.65);
alpha_tango 0:7e54f0e2be67 180 magArm.period(0);
alpha_tango 0:7e54f0e2be67 181 magArm.write(0);
alpha_tango 0:7e54f0e2be67 182
alpha_tango 0:7e54f0e2be67 183 }
alpha_tango 4:9b1c6b9dae1c 184
alpha_tango 0:7e54f0e2be67 185 void dropToken()
alpha_tango 0:7e54f0e2be67 186 {
alpha_tango 0:7e54f0e2be67 187 magDirection = 0;
alpha_tango 0:7e54f0e2be67 188 magArm.period(0.002);
alpha_tango 0:7e54f0e2be67 189 magArm.write(0.5);
alpha_tango 0:7e54f0e2be67 190 wait(0.65);
alpha_tango 0:7e54f0e2be67 191 magArm.period(0);
alpha_tango 4:9b1c6b9dae1c 192 magArm.write(0);
alpha_tango 4:9b1c6b9dae1c 193 highL = 1;
alpha_tango 4:9b1c6b9dae1c 194 highH = 0;
alpha_tango 4:9b1c6b9dae1c 195 wait(2);
alpha_tango 4:9b1c6b9dae1c 196 enableH = 0;
alpha_tango 0:7e54f0e2be67 197 }
alpha_tango 4:9b1c6b9dae1c 198
alpha_tango 4:9b1c6b9dae1c 199 void turnRight(float dist, bool direction)
alpha_tango 2:5f29bc7daa49 200 {
alpha_tango 2:5f29bc7daa49 201 //Get rid of all FR occurences which will turn right motor off
alpha_tango 5:17a8d8395a50 202 FLdirection = 0; //to turn right we want this going FORWARD so a 0;
alpha_tango 2:5f29bc7daa49 203
alpha_tango 2:5f29bc7daa49 204
alpha_tango 2:5f29bc7daa49 205 stepFL.period(1/FREQUENCY);
alpha_tango 2:5f29bc7daa49 206 stepFL.write(0.5);
alpha_tango 2:5f29bc7daa49 207
alpha_tango 2:5f29bc7daa49 208 //dist/stepSize is the number of steps
alpha_tango 2:5f29bc7daa49 209 //1/FREQUENCY is the time per step
alpha_tango 5:17a8d8395a50 210 wait(4*(0.35343/stepSize)*(1/FREQUENCY));
alpha_tango 2:5f29bc7daa49 211 stepFL.period(0);
alpha_tango 2:5f29bc7daa49 212 stepFL.write(0);
alpha_tango 0:7e54f0e2be67 213 }
alpha_tango 4:9b1c6b9dae1c 214 void turnLeft(float dist, bool direction)
alpha_tango 3:d3264a6f7a62 215 {
alpha_tango 3:d3264a6f7a62 216 //Get rid of all FL occurences which will turn left motor off
alpha_tango 5:17a8d8395a50 217 FRdirection = 1; //to turn right we want this going FORWARD, since FORWARD = 0, it must be !0
alpha_tango 3:d3264a6f7a62 218
alpha_tango 3:d3264a6f7a62 219
alpha_tango 3:d3264a6f7a62 220 stepFR.period(1/FREQUENCY); // We could slow motor down by subtracting from denominator.
alpha_tango 3:d3264a6f7a62 221 stepFR.write(0.5);
alpha_tango 3:d3264a6f7a62 222
alpha_tango 3:d3264a6f7a62 223 //dist/stepSize is the number of steps
alpha_tango 3:d3264a6f7a62 224 //1/FREQUENCY is the time per step
alpha_tango 5:17a8d8395a50 225 wait(4*(0.35343/stepSize)*(1/FREQUENCY));
alpha_tango 3:d3264a6f7a62 226 stepFR.period(0);
alpha_tango 3:d3264a6f7a62 227 stepFR.write(0);
alpha_tango 3:d3264a6f7a62 228 }
alpha_tango 0:7e54f0e2be67 229 void rot180()
alpha_tango 0:7e54f0e2be67 230 {
alpha_tango 4:9b1c6b9dae1c 231 //Get rid of all FR occurences which will turn right motor off
alpha_tango 4:9b1c6b9dae1c 232 FLdirection = direction; //to turn right we want this going FORWARD so a 0;
alpha_tango 4:9b1c6b9dae1c 233
alpha_tango 4:9b1c6b9dae1c 234
alpha_tango 4:9b1c6b9dae1c 235 stepFL.period(1/FREQUENCY);
alpha_tango 4:9b1c6b9dae1c 236 stepFL.write(0.5);
alpha_tango 4:9b1c6b9dae1c 237
alpha_tango 4:9b1c6b9dae1c 238 //dist/stepSize is the number of steps
alpha_tango 4:9b1c6b9dae1c 239 //1/FREQUENCY is the time per step
alpha_tango 4:9b1c6b9dae1c 240 wait(2*4*(0.35343/stepSize)*(1/FREQUENCY));
alpha_tango 4:9b1c6b9dae1c 241 stepFL.period(0);
alpha_tango 4:9b1c6b9dae1c 242 stepFL.write(0);
alpha_tango 0:7e54f0e2be67 243 }
alpha_tango 0:7e54f0e2be67 244 void kill()
alpha_tango 0:7e54f0e2be67 245 {
alpha_tango 0:7e54f0e2be67 246 exit(0);
alpha_tango 0:7e54f0e2be67 247 }
alpha_tango 4:9b1c6b9dae1c 248
alpha_tango 4:9b1c6b9dae1c 249 int findColor(){ //Figures out what color the disk is and makes a decision on where to take the disk
alpha_tango 4:9b1c6b9dae1c 250
alpha_tango 4:9b1c6b9dae1c 251 while (true) {
alpha_tango 4:9b1c6b9dae1c 252 wait(1);
alpha_tango 4:9b1c6b9dae1c 253 char clear_reg[1] = {148};
alpha_tango 4:9b1c6b9dae1c 254 char clear_data[2] = {0,0};
alpha_tango 4:9b1c6b9dae1c 255 i2c.write(sensor_addr,clear_reg,1, true);
alpha_tango 4:9b1c6b9dae1c 256 i2c.read(sensor_addr,clear_data,2, false);
alpha_tango 4:9b1c6b9dae1c 257
alpha_tango 4:9b1c6b9dae1c 258 int clear_value = ((int)clear_data[1] << 8) | clear_data[0];
alpha_tango 4:9b1c6b9dae1c 259
alpha_tango 4:9b1c6b9dae1c 260 char red_reg[1] = {150};
alpha_tango 4:9b1c6b9dae1c 261 char red_data[2] = {0,0};
alpha_tango 4:9b1c6b9dae1c 262 i2c.write(sensor_addr,red_reg,1, true);
alpha_tango 4:9b1c6b9dae1c 263 i2c.read(sensor_addr,red_data,2, false);
alpha_tango 4:9b1c6b9dae1c 264
alpha_tango 4:9b1c6b9dae1c 265 int red_value = ((int)red_data[1] << 8) | red_data[0];
alpha_tango 4:9b1c6b9dae1c 266
alpha_tango 4:9b1c6b9dae1c 267 char green_reg[1] = {152};
alpha_tango 4:9b1c6b9dae1c 268 char green_data[2] = {0,0};
alpha_tango 4:9b1c6b9dae1c 269 i2c.write(sensor_addr,green_reg,1, true);
alpha_tango 4:9b1c6b9dae1c 270 i2c.read(sensor_addr,green_data,2, false);
alpha_tango 4:9b1c6b9dae1c 271
alpha_tango 4:9b1c6b9dae1c 272 int green_value = ((int)green_data[1] << 8) | green_data[0];
alpha_tango 4:9b1c6b9dae1c 273
alpha_tango 4:9b1c6b9dae1c 274 char blue_reg[1] = {154};
alpha_tango 4:9b1c6b9dae1c 275 char blue_data[2] = {0,0};
alpha_tango 4:9b1c6b9dae1c 276 i2c.write(sensor_addr,blue_reg,1, true);
alpha_tango 4:9b1c6b9dae1c 277 i2c.read(sensor_addr,blue_data,2, false);
alpha_tango 4:9b1c6b9dae1c 278
alpha_tango 4:9b1c6b9dae1c 279 int blue_value = ((int)blue_data[1] << 8) | blue_data[0];
alpha_tango 4:9b1c6b9dae1c 280
alpha_tango 4:9b1c6b9dae1c 281
alpha_tango 4:9b1c6b9dae1c 282
alpha_tango 7:1640572360de 283 //1=red,2=green,3=blue,4=cyan,5=magenta,6=yellow,7=gray,8=error, 9=nothing
alpha_tango 4:9b1c6b9dae1c 284 if(blue_value<10000 && red_value>10000){
alpha_tango 4:9b1c6b9dae1c 285 return(1);
alpha_tango 4:9b1c6b9dae1c 286 }
alpha_tango 4:9b1c6b9dae1c 287 else if(green_value>18000 && blue_value<30000){
alpha_tango 4:9b1c6b9dae1c 288 return(2);
alpha_tango 4:9b1c6b9dae1c 289 }
alpha_tango 4:9b1c6b9dae1c 290 else if(red_value<10000 && blue_value>15000){
alpha_tango 4:9b1c6b9dae1c 291 return(3);
alpha_tango 4:9b1c6b9dae1c 292 }
alpha_tango 4:9b1c6b9dae1c 293 else if(blue_value>30000 && red_value<20000){
alpha_tango 4:9b1c6b9dae1c 294 return(4);
alpha_tango 4:9b1c6b9dae1c 295 }
alpha_tango 4:9b1c6b9dae1c 296 else if(red_value>25000 && green_value<15000){
alpha_tango 4:9b1c6b9dae1c 297 return(5);
alpha_tango 4:9b1c6b9dae1c 298 }
alpha_tango 4:9b1c6b9dae1c 299 else if(red_value>50000){
alpha_tango 4:9b1c6b9dae1c 300 return(6);
alpha_tango 4:9b1c6b9dae1c 301 }
alpha_tango 4:9b1c6b9dae1c 302 else if(red_value<10000 && blue_value<10000){
alpha_tango 4:9b1c6b9dae1c 303 return(7);
alpha_tango 4:9b1c6b9dae1c 304 }
alpha_tango 4:9b1c6b9dae1c 305 else if(red_value==0){
alpha_tango 4:9b1c6b9dae1c 306 return(8);
alpha_tango 4:9b1c6b9dae1c 307 }
alpha_tango 7:1640572360de 308 else{
alpha_tango 7:1640572360de 309 return(9);
alpha_tango 7:1640572360de 310 }
alpha_tango 4:9b1c6b9dae1c 311 // print sensor readings
alpha_tango 4:9b1c6b9dae1c 312
alpha_tango 4:9b1c6b9dae1c 313 //pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n", clear_value, red_value, green_value, blue_value);
alpha_tango 4:9b1c6b9dae1c 314 //wait(0.5);
alpha_tango 4:9b1c6b9dae1c 315 }
alpha_tango 4:9b1c6b9dae1c 316 }