Ist das etwa so rübergekommen? Dann tut mir das leid. War nicht so beabsichtigt.
Druckbare Version
Ist das etwa so rübergekommen? Dann tut mir das leid. War nicht so beabsichtigt.
Danke für deine Idee radbruch.
Aber leider funktioniert das so auch nicht. Er fährt immernoch nach den 1,5 Sekunden rückwärts ohne davor anzuhalten.
So vielleicht:
Code:setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
stop();
while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
task_RP6System();
mSleep(1500); //1,5 Sekunden warten
Das kann doch net sein ^^ Das ist doch nun eigentlich nen recht simples Programm oder?
Mit "stop();" da einfügen kommt leider kein unterschied zustande.
Also wirklich erklären kann ich das auch nicht:
(getestet)Code:#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein
int main (void)
{
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
//fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
task_Bumpers();
while(1)
{
if(bumper_left != false) //wenn linker bumper betätigt...
{
setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
//stop();
//powerOFF(); // abwürg
// folgender Code ist aus emergencyShutdown(0);
mleft_power = 0; // aktuelle Power
mright_power = 0;
OCR1AL = 0; // PWM auf null
OCR1BL = 0;
setLEDs(0b011111); //schalte SL6 aus
//while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
//task_RP6System();
mSleep(1500); //1,5 Sekunden warten
//powerON(); // und weiter
setLEDs(0b011011); //schalte SL4 SL5 ein
move(60,BWD,DIST_MM(300),NON_BLOCKING); //fahre 30cm Rückwärts
while(!isMovementComplete()) // Weiterfahren bis Ziel erreicht
task_RP6System();
mSleep(800); //... für 0,8 Sekunden
setLEDs(0b001001); //schalte SL4 ein
rotate(60,RIGHT,180,NON_BLOCKING); //um 180° nach Rechts drehen
while(!isMovementComplete()) // Weiterfahren bis Drehung fertig
task_RP6System();
}
else
{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder, ACS, Bumpers und Motorfunktionen ab
}
return 0;
}
Danke für die Lösung ^^ Warum auch immer die so etwas umständlich sein muss.
Ist doch eigentlich sinnlos es so zu schreiben oder?Code:move(60,BWD,DIST_MM(300),NON_BLOCKING); //fahre 30cm Rückwärts
while(!isMovementComplete()) // Weiterfahren bis Ziel erreicht
task_RP6System();
Da in der RP6-Lib:
Is mir nur gerade so aufgefallen, getestet hab ichs leider nicht.Code:if(blocking)
while(!isMovementComplete())
task_RP6System();
Ja, so ist es sinnlos. So sinnlos wie blockierende Funktionen in der Task-Umgebung des RP6. Sinnvoll wird es erst, wenn alle while-Schleifen entfernt sind und task_RP6System(); nur noch einmalig in der Hauptschleife aufgerufen wird.
Hallo
Ich bin mir nicht sicher ob das wirklich "besser" ist:
Ist ja spannend. Eigentlich dürfte das gar nicht funktionieren. Bei Case default wird der Bumper ausgewertet. Das geschieht aber nur, wenn isMovementComplete() true ist. Offensichtlich wird isMovementComplete() von moveAtSpeed() nicht beeinflußt, deshalb funktioniert auch dies nicht:Code:#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein
int main (void)
{
uint8_t schritt=0; // Ausweichen in drei Schritten
uint16_t pause=0; // Pausezeit in ms
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1)
{
task_RP6System();
if(isMovementComplete())
{
if(pause)
{
mSleep(pause);
pause=0;
}
switch(schritt)
{
case 3: setLEDs(0b111111);
mleft_power = 0; // Stop
mright_power = 0;
OCR1AL = 0;
OCR1BL = 0;
pause=1500; //1,5 Sekunden warten
schritt--;
break;
case 2: setLEDs(0b011011);
move(60,BWD,DIST_MM(300),NON_BLOCKING);// Zurück
pause=800; // 0,8 Sekunden warten
schritt--;
break;
case 1: setLEDs(0b001001);
rotate(60,RIGHT,180,NON_BLOCKING);//um 180° nach Rechts drehen
schritt--;
break;
default: setLEDs(0b000000);
changeDirection(FWD);//Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
if(bumper_left) //wenn linker bumper betätigt...
{
schritt=3; // ... ausweichen
}
break;
} // switch
} // if
} // while
return 0; // wird nie ausgeführt
}
isMovementComplete() ist immer true, die while-Schleife mit dem Taskaufruf wird nie ausgeführt! Deshalb hält der RP6 nicht an.Code:setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
stop();
while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
task_RP6System();
mSleep(1500); //1,5 Sekunden warten
Die Lösung: Man überprüft selbst die PWM-Werte der Antriebe. Diese stehen in mleft_power und mright_power:
(getestet:)Code:#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein
int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
moveAtSpeed(0,0); //Stop
while(mleft_power || mright_power) task_RP6System();
mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}
Gruß
mic
[Edit]
Noch einfacher ist es wohl so:
Code:#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein
int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
move(0,FWD,0,BLOCKING); //Stop
mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}