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.
Dependencies: EPOS2 mbed-rtos mbed
Fork of MarsRover_ExoMars by
Diff: main.cpp
- Revision:
- 13:cc43e546f310
- Parent:
- 12:9e90d7a5a8c6
- Child:
- 14:bee23de5dff0
--- a/main.cpp Tue Oct 18 14:16:09 2016 +0000
+++ b/main.cpp Wed Oct 19 10:02:02 2016 +0000
@@ -9,24 +9,7 @@
Serial pc(USBTX, USBRX); // (tx, rx)
CAN can(p9, p10); // Can Pin def
-/*
-int velocity = 3000;
-int acceleration = 50000;
-int deceleration = 50000;
-int anzahl_zyklen = 1000000;
-int absolvierte_zyklen = 0;
-int ActualPos = 0;
-int DemandPos = 0;
-int ActualCurrent = 0;
-int DemandCurrent = 0;
-int counter=0;
-int counter2=0;
-bool start = true;
-
-int counter_s = false;
-int counter_s2 = false;
-*/
DigitalIn usv_ready(p23);
InterruptIn buffering(p24);
DigitalIn replace_battery(p25);
@@ -36,6 +19,9 @@
DigitalOut led3(LED3);
DigitalOut led4(LED4);
+bool epos1_homing = false;
+bool epos3_homing = false;
+
bool node1_homed = false;
bool node2_homed = false;
bool node3_homed = false;
@@ -47,18 +33,23 @@
bool Power_ein = true;
bool node5_grundposition = false;
-int homing = false;
-int ready = false;
-int ausfahren = false;
-int einfahren = false;
-int usv = false;
+bool ausfahren = false;
+bool einfahren = false;
+bool usv = false;
int current_step = 1; //HOMING
int ausfahren_step = 1;
int einfahren_step = 1;
int usv_step = 1;
-int ErrorState;
+int ErrorState1;
+int ErrorState2;
+int ErrorState3;
+int ErrorState4;
+int ErrorState5;
+int ErrorState6;
+int ErrorState7;
+float speed = 1.2;
-void interrupt_usv(){
+void interrupt_usv(){ //Funktion, wird aufgeruffen durch den interrupt des USV's
current_step = 5;
wait_ms(10);
}
@@ -109,64 +100,30 @@
led3 = 0;
led4 = 0;
MyEpos5.SetDigOut(4, 1);
-
-/* usv_ready.mode(PullUp);
- buffering.mode(PullUp);
- replace_battery.mode(PullUp);
-*/
- //************** Initialisierung **************//
-
- /* HOMING METHODEN:
- Homing Method 7 :Home Switch Positive Speed & Index
- Homing Method 11:Home Switch Negative Speed & Index
- Homing Method 23: Home Switch Positive Speed
- Homing Method 27: Home Switch Negative Speed
- Homing Method -3: Current Threshold Positive Speed
- Homing Method -4: Current Threshold Negative Speed
-
- */
- //Motortype 10: EC-Motor
-
-/* MyEpos1.SetPar(10,4430, 7, 3500, 38); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos1.SetHomingPar(-4, 100, 100, 1000); //Set Homing Parameter (homing mode, speed, acceleration, offset) #EINGESTELLT
- MyEpos1.Reset();
-
- MyEpos2.SetPar(10,4430, 7, 3500, 38); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos2.SetHomingPar(27, 100, 100, 0); //Set Homing Parameter (homing mode, speed, acceleration, offset)
- MyEpos2.Reset();
-
- MyEpos3.SetPar(10,4430, 7, 3500, 38); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos3.SetHomingPar(-3, 100, 100, 1000); //Set Homing Parameter (homing mode, speed, acceleration, offset) #EINGESTELLT
- MyEpos3.Reset();
-
- MyEpos4.SetPar(10,4430, 7, 3500, 38); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos4.SetHomingPar(23, 100, 100, 8000); //Set Homing Parameter (homing mode, speed, acceleration, offset)#EINGESTELLT
- MyEpos4.Reset();
-
- MyEpos5.SetPar(10,4430, 7, 3500, 38); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos5.SetHomingPar(23, 100, 100, 0); //Set Homing Parameter (homing mode, speed, acceleration, offset)#EINGESTELLT
- MyEpos5.Reset();
-
- MyEpos6.SetPar(10,3440, 1, 12000, 3.8); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)#EINGESTELLT
- MyEpos6.SetHomingPar(11, 100, 100, -7000); //Set Homing Parameter (homing mode->35=Actual Position, speed, acceleration, offset)#EINGESTELLT
- MyEpos6.Reset();
-
- MyEpos7.SetPar(10,2660, 1, 3100, 2.76); //Set the motor parameter( Motortype, Current limit, Pole pairs, max velocity, thermal time constant winding)
- MyEpos7.SetHomingPar(23, 100, 100, 0); //Set Homing Parameter (homing mode, speed, acceleration, offset)
- MyEpos7.Reset();
-*/
-
+
while(1){
if(MyEpos1.GetError() != 0 or MyEpos2.GetError() != 0 or MyEpos3.GetError() != 0 or MyEpos4.GetError() != 0 or MyEpos5.GetError() != 0 /*or MyEpos6.GetError() != 0 or MyEpos7.GetError() != 0*/){
current_step = 7; //FEHLER
- ErrorState = MyEpos5.GetError();
+ ErrorState1 = MyEpos1.GetError();
+ ErrorState2 = MyEpos2.GetError();
+ ErrorState3 = MyEpos3.GetError();
+ ErrorState4 = MyEpos4.GetError();
+ ErrorState5 = MyEpos5.GetError();
wait(0.1);
- pc.printf("ErrorState: %d\r\n", ErrorState);
+ pc.printf("ErrorState Panels/Kopf: Panel Aussen Linkss=%d, Panel Innen Links=%d, Panel Aussen Rechts=%d, Panel Innen Rechts=%d, Kopf=%d\r\n", ErrorState1, ErrorState2, ErrorState3, ErrorState4, ErrorState5);
}
- switch (current_step){
+/* if(MyEpos6.GetError() != 0 or MyEpos7.GetError() != 0){
+ current_step = 76; //FEHLER
+ ErrorState6 = MyEpos6.GetError();
+ ErrorState7 = MyEpos7.GetError();
+ wait(0.1);
+ pc.printf("Bohrgestell/Bohrer ErrorState: Bohrgestell=%d, Bohrer=%d\r\n", ErrorState6, ErrorState7);
+ }
+
+*/ switch (current_step){
case 1://HOMING:
led1 = 1;
@@ -191,6 +148,9 @@
MyEpos5.MoveAbsolute(-60000,800,100,100); //Kopf
pc.printf("Fahren auf -60000\n");
while(MyEpos5.TargetReached()!=1){
+ if(MyEpos5.GetError() == 1){
+ break;
+ }
}
pc.printf("Target reached\n");
node5_homed = true;
@@ -198,17 +158,38 @@
}
if (node1_homed == false){
- pc.printf("Homing1\n");
- MyEpos1.Homing(); //Solarpanel_Aussen_Links
- node1_homed = true;
+ if(epos1_homing == false){
+ MyEpos1.MoveVelocity(-400, 100, 100); //Fährt auf Endschalter vor Beginn mit Stromhoming
+ epos1_homing = true;
+ }
+/* if(MyEpos1.GetError() != 0){
+ current_step = 7;
+ break;
+ }
+*/ if(MyEpos1.GetDigIn(4) == 1){
+ pc.printf("Homing1\n");
+ MyEpos1.Homing(); //Solarpanel_Aussen_Links
+ node1_homed = true;
+ break;
+ }
break;
}
if (node3_homed == false){
- pc.printf("Homing3\n");
- MyEpos3.Homing(); //Solarpanel_Aussen_Rechts
- node3_homed = true;
+ if (epos3_homing == false){
+ MyEpos3.MoveVelocity(400, 100, 100); //Fährt auf Endschalter vor Beginn mit Stromhoming
+ epos3_homing = true;
+ }
+/* if(MyEpos3.GetError() != 0){
+ current_step = 7;
+ break;
+ }
+*/ if(MyEpos3.GetDigIn(4) == 1){
+ pc.printf("Homing3\n");
+ MyEpos3.Homing(); //Solarpanel_Aussen_Rechts
+ node3_homed = true;
+ }
break;
}
@@ -220,7 +201,10 @@
break;
}
- if (node1_homed == true and node2_homed == false){
+ if (node1_homed == true and node2_homed == false){
+ if (node5_grundposition == false){
+ MyEpos5.MoveAbsolute(-60000,800,100,100); //Kopf
+ }
pc.printf("Homing2\n");
MyEpos2.Homing(); //Solarpanel_Innen_Links
node2_homed = true;
@@ -244,10 +228,13 @@
break;
}
- if (node2_homed==1 and node4_homed==1 and node5_grundposition == false){
- MyEpos5.MoveAbsolute(0,800,100,100); //Kopf
+ if (node2_homed == true and node4_homed == true and node5_grundposition == false){
+ MyEpos5.MoveAbsolute(500,800*speed,100,100); //Kopf
wait(0.1);
while(MyEpos5.TargetReached() != 1){
+ if(MyEpos5.GetError() == 1){
+ break;
+ }
wait(0.1);
}
node5_grundposition = true;
@@ -256,8 +243,8 @@
if (node1_homed == true and node2_homed == true and node3_homed == true and node4_homed == true and node5_homed == true and node6_homed == true and node7_homed == true){
pc.printf("Homing beendet\n");
- node5_grundposition == false;
- Power_ein == true;
+ node5_grundposition = false;
+ Power_ein = true;
MyEpos1.Power(0);
MyEpos2.Power(0);
MyEpos3.Power(0);
@@ -266,9 +253,6 @@
MyEpos5.Power(0);
current_step = 2;//BEREIT;
}
-
-
-
led1 = 0;
@@ -288,138 +272,21 @@
MyEpos4.Power(1);
MyEpos5.Power(1);
einfahren = false;
- current_step = 6;
+ ausfahren_step = 1;
+ current_step = 3;
wait(0.5);
}
wait_ms(10);
led2 = 0;
break;
-
-
- case 3://START_AUSFAHREN:
-
- break;
-
-
- case 5://USV:
- pc.printf("USV\n");
- led4 = 1;
- MyEpos5.SetDigOut(4,1);
- switch (usv_step){
- case 1:
-// wait(0.1);
-// if (node1_homed == true){
-// MyEpos1.MoveAbsolute(0,500,500,500); //Panel_Aussen_Links
- MyEpos1.MoveAbsolute(2000,500,500,500); //Panel_Aussen_Links
-// wait(0.1);
-// }
-// if (node3_homed == true){
-// MyEpos3.MoveAbsolute(0,500,500,500); //Panel_Aussen_Rechts
- MyEpos3.MoveAbsolute(-2000,500,500,500); //Panel_Aussen_Rechts
- wait(0.1);
-// }
-/* if (node7_homed == true){
- MyEpos7.MoveAbsolute(0,500,500,500); // Bohrer
- wait(0.1);
- }
- */// wait(0.1);
-// usv_step = 2;
- if (MyEpos1.TargetReached()==1 and MyEpos3.TargetReached()==1){
- usv_step = 2;
- wait(0.1);
- }
- break;
-
- case 2:
-// if (MyEpos1.TargetReached()==1){
-// wait(1);
- MyEpos1.MoveAbsolute(0,500,100,100); //Panel Aussen Links
- MyEpos2.MoveAbsolute(0,500,500,500); //Panel_Innen_Links
-// wait_ms(10);
-// }
-// if (MyEpos3.TargetReached()==1){
-// wait(1);
- MyEpos3.MoveAbsolute(0,500,100,100); //Panel Aussen Links
- MyEpos4.MoveAbsolute(0,500,500,500); //Panel_Innen_Links
-// wait_ms(10);
-// }
-// wait(0.1);
-/* if (node4_homed == true and MyEpos3.TargetReached()==1){
- wait(1);
- MyEpos4.MoveAbsolute(0,500,500,500); //Panel_Innen_Links
- wait_ms(10);
- }
- if (node6_homed == true and MyEpos7.TargetReached()==1){
- wait(1);
- MyEpos6.MoveAbsolute(0,500,500,500); // Bohrer
- wait_ms(10);
- }
-*/ wait(0.1);
- if (MyEpos2.TargetReached()==1 and MyEpos4.TargetReached()==1 /*and MyEpos6.TargetReached()==1*/){
- usv_step = 3;
- wait(0.1);
- }
- break;
-
- case 3:
- MyEpos5.MoveAbsolute(0,800,500,500); //Kopf
- wait(0.1);
- if (MyEpos5.TargetReached()==1){
- usv_step = 4;
- wait(0.1);
- }
- break;
-
- case 4:
- /*while (MyEpos5.TargetReached()==0){
- wait_ms(10);
- }*/
-/* MyEpos1.Power(0);
- MyEpos2.Power(0);
- MyEpos3.Power(0);
- MyEpos4.Power(0);
- MyEpos5.Power(0);
- MyEpos6.Power(0);
- MyEpos7.Power(0);
- usv_step = 5;
-*/ MyEpos1.Power(0);
- MyEpos2.Power(0);
- MyEpos3.Power(0);
- MyEpos4.Power(0);
- MyEpos5.Power(0);
- MyEpos6.Power(0);
- MyEpos7.Power(0);
- usv_step = 5;
- wait(0.1);
- break;
-
- case 5:
- if(buffering == 1){
- led3 = 1;
- } else {
- led3 = 0;
- current_step=1;
- usv_step=1;
- ausfahren_step=1;
- einfahren_step=1;
- }
- /*if (buffering == 0){
- current_step = 1;
- usv_step = 1;
- }*/
- wait(1);
- break;
- }
- led4 = 0;
- break;
-
- case 6://Test
+
+ case 3://ABLAUF
// pc.printf("Läuft...\n");
led3 = 1;
if (einfahren == false){
switch (ausfahren_step){
case 1:
- MyEpos5.MoveAbsolute(-150000,800,100,100); //Kopf
+ MyEpos5.MoveAbsolute(-150000,800*speed,100*speed,100*speed); //Kopf
ausfahren_step = 2;
wait(1);
break;
@@ -428,17 +295,17 @@
if (MyEpos5.TargetReached()==1){
MyEpos1.MoveAbsolute(0,500,100,100); //Panel Aussen Links
MyEpos3.MoveAbsolute(0,500,100,100); //Panel Aussen Rechts
- MyEpos2.MoveAbsolute(310000,500,100,100); //Panel Innen Links
- MyEpos4.MoveAbsolute(-310000,500,100,100); //Panel Innen Rechts
+ MyEpos2.MoveAbsolute(310000,500*speed,100*speed,100*speed); //Panel Innen Links
+ MyEpos4.MoveAbsolute(-310000,500*speed,100*speed,100*speed); //Panel Innen Rechts
ausfahren_step = 3;
wait(1);
}
break;
case 3:
- if (MyEpos2.TargetReached()==1 and MyEpos4.TargetReached()==1){
- MyEpos1.MoveAbsolute(318000,500,100,100); //Panel Aussen Links
- MyEpos3.MoveAbsolute(-318000,500,100,100); //Panel Aussen Rechts
+ if (MyEpos2.GetActualPos() > 280000 and MyEpos4.GetActualPos() < -280000){
+ MyEpos1.MoveAbsolute(318000,500*speed,100*speed,100*speed); //Panel Aussen Links
+ MyEpos3.MoveAbsolute(-318000,500*speed,100*speed,100*speed); //Panel Aussen Rechts
ausfahren_step = 4;
wait(1);
@@ -452,6 +319,8 @@
wait(1);
}
break;
+
+
}//switch (ausfahren_step)
}//if (einfahren == false)
@@ -460,21 +329,18 @@
ausfahren_step = 1;
switch (einfahren_step){
case 1:
-/* MyEpos1.MoveAbsolute(1000,500,100,100); //Panel Aussen Links
- MyEpos3.MoveAbsolute(-1000,500,100,100); //Panel Aussen Rechts
-*/ MyEpos1.MoveAbsolute(2000,500,100,100); //Panel Aussen Links
- MyEpos3.MoveAbsolute(-2000,500,100,100); //Panel Aussen Rechts
+ MyEpos1.MoveAbsolute(4000,500*speed,100*speed,100*speed); //Panel Aussen Links
+ MyEpos3.MoveAbsolute(-4000,500*speed,100*speed,100*speed); //Panel Aussen Rechts
einfahren_step = 2;
wait(0.1);
break;
case 2:
- if (MyEpos1.TargetReached()==1 and MyEpos3.TargetReached()==1){
-// wait(0.1);
+ if (MyEpos1.GetActualPos() < 20000 and MyEpos3.GetActualPos() > -20000){
MyEpos1.MoveAbsolute(0,500,100,100); //Panel Aussen Links
MyEpos3.MoveAbsolute(0,500,100,100); //Panel Aussen Rechts
- MyEpos2.MoveAbsolute(0,500,100,100); //Panel Innen Links
- MyEpos4.MoveAbsolute(0,500,100,100); //Panel Innen Rechts
+ MyEpos2.MoveAbsolute(0,500*speed,100*speed,100*speed); //Panel Innen Links
+ MyEpos4.MoveAbsolute(0,500*speed,100*speed,100*speed); //Panel Innen Rechts
einfahren_step = 3;
wait(0.1);
}
@@ -482,8 +348,7 @@
case 3:
if (MyEpos2.TargetReached()==1 and MyEpos4.TargetReached()==1){
- MyEpos5.MoveAbsolute(0,500,100,100); //Kopf
-// wait(1);
+ MyEpos5.MoveAbsolute(1000,500*speed,100*speed,100*speed); //Kopf
MyEpos1.Power(0);
MyEpos2.Power(0);
MyEpos3.Power(0);
@@ -505,11 +370,104 @@
}//switch(einfahren_step)
}//if einfahren == true)
led3 = 0;
+ break;
+
+ case 5://USV:
+ pc.printf("USV\n");
+ led4 = 1;
+ MyEpos5.SetDigOut(4,1);
+ switch (usv_step){
+ case 0:
+ MyEpos1.Power(1);
+ MyEpos2.Power(1);
+ MyEpos3.Power(1);
+ MyEpos4.Power(1);
+ MyEpos5.Power(1);
+ MyEpos6.Power(1);
+ MyEpos7.Power(1);
+ usv_step = 1;
+ break;
+
+ case 1:
+ MyEpos1.MoveAbsolute(2000,500,500,500); //Panel_Aussen_Links
+ MyEpos3.MoveAbsolute(-2000,500,500,500); //Panel_Aussen_Rechts
+ wait(0.1);
+
+ if (MyEpos1.TargetReached()==1 and MyEpos3.TargetReached()==1){
+ usv_step = 2;
+ wait(0.1);
+ }
+ break;
+
+ case 2:
+
+ MyEpos1.MoveAbsolute(0,500,100,100); //Panel Aussen Links
+ MyEpos3.MoveAbsolute(0,500,100,100); //Panel Aussen Links
+
+ MyEpos2.MoveAbsolute(0,500,500,500); //Panel_Innen_Links
+ MyEpos4.MoveAbsolute(0,500,500,500); //Panel_Innen_Links
+ wait(0.1);
+
+ if (MyEpos2.TargetReached()==1 and MyEpos4.TargetReached()==1 /*and MyEpos6.TargetReached()==1*/){
+ usv_step = 3;
+ wait(0.1);
+ }
+ break;
+
+ case 3:
+ MyEpos5.MoveAbsolute(0,800,500,500); //Kopf
+ wait(0.1);
+ if (MyEpos5.TargetReached()==1){
+ usv_step = 4;
+ wait(0.1);
+ }
+ break;
+
+ case 4:
+ MyEpos1.Power(0);
+ MyEpos2.Power(0);
+ MyEpos3.Power(0);
+ MyEpos4.Power(0);
+ MyEpos5.Power(0);
+ MyEpos6.Power(0);
+ MyEpos7.Power(0);
+ usv_step = 5;
+ wait(0.1);
+ break;
+
+ case 5:
+ if(buffering == 1){
+ led3 = 1;
+ } else {
+ led3 = 0;
+ Power_ein = true;
+ current_step=1;
+ usv_step=0;
+ ausfahren_step=1;
+ einfahren_step=1;
+ }
+ wait(1);
+ break;
+ }//switch(usv_step)
+ led4 = 0;
+ break;
+
+ case 6:
+ pc.printf("Fehler RESET Bohrer\n");
+ MyEpos5.MoveVelocity(0, 500, 500);
+ MyEpos6.MoveVelocity(0, 500, 500);
+ wait(3);
+ MyEpos5.Reset();
+ MyEpos5.Power(1);
+ MyEpos6.Reset();
+ MyEpos6.Power(1);
+ //node1_homed = false;
+ //node2_homed = false;
+ current_step = 3;
break;
case 7:
- pc.printf("Fehler RESET\n");
-// if(MyEpos5.GetDigIn(3) == 1){
+ pc.printf("Fehler RESET\n");
MyEpos1.MoveVelocity(0, 500, 500);
MyEpos2.MoveVelocity(0, 500, 500);
MyEpos3.MoveVelocity(0, 500, 500);
@@ -526,26 +484,28 @@
MyEpos4.Power(1);
MyEpos5.Reset();
MyEpos5.Power(1);
+ epos1_homing = false;
+ epos3_homing = false;
node1_homed = false;
node2_homed = false;
node3_homed = false;
node4_homed = false;
node5_homed = false;
+ Power_ein = true;
+ if(MyEpos2.GetActualPos() < 100000 or MyEpos4.GetActualPos() > -100000){
+ MyEpos1.MoveAbsolute(0,500,100,100); //Panel Aussen Links
+ MyEpos3.MoveAbsolute(0,500,100,100); //Panel Aussen Rechts
+ MyEpos2.MoveAbsolute(0,500,100,100); //Panel Innen Links
+ MyEpos4.MoveAbsolute(0,500,100,100); //Panel Innen Rechts
+ while (MyEpos2.TargetReached() != 1 or MyEpos4.TargetReached() != 1){
+ if(MyEpos2.GetError() == 1 or MyEpos4.GetError() == 1){
+ break;
+ }
+ }
+ }
current_step = 1;
wait(0.1);
-// }
-
-// MyEpos5.MoveVelocity(0,500,500);
- wait(0.1);
-
-/* MyEpos1.Reset();
- MyEpos2.Reset();
- MyEpos3.Reset();
- MyEpos4.Reset();
- MyEpos5.Reset();
- wait(0.5);
- */
-
+
break;
}//switch (current_step)
}//while
