Hallo
Ich bin mir nicht sicher ob das wirklich "besser" ist:
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
}
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:
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
isMovementComplete() ist immer true, die while-Schleife mit dem Taskaufruf wird nie ausgeführt! Deshalb hält der RP6 nicht an.
Die Lösung: Man überprüft selbst die PWM-Werte der Antriebe. Diese stehen in mleft_power und mright_power:
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;
}
(getestet:)
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;
}
Lesezeichen