Totale Testversion
Dependencies: mbed
Fork of DrehungMitStopp by
Diff: main.cpp
- Revision:
- 3:cfb0b6bcf568
- Parent:
- 2:365bf16abbf6
- Child:
- 4:2ebbd24aa610
--- a/main.cpp Tue May 16 14:14:08 2017 +0000 +++ b/main.cpp Thu May 18 13:22:47 2017 +0000 @@ -2,10 +2,13 @@ #include "IRSensor.h" #include "MotorEncoder.h" #include "LowpassFilter.h" +#include "Servo.h" #include <cmath> DigitalOut led(LED1); //Zustands-LED: Grüne LED für Benutzer +//--------------------IRSensoren------------------------------------------------ + AnalogIn distance(PB_1); //Input der Distanzsensoren DigitalOut enableSensor(PC_1); //Aktivierung der IRSensoren DigitalOut bit0(PH_1); //Ansteuerung der Sensoren 0-5 mit 3 Bits @@ -32,7 +35,6 @@ for(int i = 0; i < 6; i++) { sensorMittelwert[i] += sensors[i].read(); } - //wait( 0.001f ); } for(int i = 0; i < 6; i++) { sensorTiefbass[i] = sensorTiefbass[i]*0.75f + sensorMittelwert[i]*0.25f; //Verrechnet den neuen Wert mit dem alten @@ -60,16 +62,10 @@ break; } } - printf("%f\t%f\t%f\n\r", sensorZentimeter[5], sensorZentimeter[0], sensorZentimeter[1]); //Plottet die unteren Sensoren + Mitte-Oben - - printfZaehler++; -// if(printfZaehler % 120 == 0){ -// wait(3.5f); -// } - if(printfZaehler % 40 == 0) title(); //Erstellt nach 40 Zeilen eine neue Seite } +//--------------------Motor&Encoder--------------------------------------------- const float PERIOD = 0.002f; // period of control task, given in [s] const float COUNTS_PER_TURN = 1200.0f; // resolution of encoder counter @@ -90,13 +86,11 @@ PwmOut pwmLeft(PA_8); PwmOut pwmRight(PA_9); -DigitalOut my_led(LED1); - short previousValueCounterRight = 0; short previousValueCounterLeft = 0; -float desiredSpeedLeft; -float desiredSpeedRight; +float desiredSpeedLeft; //Ansteuerung des linken Motors +float desiredSpeedRight; //Ansteuerung des rechten Motors float actualSpeedLeft; float actualSpeedRight; @@ -131,13 +125,198 @@ pwmRight = dutyCycleRight; } +int active = 0; +float distanceStatic; +int geradeaus_langsam(float distance) // Rückgabewert 1 -> distance erreicht +{ + if(active == 0) { + active =1; + distanceStatic = distance; + counterLeft.reset(); + } + if((counterLeft.read() - counterRight.read()) / 100.0f < distanceStatic) { + desiredSpeedLeft = 1.5 + 15; + desiredSpeedRight = 1.5 - 15; + } else { + desiredSpeedLeft = 0.0; + desiredSpeedRight = 0.0; + active = 0; + return 1; + } + return 0; +} + +int geradeaus_schnell(float distance) // RRückgabewert 1 -> distance erreicht +{ + if(active == 0) { + active = 1; + distanceStatic = distance; + counterLeft.reset(); + } + if((counterLeft.read() - counterRight.read()) / 100.0f < distanceStatic) { + desiredSpeedLeft = 1.5 + 60; + desiredSpeedRight = 1.5 - 60; + } else { + desiredSpeedLeft = 0.0; + desiredSpeedRight = 0.0; + active = 0; + return 1; + } + return 0; +} + +//--------------------Ausweichen------------------------------------------------ + +int a = 0; +int statusAusweichen = 0; +int zaehlerAusweichen = 0; +int ausweichen(){ + if(statusAusweichen == 0){ + if(sensorZentimeter[0] < 10) statusAusweichen = 1; //statusAusweichen 1 -> Wand vorne -> 90° rechts + else if(sensorZentimeter[0] + sensorZentimeter[3] + sensorZentimeter[4] < 70) statusAusweichen = 2; //statusAusweichen 2 -> Ecke -> 90° rechts + else if(sensorZentimeter[3] < 10){ + if(a > 0) statusAusweichen = 9; //Spezial + else statusAusweichen = 3; //statusAusweichen 3 -> Wand links -> 30° rechts + } else if(sensorZentimeter[4] < 10){ + if(a > 0) statusAusweichen = 9; //Spezial + else statusAusweichen = 4; //statusAusweichen 4 -> Wand rechts -> 30° links + } + } + switch(statusAusweichen){ + case 0: //kein Hindernis + a = 0; + return 1; //Ausgewichen + case 1: //Hindernis vorne + case 2: //Ecke + if(zaehlerAusweichen > 30){ + statusAusweichen = 0; + zaehlerAusweichen = 0; + desiredSpeedLeft = 0; + desiredSpeedRight = 0; + } else { + desiredSpeedLeft = 60; + desiredSpeedRight = 60; + } + break; + case 3: //Hindernis links + if(zaehlerAusweichen > 10){ + a++; + statusAusweichen = 0; + zaehlerAusweichen = 0; + desiredSpeedLeft = 0; + desiredSpeedRight = 0; + } else { + desiredSpeedLeft = 60; + desiredSpeedRight = 60; + } + break; + case 4: //Hindernis rechts + if(zaehlerAusweichen > 10){ + a++; + statusAusweichen = 0; + zaehlerAusweichen = 0; + desiredSpeedLeft = 0; + desiredSpeedRight = 0; + } else { + desiredSpeedLeft = -60; + desiredSpeedRight = -60; + } + break; + case 9: //Spezial 120° + if(zaehlerAusweichen > 40){ + a = 0; + statusAusweichen = 0; + zaehlerAusweichen = 0; + desiredSpeedLeft = 0; + desiredSpeedRight = 0; + } else { + desiredSpeedLeft = 60; + desiredSpeedRight = 60; + } + break; + } + return 0; //Am ausweichen... +} + +//--------------------Servos---------------------------------------------------- + +Servo Arm(PA_10); +Servo Greifer(PC_4); +Servo Deckel(PB_8); +AnalogIn Red (PB_0); //Farbauswertung Rot +AnalogIn Green (PA_4); //Farbauswertung Grün + +void aufheben() +{ + for (int pos = 800; pos < 1400; pos += 25) { //Greifer öffnen + Greifer.SetPosition(pos); + wait_ms(7); + } + for (int pos = 440; pos < 2300; pos += 25) { //Arm Runter + Arm.SetPosition(pos); + wait_ms(7); + } + desiredSpeedLeft = 18.0f; + desiredSpeedRight = -15.0f; + wait_ms(400); + for (int pos = 1400; pos > 800; pos -= 25) { //Greifer Schliessen + Greifer.SetPosition(pos); + wait_ms(80); + } + wait_ms(700); + desiredSpeedLeft =65.0f; //50 RPM + desiredSpeedRight = -60.0f; + + if (Green>Red) { + for (int pos = 2300; pos > 440; pos -= 25) { //Arm heben + Arm.SetPosition(pos); + wait_ms(5); + } + for (int pos = 800; pos < 1400; pos += 25) { //Greifer öffnen + Greifer.SetPosition(pos); + wait_ms(2); + } + } else if(Red>Green) { + for (int pos = 1300; pos < 2250; pos += 25) { //Deckel schliessen + Deckel.SetPosition(pos); + wait_ms(2); + } + for (int pos = 2300; pos > 440; pos -= 25) { //Arm heben + Arm.SetPosition(pos); + wait_ms(7); + } + wait_ms(50); + for (int pos = 800; pos < 1400; pos += 25) { //Greifer öffnen + Greifer.SetPosition(pos); + wait_ms(2); + } + for (int pos = 440; pos < 700; pos += 25) { //Arm Runter + Arm.SetPosition(pos); + wait_ms(5); + } + for (int pos = 2250; pos > 1300; pos -= 25) { //Deckel öffnen + Deckel.SetPosition(pos); + wait_ms(5); + } + for (int pos = 700; pos > 440; pos -= 25) { //Arm heben + Arm.SetPosition(pos); + wait_ms(5); + } + } + enableSensor=1; +} + +//--------------------Status&Main----------------------------------------------- + enum RobotState { START = 0, + FAHREN, + AUSWEICHEN, VORSUCHEN, SUCHEN, - LADEN, - SONST - + DREHUNGBACK, + ANFAHREN, + LADEN }; @@ -158,8 +337,8 @@ speedRightFilter.setPeriod(PERIOD); speedRightFilter.setFrequency(LOWPASS_FILTER_FREQUENCY); - desiredSpeedLeft = 0.0f; - desiredSpeedRight = 0.0f; + desiredSpeedLeft = 0.0f; //Initialisiere Geschwindigkeit auf 0 + desiredSpeedRight = 0.0f; //Initialisiere Geschwindigkeit auf 0 actualSpeedLeft = 0.0f; actualSpeedRight = 0.0f; @@ -170,9 +349,9 @@ //SensorArrays int z = 0; //Zähler + int y = 0; float sensorLinks[100]; float sensorOben[100]; - float sensorRechts[100]; enableMotorDriver = 1; @@ -187,43 +366,45 @@ status = START; int timer = 0; - my_led = 0; + led = 0; while(1) { - //lese sensorwerte, tiefpass initialisierung + //Lese Sensorwerte, Tiefpass Initialisierung sensorWerte(); - ++timer; + timer++; wait(0.025f); -//DISPLAY STATE - - //while(status == 1){ switch(status) { - //start sequenz - case START: - // desiredSpeedLeft = 15.0f; //Drehung - // desiredSpeedRight = 15.0f; - - //roboter dreh links + case START: //Start Sequenz if( timer > 40 ) - status = 1; + status = FAHREN; break; - case VORSUCHEN: { - my_led = 1; + case FAHREN: + if(geradeaus_schnell(40)){ + status = VORSUCHEN; + } + status = AUSWEICHEN; + break; + + case AUSWEICHEN: + if(ausweichen()) status = FAHREN; //Wenn fertig ausgewichen -> FAHREN + break; + + case VORSUCHEN: + led = 1; desiredSpeedLeft = 15.0f; //Drehung desiredSpeedRight = 15.0f; if(z<12) { //Schreibt die Sensorwerte in ein Array sensorOben[z] = sensorZentimeter[0]; sensorLinks[z] = sensorZentimeter[5]; - sensorRechts[z] = sensorZentimeter[1]; z++; } else status = SUCHEN; break; - } - case SUCHEN: { - my_led = 1; + + case SUCHEN: + led = 1; //for(int i = 0; i < 10; i++) desiredSpeedLeft = 15.0f; //Drehung @@ -232,37 +413,46 @@ if(z < 100) { sensorOben[z] = sensorZentimeter[0]; sensorLinks[z] = sensorZentimeter[5]; - sensorRechts[z] = sensorZentimeter[1]; //Prüft Ausschlag && vergleicht ersten mit letztem Wert && prüft Zwischenwerte if(3.0f * sensorLinks[z] > sensorLinks[z-7] + sensorLinks[z-6] + sensorLinks[z-5] + 13.5f && sensorLinks[z] + 1 > sensorLinks[z-12] && sensorLinks[z] >= sensorLinks[z-2] && sensorLinks[z] >= sensorLinks[z-3] && sensorLinks[z] >= sensorLinks[z-4] && sensorLinks[z-12] >= sensorLinks[z-10] && sensorLinks[z-12] >= sensorLinks[z-9] && sensorLinks[z-12] >= sensorLinks[z-8]) { //Prüft Hindernis - if(sensorLinks[z-5] + 3.5f < sensorOben[z-5] && sensorLinks[z-6] + 3.5f < sensorOben[z-6] && sensorLinks[z-7] + 3.5f < sensorOben[z-7]){ - status = 3; - z=0; + if(sensorLinks[z-5] + 3.5f < sensorOben[z-5] && sensorLinks[z-6] + 3.5f < sensorOben[z-6] && sensorLinks[z-7] + 3.5f < sensorOben[z-7]) { + status = DREHUNGBACK; + z--; } } z++; - } - else{ + } else { z = 0; - status = 4; + status = FAHREN; } - break; - } - case 3: - desiredSpeedLeft = -20.0f; //Stillstand - desiredSpeedRight = 15.0f; - wait(2.0f); - status = VORSUCHEN; + case DREHUNGBACK: + if(y < 15) { + desiredSpeedLeft = -15.0f; //Drehung rückwärts + desiredSpeedRight = -15.0f; + y++; + /* } else if {y < 30){ + desiredSpeedLeft = 0.0f; //Stillstand für genauen Sensorwert + desiredSpeedRight = 0.0f; + y++; + */ + } else { + y = 0; + status = ANFAHREN; + } break; - case 4: - desiredSpeedLeft = 15.0f; //Stillstand - desiredSpeedRight = -20.0f; - wait(2.0f); - status = VORSUCHEN; + case ANFAHREN: + if(geradeaus_langsam(sensorLinks[z-6]-10-15)) { //-10cm Sensortoleranz, -15cm Roboterarm-Offset + z = 0; + status = LADEN; + } + break; + + case LADEN: + aufheben(); break; }