Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- alpha_tango
- Date:
- 2018-04-01
- Revision:
- 12:92ba52394c85
- Parent:
- 11:93c035708249
- Child:
- 13:2c8f8e77b549
File content as of revision 12:92ba52394c85:
#include "mbed.h" // PIN DECLARATIONS DigitalOut FLdirection(PTB18); DigitalOut FRdirection(PTA4); DigitalOut magDirection(PTB19); PwmOut stepFL(PTD3); PwmOut stepFR(PTA5); PwmOut magArm(PTA12); InterruptIn killAll(PTC3); DigitalIn Start(PTC12); DigitalOut enableH(PTC11); DigitalOut highH(PTC10); DigitalOut enableL(PTC11); DigitalOut highL(PTC7); I2C i2c(PTC9, PTC8); //pins for I2C communication (SDA, SCL) Serial pc(USBTX, USBRX); DigitalOut LED(PTC4); DigitalOut green(LED_GREEN); Ticker timer; // attach this to return home function, set according to round time // PROTOTYPE FUNCTION DECLARATIONS void move(float dist, bool direction); void grabToken();//Picks up the token for reading void dropToken();//Drops the token off void kill(); void turnRight(); void turnLeft(); void rot180(); //Turns the robot around int findColor(); //Figures out what color the disk is and makes a decision on where to take the disk void findPathReturn(int color, int i, float scale, float); //Determines where to take the token based on the color and its relative location and then returns to the previous position // GLOBAL VARIABLES const int FORWARD = 0; const int BACKWARD = 1; const float stepSize = 0.001212; //in meters const float FREQUENCY = 500; //steps per second int sensor_addr = 41 << 1; float leg; float scale; int color; // NOTES /* -36 prewriten functions for the drop off decision -Possibly use another RGB sensor as a line follower -Decides function based on color -findPath -starting at bottomLeft -travel up one leg -turn right if rgb -turn left if cmy -turn right, left, or stay based on color choice void findPath(); //Figures out the path to take to take the disk to its drop off position void returnHome(); //Returns to the home white square void returnPrevPos(); //Does the opposite of findPath() to return to the previous position //Variables -boxSizes, 2x2, 3x3, 4x4, etc -legSize, 1 foot, 1.5 feet, 2 feet, etc. -direction choices for findPath */ int main() { //Start a timer //timer.attach(&returnHome, TIME); float radDistance = 0.5; float posDistance = 0.5; float armDistance = 0.5; enableH = 0; //Making sure the H-Bridge starts low and off highH = 0; //This starts high for the H-Bridge highL = 1; //This starts low for the H-Bridge while(true) //The start button { if (Start == 0) break; } killAll.rise(&kill); //The kill interupt // RGB Sensor Settings pc.baud(115200); green = 1; // off i2c.frequency(200000); char id_regval[1] = {146}; char data[1] = {0}; i2c.write(sensor_addr,id_regval,1, true); i2c.read(sensor_addr,data,1,false); if (data[0]==68) { green = 0; wait (2); green = 1; } else { green = 1; } // Initialize color sensor char timing_register[2] = {129,0}; i2c.write(sensor_addr,timing_register,2,false); char control_register[2] = {143,0}; i2c.write(sensor_addr,control_register,2,false); char enable_register[2] = {128,3}; i2c.write(sensor_addr,enable_register,2,false); // Initialize the robot position move((0.6096-radDistance+posDistance+armDistance),FORWARD); turnLeft(); move(radDistance,BACKWARD); move(0.762, FORWARD); while(true) { for(int i = 0; i <=7; i++) //begin motion around Nth perimeter ::No token on one length of the track so we may want to revise this { leg = 0.762; //2.5 feet in meters scale = 1; if(i % 2 == 0) { turnRight(); } grabToken(); color = findColor(); if (color == 9) { return(0); } else { findPathReturn(color, i, scale, leg); dropToken(); //returnPrevious(); } move(leg, FORWARD); } } } //Distance is in meters void move(float dist, bool direction) { FLdirection = direction; FRdirection = !direction; stepFL.period(1.0/FREQUENCY); stepFR.period(1/FREQUENCY); stepFL.write(0.5f); stepFR.write(0.5f); wait(4*(dist/stepSize)*(1/FREQUENCY)); //(dist/stepSize) is the number of steps; 1/FREQUENCY is the time per step stepFL.period(0.0f); stepFR.period(0.0f); stepFL.write(0.0f); stepFR.write(0.0f); } void grabToken() { highL = 0; highH = 1; enableH = 1; wait(1); magDirection = 1; magArm.period(0.002); magArm.write(0.5); wait(0.65); magArm.period(0); magArm.write(0); } void dropToken() { magDirection = 0; magArm.period(0.002); magArm.write(0.5); wait(0.65); magArm.period(0); magArm.write(0); highL = 1; highH = 0; wait(2); enableH = 0; } void turnRight(float dist, bool direction) { //Get rid of all FR occurences which will turn right motor off FLdirection = 0; //to turn right we want this going FORWARD so a 0; stepFL.period(1/FREQUENCY); stepFL.write(0.5); //dist/stepSize is the number of steps //1/FREQUENCY is the time per step wait(4*(0.35343/stepSize)*(1/FREQUENCY)); stepFL.period(0); stepFL.write(0); } void turnLeft(float dist, bool direction) { //Get rid of all FL occurences which will turn left motor off FRdirection = 1; //to turn right we want this going FORWARD, since FORWARD = 0, it must be !0 stepFR.period(1/FREQUENCY); // We could slow motor down by subtracting from denominator. stepFR.write(0.5); //dist/stepSize is the number of steps //1/FREQUENCY is the time per step wait(4*(0.35343/stepSize)*(1/FREQUENCY)); stepFR.period(0); stepFR.write(0); } void rot180() { //Get rid of all FR occurences which will turn right motor off FLdirection = 0; //to turn right we want this going FORWARD so a 0; stepFL.period(1/FREQUENCY); stepFL.write(0.5); //dist/stepSize is the number of steps //1/FREQUENCY is the time per step wait(2*4*(0.35343/stepSize)*(1/FREQUENCY)); stepFL.period(0); stepFL.write(0); } void kill() { exit(0); } int findColor(){ //Figures out what color the disk is and makes a decision on where to take the disk while (true) { wait(1); char clear_reg[1] = {148}; char clear_data[2] = {0,0}; i2c.write(sensor_addr,clear_reg,1, true); i2c.read(sensor_addr,clear_data,2, false); int clear_value = ((int)clear_data[1] << 8) | clear_data[0]; char red_reg[1] = {150}; char red_data[2] = {0,0}; i2c.write(sensor_addr,red_reg,1, true); i2c.read(sensor_addr,red_data,2, false); int red_value = ((int)red_data[1] << 8) | red_data[0]; char green_reg[1] = {152}; char green_data[2] = {0,0}; i2c.write(sensor_addr,green_reg,1, true); i2c.read(sensor_addr,green_data,2, false); int green_value = ((int)green_data[1] << 8) | green_data[0]; char blue_reg[1] = {154}; char blue_data[2] = {0,0}; i2c.write(sensor_addr,blue_reg,1, true); i2c.read(sensor_addr,blue_data,2, false); int blue_value = ((int)blue_data[1] << 8) | blue_data[0]; //1=red,2=green,3=blue,4=cyan,5=magenta,6=yellow,7=gray,8=error, 9=nothing if(blue_value<10000 && red_value>10000){ return(1); } else if(green_value>18000 && blue_value<30000){ return(2); } else if(red_value<10000 && blue_value>15000){ return(3); } else if(blue_value>30000 && red_value<20000){ return(4); } else if(red_value>25000 && green_value<15000){ return(5); } else if(red_value>50000){ return(6); } else if(red_value<10000 && blue_value<10000){ return(7); } else if(red_value==0){ return(8); } else{ return(9); } // print sensor readings //pc.printf("Clear (%d), Red (%d), Green (%d), Blue (%d)\n", clear_value, red_value, green_value, blue_value); //wait(0.5); } //This function decides where to go based on its reletive position and the color written in from the findColor function. Indexes/Positions 3 & 7 not used // 3 //2*--------*--------*4 // | | // | | // | | // | | //1* *5 // | | // | | // | | // | | // *--------*--------*6 // 0 7 void findPathReturn(int color, int i, float scale, float leg); { /*******************************************************************///Red if( i == 0 && color == 1 )//condition for return red at index 0 { move((2*leg + 0.3048*scale), FORWARD); turnLeft(); move((0.3048*scale), FORWARD); dropToken(); rot180(); move((0.3048*scale), FORWARD); turnRight(); move((2*leg + 0.3048*scale), FORWARD); rot180(); } if( i == 1 && color == 1 )//condition for return red at index 1 { move((leg + 0.3048*scale), FORWARD); turnLeft(); move((0.3048*scale), FORWARD); dropToken(); rot180(); move((0.3048*scale), FORWARD); turnRight(); move((leg + 0.3048*scale), FORWARD); rot180(); } if( i == 2 && color == 1 )//condition for return red at index 2 { rot180(); move((0.3048*scale), FORWARD); turnRight(); move((0.3048*scale), FORWARD); dropToken(); rot180(); move((0.3048*scale), FORWARD); turnLeft(); move((0.3048*scale), FORWARD); } if( i == 4 && color == 1 )//condition for return red at index 4 { turnRight(); move(2*leg + 0.3048*scale, FOWARD); turnRight(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnLeft(); move(2*leg + 0.3048*scale, FOWARD); turnRight(); } if( i == 5 && color == 1 ) { rot180(); move(leg + 0.3046*scale, FORWARD); turnLeft(); move(2*leg + 0.3046*scale, FORWARD); dropToken(); rot180(); move(2*leg + 0.3046*scale, FORWARD); turnRight(); move(leg + 0.3046*scale, FORWARD); } if( i == 6 && color == 1 ) //condition for return red at index 5 { turnRight(); move(2*leg + 0.3046*scale, FORWARD); turnLeft(); move(2*leg + 0.3046*scale, FORWARD); dropToken(); rot180(); move(2*leg + 0.3046*scale, FORWARD); turnRight(); move(2*leg + 0.3046*scale, FORWARD); } /*******************************************************************///Green if( i == 0 && color == 2 )//condition for return Green at index 0 { move(leg, FORWARD); turnLeft(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnRight(); move(leg, FORWARD); rot180(); } if( i == 1 && color == 2 )//condition for return green at index 1 { turnLeft(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnLeft(); } if( i == 2 && color == 2 )//condition for return green at index 2 { turnRight(); move(leg, FORWARD); turnRight(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnLeft(); move(leg, FORWARD); turnRight(); } if( i == 4 && color == 2 ) //condition for return green at index 4 { turnRight(); move(2*leg + 0.3046*scale, FORWARD); turnLeft(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnRight(); move(2*leg + 0.3046*scale, FORWARD); turnRight(); } if( i == 5 && color == 2 )//condition for return green at index 5 { turnRight(); move(2*leg + 0.3046*scale, FORWARD); dropToken(); rot180(); move(2*leg + 0.3046*scale, FORWARD); turnRight(); } if( i == 6 && color == 2 )//condition for return green at index 6 { move(2*leg + 0.3046*scale, FORWARD); turnRight(); move(leg + 0.3046*scale, FORWARD); dropToken(); rot180(); move(leg + 0.3046*scale, FORWARD); turnLeft(); move(leg + 0.3046*scale, FORWARD); rot180(); } /*******************************************************************///Blue if( i == 0 && color == 3 )//condition for return Blue at index 0 :: { rot180(); move(0.3048*scale, FORWARD); turnRight(); move(0.3048*scale, FORWARD); dropToken(); rot180(); move(0.3048*scale, FORWARD); turnLeft(); move(0.3048*scale, FORWARD); } if( i == 1 && color == 3 ) //condition for return blue at index 1 { rot180(); move((leg + 0.3048*scale), FORWARD); turnRight(); move(0.3048*scale, FORWARD); dropToken(); rot180(); move(0.3048*scale, FORWARD); turnLeft(); move((leg + 0.3048*scale), FORWARD); } if( i == 2 && color == 3 ) //condition for return blue at index 2 { turnRight(); move((2*leg + 0.3048*scale), FORWARD); turnRight(); move(0.3048*scale, FORWARD); dropToken(); rot180(); move(0.3048*scale, FORWARD); turnLeft(); move((2*leg + 0.3048*scale), FORWARD); turnRight(); } if( i == 4 && color == 3 ) //condition for return blue at index 4 { turnRight(); move((2*leg + 0.3048*scale), FORWARD); turnRight(); move((2*leg) + (0.3048*scale), FORWARD); dropToken(); rot180(); move((2*leg + 0.3048*scale), FORWARD); turnLeft(); move((2*leg) + (0.3048*scale), FORWARD); turnRight(); } if( i == 5 && color == 3 ) //condition for return blue at index 5 { move(leg + 0.3048*scale, FORWARD); turnRight(); move(2*leg + 0.3048*scale, FORWARD); dropToken(); rot180(); move(2*leg + 0.3048*scale, FORWARD); turnLeft(); move(leg + 0.3048*scale, FORWARD); rot180(); } if( i == 6 && color == 3 ) //condition for return blue at index 5 { move(2*leg + 0.3048*scale, FORWARD); turnLeft(); move(0.3048*scale, FORWARD); dropToken(); rot180(); move(0.3048*scale, FORWARD); turnRight(); move(2*leg + 0.3048*scale, FORWARD); rot180(); } /*******************************************************************///Cyan if( i == 0 && color == 4 )//condition for return Cyan at index 0 { move(2*leg + 0.3046*scale, FORWARD) turnRight(); move(2*leg + 0.3046*scale, FORWARD) dropToken(); rot180(); move(2*leg + 0.3046*scale, FORWARD) turnLeft(); move(2*leg + 0.3046*scale, FORWARD) rot180(); } if( i == 1 && color == 4 )//condition for return Cyan at index 1 { move(leg + 0.3046*scale, FOWARD); turnRight(); move(2*leg + 0.3046*scale, FOWARD); dropToken(); rot180(); move(2*leg + 0.3046*scale, FOWARD); turnleft(); move(leg + 0.3046*scale, FOWARD); rot180(); } if( i == 2 && color == 4 )//condition for return Cyan at index 2 { move(2*leg + 0.3046*scale, FOWARD); turnLeft(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnRight(); move(2*leg + 0.3046*scale, FOWARD); rot180(); } if( i == 4 && color == 4 )//condition for return Cyan at index 4 { rot180(); move(0.3046*scale, FORWARD); turnRight(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnLeft(); move(0.3046*scale, FORWARD); turnleft(); move(0.3046*scale, FORWARD); turnRight(); } if( i == 5 && color == 4 )//condition for return Cyan at index 5 { rot180(); move(leg + 0.3046*scale, FORWARD); turnRight(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnLeft(); move(leg + 0.3046*scale, FORWARD); } if( i == 6 && color == 4 )//condition for return Cyan at index 6 { turnRight(); move(2*leg + 0.3046*scale, FORWARD); turnRight(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnLeft(); move(leg + 0.3046*scale, FORWARD); turnRight(); } /*******************************************************************///Magenta if( i == 0 && color == 5 )//condition for return Magenta at index 0 { move(leg, FORWARD); turnRight(); move(2*leg + 0.3046*scale); dropToken(); rot180(); move(2*leg + 0.3046*scale); turnLeft(); move(leg, FORWARD); rot180(); } if( i == 1 && color == 5 )//condition for return Magenta at index 1 { turnRight(); move(2*leg + 0.3046*scale); dropToken(); rot180(); move(2*leg + 0.3046*scale); turnRight(); } if( i == 2 && color == 5 )//condition for return Magenta at index 2 { move(leg + 0.3046*scale, FORWARD); turnRight(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnLeft(); move(2*leg + 0.3046*scalem FORWARD); rot180(); } if( i == 4 && color == 5 )//condition for return Magenta at index 4 { move(leg, FORWARD); turnLeft(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnRight(); Move(leg, FORWARD); rot180(); } if( i == 5 && color == 5 )//condition for return Magenta at index 5 { turnLeft(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnLeft(); } if( i == 6 && color == 5 )//condition for return Magenta at index 6 { rot180(); move(leg, FORWARD); turnRight(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnLeft(); move(lef, FORWARD); turnRight(); } /*******************************************************************///Yellow if( i == 0 && color == 6 )//condition for return Yellow at index 0 { turnRight(); move(2*leg + 0.3046*scale); turnRight(); move(0.3046*scale); dropToken(); rot180(); move(0.3046*scale); turnLeft(); move(2*leg + 0.3046*scale); turnRight(); } if( i == 1 && color == 6 )//condition for return Yellow at index 1 { rot180(); move(leg + 0.3046*scale, FORWARD); turnLeft(); move(2*leg, FORWARD); dropToken(); rot180(); move(2*leg, FOWARD); turnRight(); move(leg + 0.3046*scale, FORWARD); } if( i == 2 && color == 6 )//condition for return Yellow at index 2 { move(2*leg + 0.3046*scale, FORWARD); turnRight(); move(2*leg, FORWARD); dropToken(); rot180(); move(2*leg, FORWARD); turnLeft(); move(2*leg + 0.3046*scale, FORWARD); rot180(); } if( i == 4 && color == 6 )//condition for return Yellow at index 4 { move(2*leg + 0.3046*scale, FORWARD); turnLeft(); move(0.3046*scale, FORWARD); dropToken(); rot180(0); move(0.3046*scale, FORWARD); turnRight(); move(2*leg + 0.3046*scale, FORWARD); rot180(); } if( i == 5 && color == 6 )//condition for return Yellow at index 5 { move(leg + 0.3046*scale, FORWARD); turnLeft(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnRight(); move(Leg + 0.3046*scale, FORWARD); rot180(); } if( i == 6 && color == 6 )//condition for return Yellow at index 6 { rot180(); move(0.3046*scale, FORWARD); turnRight(); move(0.3046*scale, FORWARD); dropToken(); rot180(); move(0.3046*scale, FORWARD); turnLeft(); move(0.3046*scale, FORWARD); } /*******************************************************************///Gray if( i == 0 && color == 7 )//condition for return Gray at index 0 { move(leg, FORWARD); turnRight(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnLeft(); move(leg, FORWARD); } if( i == 1 && color == 7 )//condition for return Gray at index 1 { turnRight(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnRight(); } if( i == 2 && color == 7 ) //condition for return Gray at index 2 { rot180(); move(leg, FORWARD); turnLeft(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnRight(); move(leg, FORWARD); turnRight(); } if( i == 4 && color == 7 ) //condition for return Gray at index 4 { move(leg, FORWARD); turnRight(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORARD); turnLeft(); move(lef, FORWARD); rot180(); } if( i == 5 && color == 7 )//condition for return Gray at index 5 { turnRight(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); turnRight(); } if( i == 6 && color == 7 )//condition for return Gray at index 6 { turnRight(); move(leg, FORWARD); turnLeft(); move(leg, FORWARD); dropToken(); rot180(); move(leg, FORWARD); rightRight(); move(leg, FORWARD); turnRight(); } else {} /*******************************************************************/ } }