Hallo
Keine Erfahrung hat nichts mit "doof" zu tun. Ich bin auch nicht so das Programmierass:
Code:
// Einfaches Fahrprogramm mit Überprüfung der Bumper 12.10.09 mic
// Wegen der Belastung durch den Aufprall ist die Verwendung
// des ACS natürlich besser!
#include "RP6RobotBaseLib.h"
#define test 1 // 0 bedeutet Simulation ohne Motorenansteuerung
#define status_start 0
#define status_fahren 1 // Vorwärtsfahrt mit Überprüfung der Bumpers
#define status_angestossen_links 2
#define status_angestossen_rechts 3
#define status_angestossen_beide 4
uint8_t move_state; // Speicher für die aktuelle Fahrsituation
int main(void)
{
initRobotBase(); // Sollte man immer machen!
setLEDs(0b111111);
mSleep(500);
if(test) powerON(); // Ab jetzt könnte der RP6 losfahren und sich verletzen!
move_state=status_start; // Startstatus setzen
while(true) // Endlos bis Akkus leer
{
switch(move_state)
{
case status_start:
setLEDs(0b011011);
setMotorDir(FWD, FWD);
if(test) moveAtSpeed(150,150);
move_state=status_fahren;
break;
case status_fahren:
setLEDs(0b001001);
do
{
task_Bumpers();
task_motionControl();
if(bumper_left && bumper_right) move_state=status_angestossen_beide;
else if(bumper_left) move_state=status_angestossen_links;
else if(bumper_right) move_state=status_angestossen_rechts;
}while(move_state==status_fahren);
setLEDs(0);
if(test) move(150,100,BWD,1); // Geregelt bremsen und 100 zurückfahren
else mSleep(500); // Simmulation
break;
case status_angestossen_links:
setLEDs(0b010000);
if(test) rotate(150,RIGHT,90,1); // Geregelt drehen
else mSleep(2000);
move_state=status_start;
break;
case status_angestossen_rechts:
setLEDs(0b000010);
if(test) rotate(150,LEFT,90,1);
else mSleep(2000);
move_state=status_start;
break;
case status_angestossen_beide:
setLEDs(0b010010);
if(test) rotate(150,LEFT,180,1);
else mSleep(2000);
move_state=status_start;
break;
}
}
return 0;
}
Ach, jetzt habe das mit der Tour völlig vergessen. Das dauert noch etwas...
Gruß
mic
[Edit]
Jetzt mit Tour, allerdings ist das Ausweichmanöver eher sinnfrei:
Code:
// Besseres Fahrprogramm mit Überprüfung der Bumper 12.10.09 mic
// Wegen der Belastung durch den Aufprall ist die Verwendung des ACS
// natürlich besser!
// Die jetzt nichtblockiernden Fahrfunktionen müssen "von Hand" mit der
// task_motionControl()-Funktion solange angestossen werden bis isMovementComplete()
// das Erreichen des Etappenziels signalisiert. Dann wird die Tour weitergeschaltet.
// Sollte während der Fahrt ein Bumper betätigt werden, weicht der RP6 aus.
// Danach setzt setzt er die Fahrt mit dem aktellen Etappenziel fort.
// Allerdings kann ich das alles im Moment nicht testen und weiß deshalb nicht,
// wie die Tour überhaupt aussieht und wohin er sinnvollerweise ausweichen sollte ;)
#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
uint8_t move_state; // Speicher für die aktuelle Fahrsituation
uint8_t tour; // Einzelschritte der Tour
int main(void)
{
initRobotBase(); // Sollte man immer machen!
setLEDs(0b111111);
mSleep(2500);
powerON(); // Ab jetzt könnte der RP6 losfahren und sich verletzen!
move_state=status_fahren; // Startstatus setzen
tour=1; // die Tour beginnt bei Schritt 1
while(true) // Endlos bis Akkus leer
{
if(move_state==status_fahren) switch(tour) // nur wenn kein Ausweichen aktiv
{
case 1: setLEDs(0b110110); move(75, FWD, DIST_MM(900), false);
break;
case 2: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 3: setLEDs(0b110110); move(75, FWD, DIST_MM(500), false);
break;
case 4: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 5: setLEDs(0b110110); move(75, FWD, DIST_MM(1400), false);
break;
case 6: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 7: setLEDs(0b110110); move(75, FWD, DIST_MM(1300), false);
break;
case 8: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 9: setLEDs(0b110110); move(75, FWD, DIST_MM(1000), false); //MITTE!
break;
case 10: setLEDs(0b111111); rotate(50, RIGHT, 360, false);
break;
case 11: setLEDs(0b111011); move(75, BWD, DIST_MM(1000), false);
break;
case 12: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 13: setLEDs(0b011011); move(75, BWD, DIST_MM(1300), false);
break;
case 14: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 15: setLEDs(0b011011); move(75, BWD, DIST_MM(1400), false);
break;
case 16: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 17: setLEDs(0b011011); move(75, BWD, DIST_MM(500), false);
break;
case 18: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 19: setLEDs(0b011011); move(75, BWD, DIST_MM(900), false);
break;
case 20: while(1) // Ende der Tour mit blinken
{setLEDs(0b111000); mSleep(200); setLEDs(0b000111); mSleep(200);}
break;
}
switch(move_state) // Fahren bis Etappenziel oder Ausweichen bei Bumper
{
case status_fahren:
do
{
task_Bumpers();
task_motionControl();
if(bumper_left && bumper_right) move_state=status_angestossen_beide;
else if(bumper_left) move_state=status_angestossen_links;
else if(bumper_right) move_state=status_angestossen_rechts;
}while((move_state==status_fahren) && !isMovementComplete());
if(move_state==status_fahren)
{
tour++; // Etappenziel erreicht, weiterschalten zu nächstem Ziel
// if(tour>19) tour=1 // Neustart der Tour (bei 20 ist Ende!)
}
else // oder bremsen weil ein Bumper betätigt ist
{
setLEDs(0);
move(150,100,BWD,1); // mit Rampen bremsen und 100 zurückfahren
}
break;
case status_angestossen_links:
setLEDs(0b010000);
rotate(150,RIGHT,90,1); // mit Rampen blockierend drehen
move_state=status_fahren;
break;
case status_angestossen_rechts:
setLEDs(0b000010);
rotate(150,LEFT,90,1); // mit Rampen blockierend drehen
move_state=status_fahren;
break;
case status_angestossen_beide:
setLEDs(0b010010);
rotate(150,LEFT,180,1); // mit Rampen blockierend wenden
move_state=status_fahren;
break;
}
}
return 0;
}
[Edit2]
Mit ACS-Vorbereitung:
Code:
// Gutes Fahrprogramm mit Überprüfung der Bumper und ACS 12.10.09 mic
// Die nichtblockiernden Fahrfunktionen müssen "von Hand" mit der
// task_motionControl()-Funktion solange angestossen werden bis isMovementComplete()
// das Erreichen des Etappenziels signalisiert. Dann wird die Tour weitergeschaltet.
// Sollte während der Fahrt ein Bumper betätigt werden oder das ACS ansprechen,
// weicht der RP6 aus.
// Danach setzt setzt er die Fahrt mit dem aktellen Etappenziel fort.
// Allerdings kann ich das alles im Moment nicht testen und weiß deshalb nicht,
// wie die Tour überhaupt aussieht und wohin er sinnvollerweise ausweichen sollte ;)
#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; // Speicher für die aktuelle Fahrsituation
uint8_t tour; // Einzelschritte der Tour
int main(void)
{
initRobotBase(); // Sollte man immer machen!
setLEDs(0b111111);
mSleep(2500);
powerON(); // Ab jetzt könnte der RP6 losfahren und sich verletzen!
setACSPwrMed(); // mittelweites ACS aktivieren
move_state=status_fahren; // Startstatus setzen
tour=1; // die Tour beginnt bei Schritt 1
while(true) // Endlos bis Akkus leer
{
if(move_state==status_fahren) switch(tour) // nur wenn kein Ausweichen aktiv
{
case 1: setLEDs(0b110110); move(75, FWD, DIST_MM(900), false);
break;
case 2: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 3: setLEDs(0b110110); move(75, FWD, DIST_MM(500), false);
break;
case 4: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 5: setLEDs(0b110110); move(75, FWD, DIST_MM(1400), false);
break;
case 6: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 7: setLEDs(0b110110); move(75, FWD, DIST_MM(1300), false);
break;
case 8: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 9: setLEDs(0b110110); move(75, FWD, DIST_MM(1000), false); //MITTE!
break;
case 10: setLEDs(0b111111); rotate(50, RIGHT, 360, false);
break;
case 11: setLEDs(0b111011); move(75, BWD, DIST_MM(1000), false);
break;
case 12: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 13: setLEDs(0b011011); move(75, BWD, DIST_MM(1300), false);
break;
case 14: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 15: setLEDs(0b011011); move(75, BWD, DIST_MM(1400), false);
break;
case 16: setLEDs(0b000111); rotate(50, RIGHT, 90, false);
break;
case 17: setLEDs(0b011011); move(75, BWD, DIST_MM(500), false);
break;
case 18: setLEDs(0b111000); rotate(50, LEFT, 90, false);
break;
case 19: setLEDs(0b011011); move(75, BWD, DIST_MM(900), false);
break;
case 20: while(1) // Ende der Tour mit blinken
{setLEDs(0b111000); mSleep(200); setLEDs(0b000111); mSleep(200);}
break;
}
switch(move_state) // Fahren bis Etappenziel oder Ausweichen bei Bumper oder ACS
{
case status_fahren:
do
{
task_ACS();
task_Bumpers();
task_motionControl();
if(bumper_left && bumper_right) move_state=status_angestossen_beide;
else if(bumper_left) move_state=status_angestossen_links;
else if(bumper_right) move_state=status_angestossen_rechts;
if(obstacle_left && obstacle_right) move_state=status_ACS_beide;
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++; // Etappenziel erreicht, weiterschalten zu nächstem Ziel
// if(tour>19) tour=1 // Neustart der Tour (bei 20 ist Ende!)
}
else // oder bremsen weil ein Bumper betätigt ist
{
setLEDs(0);
move(150,100,BWD,1); // mit Rampen bremsen und 100 zurückfahren
}
break;
case status_angestossen_links:
setLEDs(0b010000);
rotate(150,RIGHT,90,1); // mit Rampen blockierend drehen
move_state=status_fahren;
break;
case status_angestossen_rechts:
setLEDs(0b000010);
rotate(150,LEFT,90,1); // mit Rampen blockierend drehen
move_state=status_fahren;
break;
case status_angestossen_beide:
setLEDs(0b010010);
rotate(150,LEFT,180,1); // mit Rampen blockierend wenden
move_state=status_fahren;
break;
case status_ACS_links:
break;
case status_ACS_rechts:
break;
case status_ACS_beide:
break;
}
}
return 0;
}
Macht Spass :)
Lesezeichen