![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
x
Dependencies: Servo ServoArm mbed
Fork of PES_PIXY_Officiall by
Diff: main.cpp
- Revision:
- 2:c8c965d48f8d
- Parent:
- 1:fd3cef0f116d
- Child:
- 3:63da1d1fae15
--- a/main.cpp Tue May 23 16:24:49 2017 +0000 +++ b/main.cpp Thu May 25 18:12:28 2017 +0000 @@ -14,7 +14,7 @@ Pixy pixy(cam); //DistanceSensors related bottom: -//Serial pc(SERIAL_TX, SERIAL_RX); +Serial pc(SERIAL_TX, SERIAL_RX); AnalogIn sensorVoltage(PB_1); DigitalOut enable(PC_1); @@ -70,90 +70,113 @@ } } /* */ -int main(){ +int main() +{ initializeDistanceSensors(); //Initialises IR-Sensors. - enum states {search = 0, setX, setY, fine, take, test}; + enum states {search = 0, setPos, take}; int time = 0; //Time keeps track of time. [time] = ms - + PID_Control pid; - pid.setPIDValues( 0.001f, 0.001f, 0.00015f, 0.3f, -0.3f, 1000); - // pc.baud( 115200 ); - - int state = take; - - sam.stop(); - while(!sam.Arm.collectToBack()) wait(0.1); - wait(0.25); - /* - while( 1 ){ - printf("\n\rX: %d,\t Y: %d", pixy.getX(), pixy.getY()); - wait(1.0f); - } - */ + pid.setPIDValues( 0.001f, 0.001f, 0.00015f, 0.15f, -0.15f, 1000); + // pc.baud( 115200 ); + + int state = search; + while(!sam.Arm.collectToBack())wait(0.075); + while(!sam.Greifer.leave())wait(0.001); + + + while( 1 ) { + + switch(state){ - while( 1 ){ - switch( state ){ - case test: - break; - - case search: - if(pixy.getDetects())sam.leds[5]=1; - else sam.leds[5]=0; - if( sam.search(&time) ) state = setX; - break; - - case setX:{ - static int messungen[20], i = 0; - float e = 132.5f - pixy.getX(); - float diff = pid.calc( e, 0.001f ); - - sam.setLeft(0.5f - diff); - sam.setRight(0.5f - diff); - if(pixy.getX()>130 && pixy.getX()<135){ - state = setY; - } - break; + case search: { + if(!((pixy.getX()>50 && pixy.getX()<300)&&(pixy.getY()>50 && pixy.getY()<300))){ + sam.search(&time); } - case setY:{ - - static int messungen[20], i = 0; - float e = 121.5f - pixy.getY(); - float diff = pid.calc( e, 0.001f ); - - sam.setLeft(0.5f + diff); - sam.setRight(0.5f - diff); - if(pixy.getY()>119 && pixy.getY()<124){ - state = take; - } - break; + else { + state = setPos; + } + + break; + } + + case setPos: { + sam.leds[5] = 1; + static int i = 0; + float eX = 133.0f - pixy.getX(); + float diffX = pid.calc( eX, 0.006f ); + + float aX = 0.03; //minimum diff + float aY = 0.05; + if(diffX>0) { + if(diffX<aX)diffX=aX; + } + else if(diffX>-aX)diffX=-aX; + + if(!(pixy.getX()>128 && pixy.getX()<138)){ + sam.setLeft(0.5f - diffX); + sam.setRight(0.5f - diffX); + } + + wait(0.001f); + + float eY = 121.0f - pixy.getY(); + float diffY = pid.calc( eY, 0.006f ); + if(diffY>0) { + if(diffY<aY)diffY=aY; + } + else if(diffY>-aY) diffY=-aY; + if(!(pixy.getY()>115 && pixy.getY()<125)){ + sam.setLeft(0.5f + diffY); + sam.setRight(0.5f - diffY); + } + i++; + if((pixy.getX()>132 && pixy.getX()<134)&&(pixy.getY()>119 && pixy.getY()<122)||!(i%1000)) { + state = take; + i = 0; + sam.stop(); + sam.leds[5] = 0; + } + break; + } + + case take: { + enum takeStates {down=0, take, up, leave}; + static int tState=down; + + sam.leds[1] = 1; + sam.stop(); + //tState=leave; + + switch(tState) { + case down: + if(sam.Arm.backToDown()) tState=take; + else tState=down; + break; + case take: + if(sam.Greifer.take()) tState=up; + else tState=take; + break; + case up: + if(sam.Arm.downToBack()) {wait(0.05);tState=leave;} + else tState=up; + break; + case leave: + if(sam.Greifer.leave()) {state=search; tState=down;} + else tState=leave; + break; } - - case take:{ - sam.leds[1] = 1; - sam.stop(); - enum takeStates{down=0, take, up, leave}; - static int tState=down; - switch(tState){ - case down: if(sam.Arm.backToDown()) tState=take; - else tState=down; break; - case take: if(sam.Greifer.take()) tState=up; - else tState=take; break; - case up: if(sam.Arm.downToBack()) tState=leave; - else tState=up; break; - case leave: if(sam.Greifer.leave()) state=search; - else tState=leave; break; - } - - - - break; - } + + + sam.leds[1] = 0; + break; } - time++; - wait(0.05f); } - - return 0; + time++; + wait(0.005f); +} + +return 0; } /* * / @@ -166,32 +189,32 @@ //int found = 0; //0:= no block available, 1 := a lego is ready to be picked up //int done = 0; int color; - + enum states { search = 0, LeisteDown, turn, push, backOff, forward, downward, down, upward, colorS, readyDrop, backward, LeisteUp }; int state = search; - + static float messung = 0; - + while( 1 ){ printf("\n\r%f", sam.see(FWD_L)); - + wait(1.0f); - + } - + while( 1 ) { - + if ( timer > TIMEOUT ) { NVIC_SystemReset(); //Resets Sam. } - + //if( timer == 0 ) //printf("\n\rLEFT: %.3f,\tFWD: %.3f,\tRIGHT: %.3f", sam.sensors[LEFT].read(), sam.sensors[FWD].read(), sam.sensors[RIGHT].read()); - - + + //printf("\n\rcurrent main state: %d", state); - + sam.sensors[FWD_L].read() < NEAR ? sam.leds[1] = 1 : sam.leds[1] = 0; switch( state ) { case search: @@ -201,7 +224,7 @@ timer = 0; } break; - + case LeisteDown: int count = 0; if( sam.Leiste.upToDown() ){ @@ -210,7 +233,7 @@ timer = 0; } break; - + case turn: static int i = 0; if( i > 7 ){ @@ -223,7 +246,7 @@ sam.turnRight(); } break; - + case push:{ static int i = 0; if( i > 5 ){ @@ -238,7 +261,7 @@ } break; } - + case backOff:{ static int i = 0; if( i > 1 ){ @@ -253,8 +276,8 @@ } break; } - - + + case forward: if( sam.Arm.backToCollect() ){ state = downward; @@ -275,40 +298,40 @@ timer = 0; } break; - + case upward: if( sam.Arm.downToCollect() ){ state = colorS; timer = 0; } break; - + case colorS: led = 1; color = sam.FarbVoltage.read(); - + if( color == -1 ){ //Do nothing } - - + + else if( color == 0 || color == GREEN ){ state = backward; led = 0; timer = 0; } - + else if( color == RED ){ state = readyDrop; led = 0; timer = 0; } - + else{ //Shit... } break; - + case readyDrop: if( sam.Greifer.leave() ){ if( color == GREEN || color == 0 ){ @@ -319,9 +342,9 @@ } timer = 0; } - + break; - + case backward: if( sam.Arm.collectToBack() ){ //sam.Greifer.nullPos(); @@ -336,18 +359,18 @@ } } break; - + case LeisteUp: if( sam.Leiste.downToUp() ){ state = search; timer = 0; } break; - } + } timer++; wait(0.1f); } - + return 0; } /* */ \ No newline at end of file