Code:
//Erste eigene Tour, die vom PC zum Schlafzimmer und zurück führt.
//Mit Einsatz von ACS und Bumpern.
//Bumper nur als Sicherung, falls Hinderniss vom ACS nicht erkannt wird.
#include "RP6RobotBaseLib.h"
#define status_fahren 0 // Vorwärtsfahrt mit Überprüfung der Bumper
#define status_angestossen_links 1
#define status_angestossen_rechts 2
#define status_angestossen_beide 3
#define status_ACS_links 4
#define status_ACS_rechts 5
#define status_ACS_beide 6
uint8_t move_state;
uint8_t tour;
int main(void)
{
initRobotBase(); //Microcontroller an.
setLEDs(0b111111); //LEDs fangen alle an zu leuchten.
mSleep(2500); //Er wartet 2500 Zeiteinheiten. --> Was ist eine Zeiteinheit in Sekunden?
powerON(); //Ab jetzt ist der Roboter an und die Gefahr eines Unfalls besteht.
setACSPwrLow(); //Geringes ACS aktiviert.
move_state=status_fahren; //Startstatus setzen.
tour=1; //Tour beginnt bei Schritt1.
while(true) //Endlos bis der Akku leer ist.
{
if(move_state==status_fahren) switch(tour) //Wenn kein Ausweichen aktiv. Was bedeutet das? -->Ausweichfunktion?
{
case 1: setLEDs(0b110110); move(100, FWD, DIST_MM(4000), false);
break;
case 2: setLEDs(0b000111); rotate(100, RIGHT, 90, false);
break;
case 3: setLEDs(0b110110); move(100, FWD, DIST_MM(2000), false);
break;
case 4: setLEDs(0b111000); rotate(100,LEFT,90, false);
break;
case 5: setLEDs(0b110110); move(100, FWD, DIST_MM(1000), false);
break;
case 6: setLEDs(0b101010); rotate(100, LEFT, 360, false);
break;
case 7: setLEDs(0b010101); rotate(100, RIGHT,360, false);
break;
case 8: while(1) //Ende der Tour mit Blinken.
{setLEDs(0b001001); mSleep(200); setLEDs(0b010010); mSleep(200); setLEDs(0b100100); //Beide "Lichterzeilen" blinken auf und ab.
setLEDs(0b001001); mSleep(200); setLEDs(0b010010); mSleep(200); setLEDs(0b100100);}
break;
}
switch(move_state) //Fahren bis Etappenziel oder ausweichen, wenn ACS oder Bumper anschlägt.
{
case status_fahren:
do
{
task_ACS();
task_Bumpers();
task_motionControl();
if(bumper_left && bumper_right) move_state=status_angestossen_beide; //Wenn beide Bumper, dann mach "status_angstossen_beide".
else if(bumper_left) move_state=status_angestossen_links; //Dasselbe mit links.
else if(bumper_right) move_state=status_angestossen_rechts;//Dasselbe mit rechts.
if(obstacle_left && obstacle_right) move_state=status_ACS_beide; //Dasselbe wie oben, nur mit dem ACS.
else if(obstacle_left) move_state=status_ACS_links;
else if(obstacle_right) move_state=status_ACS_rechts;
}while((move_state==status_fahren) && !isMovementComplete());
if(move_state==status_fahren)
{
tour++;
//Neustart der Tour. Bei 10 ist Ende.
}
else
{
setLEDs(0b111111);
move(150,100,BWD,1); //Mit Rampen bremsen und 100 zurückfahren.
}
break;
//Die einzelnen Möglichkeiten:
case status_angestossen_links:
setLEDs(0b101101);
rotate(150,RIGHT,90,1);
move_state=status_fahren;
break;
case status_angestossen_rechts:
setLEDs(0b101101);
rotate(150,LEFT,90,1);
move_state=status_fahren;
break;
case status_angestossen_beide:
setLEDs(0b101101);
rotate(150,LEFT,180,1);
move_state=status_fahren;
break;
case status_ACS_links:
setLEDs(0b101101);
rotate(150,RIGHT,90,1);
move_state=status_fahren;
break;
case status_ACS_rechts:
setLEDs(0b101101);
rotate(150,LEFT,90,1);
move_state=status_fahren;
break;
case status_ACS_beide:
setLEDs(0b101101);
rotate(150,RIGHT,180,1);
break;
}
}
return 0;
}
Der Roboter fährt die Strecke und versucht auszuweichen, sobald ein Hinderniss auftaucht. Aber grade hier gibt es Probleme. Der Roboter erkennt zwar alles richtig und kann auch ziemlich richtig agieren. Jedoch verfranst er sich dann an dieser Stelle des Programms. Wenn z.B. eine Wand als Hinderniss kommt (weil ich den Roboter am Start ein wenig falsch abgestellt habe
Lesezeichen