IT GOES NORTH MOST OF THE TIME
Dependencies: HMC6352 Motor mbed
main.cpp
- Committer:
- vsavkin3
- Date:
- 2012-10-10
- Revision:
- 8:c7d277d05f23
- Parent:
- 7:60e5e064698d
- Child:
- 9:6d663bdfee7c
File content as of revision 8:c7d277d05f23:
#include "mbed.h" #include "Motor.h" #include "HMC6352.h" Motor right(p21, p23, p22); // pwm, fwd, rev Motor left(p26, p24, p25); // pwm, fwd, rev AnalogIn irLeft(p20); AnalogIn irFront(p19); AnalogIn irRight(p18); AnalogIn dirLeft(p17); AnalogIn dirRight(p16); HMC6352 compass(p9, p10); enum direction{ Right, Forward, Left, TurnNorth }; int main() { enum direction dir=Forward; compass.setOpMode(HMC6352_CONTINUOUS, 1, 20); printf("Front Right Left\n\r"); int j=0; float readLeft; float readRight; float readFront; float diagRight; float diagLeft; float stable[5][4]; readLeft=irLeft; readRight=irRight; readFront=irFront; diagRight=dirRight; diagLeft=dirLeft; int NorthOn=0; int NorthCount=0; for(j=0;j<4;j++) stable[0][j] = readLeft; for(j=0;j<4;j++) stable[1][j] = readRight; for(j=0;j<4;j++) stable[2][j] = diagLeft; for(j=0;j<4;j++) stable[3][j] = diagRight; for(j=0;j<4;j++) stable[4][j] = readFront; j=1; while (1){ if(j>=4) j=0; readLeft=irLeft; readRight=irRight; readFront=irFront; diagRight=dirRight; diagLeft=dirLeft; readLeft=21/readLeft; readRight=21/readRight; readFront=21/readFront; diagRight=21/diagRight; diagLeft=21/diagLeft; float avgFront = 0, avgRight = 0, avgLeft = 0; avgFront = readFront; avgRight = readRight; avgLeft = readLeft; stable[0][j] = avgLeft; stable[1][j] = avgRight; stable[2][j] = diagLeft; stable[3][j] = diagRight; stable[4][j] = avgFront; j++; printf("Front: %5f Right: %5f Left: %5f dLeft: %5f dRight: %5f", avgFront, avgRight, avgLeft,diagLeft,diagRight); float globalDir = compass.sample()/10.0; printf(" Heading: %f\n\r", globalDir); switch(dir){ case Forward: if( ((stable[0][0]+stable[0][1]+stable[0][2]+stable[0][3])>=160)&& ((stable[1][0]+stable[1][1]+stable[1][2]+stable[1][3])>=160)&& ((stable[2][0]+stable[2][1]+stable[2][2]+stable[2][3])>=160)&& ((stable[3][0]+stable[3][1]+stable[3][2]+stable[3][3])>=160)&& ((stable[4][0]+stable[4][1]+stable[4][2]+stable[4][3])>=160)) NorthCount++; else NorthCount=0; if (NorthCount>3){ NorthOn=1; NorthCount=0;} if ((avgFront<40&&stable[4][0]<40&&stable[4][1]<40&&stable[4][2]<40&&stable[4][3]<40)|| (diagLeft<40&&stable[2][0]<40&&stable[2][1]<40&&stable[2][2]<40&&stable[2][3]<40) /*(avgLeft<40&&stable[0][0]<40&&stable[0][1]<40&&stable[0][2]<40&&stable[0][3]<40)*/) { right.speed(0); left.speed(0); printf("stopped!\n\r"); //wait(0.1); NorthOn=0; dir=Right; } else if((diagRight<40&&stable[3][0]<40&&stable[3][1]<40&&stable[3][2]<40&&stable[3][3]<40) /*(avgRight<40&&stable[1][0]<40&&stable[1][1]<40&&stable[1][2]<40&&stable[1][3]<40))*/) { right.speed(0); left.speed(0); printf("stopped2!\n\r"); //wait(0.1); NorthOn=0; dir=Left; } else if( (((globalDir > 30 && globalDir <= 180)||(globalDir > 180 && globalDir <= 330)&&NorthOn) ) ) { right.speed(0); left.speed(0); dir = TurnNorth; } else {right.speed(0.95); left.speed(1); printf("CHARGE!\n\r"); } break; case Right: printf("TURN Right!\n\r"); if ( ((avgFront<=31.7||stable[4][0]<30||stable[4][1]<30||stable[4][2]<30||stable[4][3]<30) || (diagLeft<=31.7||stable[2][0]<30||stable[2][1]<30||stable[2][2]<30||stable[2][3]<30)) ) { right.speed(-1); left.speed(0); // printf("turning!\n\r"); } else { for(j=0;j<4;j++) stable[0][j] = avgLeft; for(j=0;j<4;j++) stable[1][j] = avgRight; for(j=0;j<4;j++) stable[2][j] = diagLeft; for(j=0;j<4;j++) stable[3][j] = diagRight; for(j=0;j<4;j++) stable[4][j] = avgFront; right.speed(0); left.speed(0); // printf("stopped!\n\r"); //wait(0.1); dir=Forward; } break; case Left: printf("TURN Left!\n\r"); if ( /*(avgRight<=31.7 ||stable[1][0]<30||stable[1][1]<30||stable[1][2]<30||stable[1][3]<30)||*/ (avgFront<=31.7||stable[4][0]<30||stable[4][1]<30||stable[4][2]<30||stable[4][3]<30) || (diagRight<=31.7||stable[3][0]<30||stable[3][1]<30||stable[3][2]<30||stable[3][3]<30) ) { right.speed(0); left.speed(-1); // printf("turning!\n\r"); } else { for(j=0;j<4;j++) stable[0][j] = avgLeft; for(j=0;j<4;j++) stable[1][j] = avgRight; for(j=0;j<4;j++) stable[2][j] = diagLeft; for(j=0;j<4;j++) stable[3][j] = diagRight; for(j=0;j<4;j++) stable[4][j] = avgFront; right.speed(0); left.speed(0); // printf("stopped!\n\r"); //wait(0.1); dir=Forward; } break; case TurnNorth: printf("TO THE NORTH!\n\r"); if (globalDir>330 || globalDir < 30) { //It's going north!! right.speed(0); left.speed(0); dir=Forward; } else { if(globalDir<=180){ right.speed(1); left.speed(-1);} else{right.speed(-1); left.speed(1);} } break; } wait(0.01); } }