uyvug
Dependencies: Adafruit-16-Ch-PWM-Servo-Driver HCSR04 PID PololuQik2 QEI Sharp mbed-rtos
Fork of theRobot by
Diff: main.cpp
- Revision:
- 30:db07aea6d119
- Parent:
- 29:22b243e288c8
- Child:
- 31:99cf9c25b0f2
diff -r 22b243e288c8 -r db07aea6d119 main.cpp --- a/main.cpp Wed Apr 16 20:51:52 2014 +0000 +++ b/main.cpp Thu Apr 17 20:34:17 2014 +0000 @@ -25,7 +25,6 @@ #define DIST_PER_PULSE (0.01054225722682) #define MTRS_TO_INCH (39.3701) #define MAX_SPEED (0.3*127) -#define MAX_SPEED1 (0.25*127) #define PPR (4331/4) #define LEFT (1) #define RIGHT (0) @@ -119,12 +118,16 @@ //Serial bt(p13,p14); HCSR04 rangeFinderFront( PIN_TRIGGERL, PIN_ECHOL ); HCSR04 rangeFinderRight( PIN_TRIGGERR, PIN_ECHOR ); -PID pid1(15.0,0.0,4.0,0.02); -PololuQik2 motors(p9, p10, p8, p15, &errFunction, cRc); -QEI rightEncoder(p17,p18,NC,PPR,QEI::X4_ENCODING); -QEI leftEncoder(p16,p15,NC,PPR,QEI::X4_ENCODING); -Sharp IRFront(p19); -Sharp IRBack(p20); +PID pid1(25.0,0.0,0.0,0.0001); +PololuQik2 motors(p9, p10, p8, p11, &errFunction, cRc); +QEI rightEncoder(p22,p21,NC,PPR,QEI::X4_ENCODING); +QEI leftEncoder(p23,p24,NC,PPR,QEI::X4_ENCODING); +Sharp IRLeftFront(p18); +Sharp IRLeftBack(p17); +Sharp IRRightFront(p20); +Sharp IRRightBack(p15); +Sharp IRFrontL(p19); +Sharp IRFrontR(p16); //InterruptIn encoder(p29); @@ -271,14 +274,18 @@ pc.baud(115200); - //testSensors(); - //Laser Range Finder Initialization lrf_baudCalibration(); motors.begin(); startBtn.rise(&button_int); + //////////////////////////// TEST SERVOS ///////////////////////// + //testSensors(); + + motors.begin(); + //wall_follow2(LEFT, FORWARD, TOOLS, 10, 1); + //while(1); //Servo initialization initServoDriver(); @@ -321,9 +328,9 @@ case START : myled1 = 1; - //current=75; - //state = NAVIGATE_WAVES_ROW1; - state = OILRIG1_POS; + current=75; + state = NAVIGATE_WAVES_ROW1; + //state = OILRIG1_POS; break; @@ -661,7 +668,7 @@ break; case NAVIGATE_WAVES_ROW3: - //shape_detected = 1; + shape_detected = 1; if(tool_needed == 1) { rig_section(location, current, direction, 1); //state = NAVIGATE_TO_SQUARE_RIG; @@ -909,9 +916,8 @@ void wall_follow2(int side, int direction, int section, float location, int rig) { - int dir=1, limit=80, lowlim=4; + int dir=1, limit=78, lowlim=4; float set=28, loc=0, Rigloc=0, location_cal=0; - bool SeeWaveGap = false; if(rig == 1) Rigloc= 16; else if(rig == 2) Rigloc= 45; @@ -923,7 +929,7 @@ limit = 100; lowlim=10; } else if(section == RIGS) set = 18; - else if(section == MID2) limit =85; + else if(section == MID2) limit =80; if(direction == BACKWARD) { dir=-1; @@ -935,8 +941,6 @@ leftEncoder.reset(); rightEncoder.reset(); - //pc.printf("before %f\r\n", location); - //pc.printf("dir*loc+location %f\r\n",dir*loc + location ); //pc.printf("limit %d \r\n", limit); if((section == RIGS || section == RETURN) && side == LEFT)location_cal= -1*dir*loc + location; @@ -950,30 +954,28 @@ else location_cal= dir*loc + location; pid1.setInputLimits(0.0, set); - pid1.setOutputLimits( -MAX_SPEED1, MAX_SPEED1); + pid1.setOutputLimits( -MAX_SPEED, MAX_SPEED); pid1.setSetPoint(set); - if(side) { - range = IRFront.getIRDistance(); - range3= IRBack.getIRDistance(); + if(side== LEFT) { + range = IRLeftFront.getIRDistance(); + range2= IRLeftBack.getIRDistance(); } else { - rangeFinderRight.startMeas(); - wait_ms(20); - rangeFinderRight.getMeas(range); + range = IRRightFront.getIRDistance(); + range2= IRRightBack.getIRDistance(); } - if(section == RIGS) { + if(section == RIGS) {// check for the rigs on opposite side if(side == LEFT) { - range2 = IRFront.getIRDistance(); - range3= IRBack.getIRDistance(); + range = IRRightFront.getIRDistance(); + range2= IRRightBack.getIRDistance(); } else { - rangeFinderRight.startMeas(); - wait_ms(20); - rangeFinderRight.getMeas(range2); + range = IRLeftFront.getIRDistance(); + range2= IRLeftBack.getIRDistance(); } - if(range2< 15) { + if(range2 < 40 || range < 40 ) { if( abs(location_cal - Rigloc) < 10) { //STOP motors.stopBothMotors(127); @@ -981,43 +983,41 @@ } } } - - - //pc.printf("wall follow 2 range %f\r\n",range); - //pc.printf("loc+location = %f\r\n", loc+location); - if(range > 35 && range3 > 35) { - if(section != RETURN) { + + if(range > 40 && range2 > 40 && section != RIGS) { pc.printf("RANGE %f \tRANGE3 %f\r\n",range,range3); //STOP motors.stopBothMotors(127); break; - } } else { - SeeWaveGap = false; - pid1.setProcessValue(range); - pid_return = pid1.compute(); - //pc.printf("Range: %f\n PID: %f\r\n", range, pid_return); + if(direction == FORWARD) pid1.setProcessValue(range); + else pid1.setProcessValue(range2); + + if(abs(range - range2) < 10){ // does it see a wavegap? + pid_return = pid1.compute(); + //pc.printf("Range: %f\n PID: %f\r\n", range, pid_return); - if(pid_return > 0) { - if(side) { - motors.setMotor0Speed(dir*MAX_SPEED - dir*pid_return);//right - motors.setMotor1Speed(dir*MAX_SPEED);//left + if(pid_return > 0) { + if(side) { + motors.setMotor0Speed(dir*MAX_SPEED - dir*pid_return);//right + motors.setMotor1Speed(dir*MAX_SPEED);//left + } else { + motors.setMotor1Speed(dir*MAX_SPEED - dir*pid_return);//left + motors.setMotor0Speed(dir*MAX_SPEED);//right + } + } else if(pid_return < 0) { + if(side) { + motors.setMotor0Speed(dir*MAX_SPEED);//right + motors.setMotor1Speed(dir*MAX_SPEED + dir*pid_return);//left + } else { + motors.setMotor1Speed(dir*MAX_SPEED);//left + motors.setMotor0Speed(dir*MAX_SPEED + dir*pid_return);//right + } } else { - motors.setMotor1Speed(dir*MAX_SPEED - dir*pid_return);//left - motors.setMotor0Speed(dir*MAX_SPEED);//right + motors.setMotor0Speed(dir*MAX_SPEED); + motors.setMotor1Speed(dir*MAX_SPEED); } - } else if(pid_return < 0) { - if(side) { - motors.setMotor0Speed(dir*MAX_SPEED);//right - motors.setMotor1Speed(dir*MAX_SPEED + dir*pid_return);//left - } else { - motors.setMotor1Speed(dir*MAX_SPEED);//left - motors.setMotor0Speed(dir*MAX_SPEED + dir*pid_return);//right - } - } else { - motors.setMotor0Speed(dir*MAX_SPEED); - motors.setMotor1Speed(dir*MAX_SPEED); } } } @@ -1112,7 +1112,7 @@ // check distance to wall - if(IRFront.getIRDistance() > 4) { + if(IRLeftFront.getIRDistance() > 4) { leftEncoder.reset(); rightEncoder.reset(); @@ -1157,7 +1157,7 @@ wait_ms(20); rangeFinderRight.getMeas(range); } else { - range = IRFront.getIRDistance(); + range = IRLeftFront.getIRDistance(); } //pc.printf("Range %f \t OldValue %f\n\r",range, usValue); if(range > usValue && usValue != 0 && range < 25) { @@ -1180,14 +1180,14 @@ motors.stopBothMotors(127); wait_ms(300); - if(IRFront.getIRDistance() > 35 && IRBack.getIRDistance() > 35) return; + if(IRLeftFront.getIRDistance() > 35 && IRLeftBack.getIRDistance() > 35) return; // align with wave - while(IRFront.getIRDistance() > 35) { + while(IRLeftFront.getIRDistance() > 35) { pc.printf("front sensor sees gap\r\n"); motors.setMotor0Speed(-0.1*127);//right motors.setMotor1Speed(-0.1*127);//left } - while(IRBack.getIRDistance() >35 ) { + while(IRLeftBack.getIRDistance() >35 ) { pc.printf("back sensor sees gap\r\n"); motors.setMotor0Speed(0.1*127);//right motors.setMotor1Speed(0.1*127);//left @@ -1195,12 +1195,12 @@ motors.stopBothMotors(127); wait_ms(300); - while(IRFront.getIRDistance() - IRBack.getIRDistance() > 0.5) { + while(IRLeftFront.getIRDistance() - IRLeftBack.getIRDistance() > 0.5) { pc.printf("turn left\r\n"); motors.setMotor0Speed(0.3*127);// right motors.setMotor1Speed(-0.3*127);// left } - while(IRFront.getIRDistance() - IRBack.getIRDistance() < -0.5) { + while(IRLeftFront.getIRDistance() - IRLeftBack.getIRDistance() < -0.5) { pc.printf("turn right\r\n"); motors.setMotor0Speed(-0.3*127);//right motors.setMotor1Speed(0.3*127);// left @@ -1220,17 +1220,16 @@ motors.setMotor1Speed(-0.5*127);// left while(abs(leftEncoder.getPulses())<1075 || rightEncoder.getPulses()<1075); motors.stopBothMotors(127); - wait_ms(300); - if(IRFront.getIRDistance() > 35 && IRBack.getIRDistance() > 35) return; + if(IRLeftFront.getIRDistance() > 35 && IRLeftBack.getIRDistance() > 35) return; // align with wave - while(IRFront.getIRDistance() > 35) { + while(IRLeftFront.getIRDistance() > 35) { pc.printf("front sensor sees gap\r\n"); motors.setMotor0Speed(-0.1*127);//right motors.setMotor1Speed(-0.1*127);//left } - while(IRBack.getIRDistance() >35 ) { + while(IRLeftBack.getIRDistance() >35 ) { pc.printf("back sensor sees gap\r\n"); motors.setMotor0Speed(0.1*127);//right motors.setMotor1Speed(0.1*127);//left @@ -1238,12 +1237,12 @@ motors.stopBothMotors(127); wait_ms(300); - while(IRFront.getIRDistance() - IRBack.getIRDistance() > 0.5) { + while(IRLeftFront.getIRDistance() - IRLeftBack.getIRDistance() > 0.5) { pc.printf("turn left\r\n"); motors.setMotor0Speed(0.3*127);// right motors.setMotor1Speed(-0.3*127);// left } - while(IRFront.getIRDistance() - IRBack.getIRDistance() < -0.5) { + while(IRLeftFront.getIRDistance() - IRLeftBack.getIRDistance() < -0.5) { pc.printf("turn right\r\n"); motors.setMotor0Speed(-0.3*127);//right motors.setMotor1Speed(0.3*127);// left @@ -1256,12 +1255,14 @@ void slightleft(void) { - + motors.begin(); leftEncoder.reset(); rightEncoder.reset(); motors.setMotor0Speed(0.5*127);// right - motors.setMotor1Speed(-0.5*127);// left - while(abs(leftEncoder.getPulses())<70 || rightEncoder.getPulses()<70); + motors.setMotor1Speed(0.5*127);// left + while(abs(leftEncoder.getPulses())<50 || abs(rightEncoder.getPulses())<50){ + + } motors.stopBothMotors(127); } @@ -1343,16 +1344,13 @@ wait_ms(200); motors.stopBothMotors(127); wait_ms(500); + if(section!= RIGS) { range = 0; do { - rangeFinderFront.startMeas(); - wait_ms(1); - while(rangeFinderFront.getMeas(range) != RANGE_MEAS_INVALID); - - pc.printf("Ultrasonic front sensor %f\r\n", range); - if(range < 9) { + pc.printf("front left %f \t front right %f\r\n", IRFrontL.getIRDistance(),IRFrontR.getIRDistance()); + if(IRFrontL.getIRDistance() < 20 && IRFrontR.getIRDistance() < 20) { motors.stopBothMotors(127); wait_ms(200); break; @@ -1364,7 +1362,7 @@ motors.stopBothMotors(127); wait_ms(500); - } while(range > 9); + } while(IRFrontL.getIRDistance() > 20 && IRFrontR.getIRDistance() > 20); motors.setMotor1Speed(0.1*127);//left motors.setMotor0Speed(0.1*127);//right @@ -1379,21 +1377,25 @@ while(leftEncoder.getPulses()<500 || rightEncoder.getPulses()<500) { + pc.printf("left %d \t right %d \r\n", motors.GetMotor0Current(), motors.GetMotor1Current()); motors.setMotor1Speed(0.1*127);//left motors.setMotor0Speed(0.1*127);//right wait_ms(220); + if(motors.GetMotor0Current()>5 || motors.GetMotor1Current() >5) { - motors.setMotor1Speed(0.3*127);//left - motors.setMotor0Speed(0.3*127);//right + pc.printf("fast left %d \t right %d \r\n", motors.GetMotor0Current(), motors.GetMotor1Current()); + motors.setMotor1Speed(0.35*127);//left + motors.setMotor0Speed(0.35*127);//right wait_ms(220); motors.stopBothMotors(127); - wait_ms(200); + wait_ms(500); leftEncoder.reset(); rightEncoder.reset(); } - motors.stopBothMotors(127); - wait_ms(200); + } + motors.stopBothMotors(127); + wait_ms(200); } @@ -1423,11 +1425,11 @@ void from_tools_section(float* location, float ¤t) { - pc.printf("IR front %f \t back %f \r\n", IRFront.getIRDistance(), IRBack.getIRDistance()); + pc.printf("IR front %f \t back %f \r\n", IRLeftFront.getIRDistance(), IRLeftBack.getIRDistance()); - if(IRFront.getIRDistance() < 37 || IRBack.getIRDistance() < 37) { + if(IRLeftFront.getIRDistance() < 40 || IRLeftBack.getIRDistance() < 40) { wall_follow2(LEFT,BACKWARD,TOOLS, current,0); - pc.printf("IR front %f \t back %f \r\n", IRFront.getIRDistance(), IRBack.getIRDistance()); + pc.printf("IR front %f \t back %f \r\n", IRLeftFront.getIRDistance(), IRLeftBack.getIRDistance()); location[0]= current - ((abs(leftEncoder.getPulses()*11.12/PPR) + abs(rightEncoder.getPulses()*11.12/PPR))/2); current= location[0]; //pc.printf("current %f \r\n",current); @@ -1436,10 +1438,9 @@ wait_ms(100); leftTurn(); - slightleft(); overBump(TOOLS); } else { - pc.printf("IR front %f \t back %f \r\n", IRFront.getIRDistance(), IRBack.getIRDistance()); + pc.printf("IR front %f \t back %f \r\n", IRLeftFront.getIRDistance(), IRLeftBack.getIRDistance()); //pc.printf("else greater than 20\r\n"); location[0]= current; leftTurn(); @@ -1453,11 +1454,7 @@ { wait_ms(500); - rangeFinderFront.startMeas(); - wait_ms(20); - rangeFinderFront.getMeas(range); - - if(range > 20) { + if(IRFrontL.getIRDistance() > 40 && IRFrontR.getIRDistance() > 40) { leftEncoder.reset(); rightEncoder.reset(); motors.setMotor0Speed(0.25*127); //right @@ -1485,7 +1482,7 @@ wait_ms(500); - if(IRFront.getIRDistance() > 37 && IRBack.getIRDistance() > 37) { + if(IRLeftFront.getIRDistance() > 40 && IRLeftBack.getIRDistance() > 40) { wait(1); direction[0]= RIGHT; location[1]= current; @@ -1526,11 +1523,7 @@ //pc.printf("mid section 2\r\n"); wait_ms(500); - rangeFinderFront.startMeas(); - wait_ms(20); - rangeFinderFront.getMeas(range); - - if(range > 20) { + if(IRFrontL.getIRDistance() > 40 && IRFrontR.getIRDistance() > 40) { leftEncoder.reset(); rightEncoder.reset(); motors.setMotor0Speed(0.25*127); //right @@ -1545,7 +1538,6 @@ wait_ms(100); rightTurn(); - //slightright(); wait_ms(100); @@ -1556,7 +1548,7 @@ //pc.printf("midseection 2 after wf2 %f",current); - if(IRFront.getIRDistance() > 37 && IRBack.getIRDistance() > 37) { + if(IRLeftFront.getIRDistance() > 40 && IRLeftBack.getIRDistance() > 40) { direction[1]= RIGHT; location[2]= current; slightMove(FORWARD,150); @@ -1771,15 +1763,20 @@ void testSensors(void) { float range, range2; + while(1) { - rangeFinderFront.startMeas(); - rangeFinderRight.startMeas(); + + //pc.printf("us front %f \t us right %f \t IR front %f \t IR back %f\r\n", range, range2, IRLeftFront.getIRDistance(), IRLeftBack.getIRDistance()); + + pc.printf("IR LEFT front %f \t",IRLeftFront.getIRDistance()); + pc.printf("IR left back %f \t",IRLeftBack.getIRDistance()); + + pc.printf("IR right front %f \t",IRRightFront.getIRDistance()); + pc.printf("IR right back %f \t",IRRightBack.getIRDistance()); + + pc.printf("IR front left %f \t",IRFrontL.getIRDistance()); + pc.printf("IR front right %f \r\n",IRFrontR.getIRDistance()); wait_ms(20); - rangeFinderFront.getMeas(range); - rangeFinderRight.getMeas(range2); - - pc.printf("us front %f \t us right %f \t IR front %f \t IR back %f\r\n", range, range2, IRFront.getIRDistance(), IRBack.getIRDistance()); - //pc.printf("IR front %f \t IR back %f\r\n", IRFront.getIRDistance(), IRBack.getIRDistance()); } } \ No newline at end of file