Wie die Bumper richtig ins Programm einbringen?
Hallo.
Ich habe jetzt mal probiert, den RP6 zu programmieren. Eine einfache Strecke mit Kurven ist kein Problem und die passend dazu blinkenden LEDs auch nicht.
Jetzt möchte ich den Roboter aber so einstellen, dass er zurücksetzt, wenn er irgentwo gegen fährt. Ich habe noch keine wirkliche Erfahrung mit "C" und hab das einfach mal versucht, nach bestem Verständnis aus Programm-Schipseln zusammen zusetzen.
LEIDER hat das nicht funktioniert.
Ich weiss, dass das alles doof und falsch ist, könnte mir trotzdem jemand sagen, wie ich den Text ändern muss, damit der Roboter die Bumper WÄHREND seiner "Tour" verwendet?
Code:
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
powerON();
switch(move_state)
{
case STATE_START:
setLEDs(0b010000);
move_state = STATE_WAIT_FOR_BUMPER_HIT_LEFT;
break;
case STATE_WAIT_FOR_BUMPER_HIT_LEFT:
if(getStopwatch1() > 500)
{
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
if(bumper_left)
{
setLEDs(0b011001);
move(50, BWD, DIST_MM(150), NON_BLOCKING);
move_state = STATE_MOVE_BACKWARDS;
}
while(true)
{
setLEDs(0b110110);
move(75, FWD, DIST_MM(900), true);
setLEDs(0b000111);
rotate(50, RIGHT, 90, true);
setLEDs(0b110110);
move(75, FWD, DIST_MM(500), true);
setLEDs(0b111000);
rotate(50, LEFT, 90, true);
setLEDs(0b110110);
move(75, FWD, DIST_MM(1400), true);
setLEDs(0b000111);
rotate(50, RIGHT, 90, true);
setLEDs(0b110110);
move(75, FWD, DIST_MM(1300), true);
setLEDs(0b000111);
rotate(50, RIGHT, 90, true);
setLEDs(0b110110);
move(75, FWD, DIST_MM(1000), true); //MITTE!
setLEDs(0b111111);
rotate(50, RIGHT, 360, true);
setLEDs(0b111011);
move(75, BWD, DIST_MM(1000), true);
setLEDs(0b111000);
rotate(50, LEFT, 90, true);
setLEDs(0b011011);
move(75, BWD, DIST_MM(1300), true);
setLEDs(0b111000);
rotate(50, LEFT, 90, true);
setLEDs(0b011011);
move(75, BWD, DIST_MM(1400), true);
setLEDs(0b000111);
rotate(50, RIGHT, 90, true);
setLEDs(0b011011);
move(75, BWD, DIST_MM(500), true);
setLEDs(0b111000);
rotate(50, LEFT, 90, true);
setLEDs(0b011011);
move(75, BWD, DIST_MM(900), true);
}
return 0;
}
Ja, ich weiss, dass ich mich doof anstelle, aber die Anleitung verrät ja auch nichts -.-
Könntet ihr mir da helfen?
Danke schon mal im Vorraus :D
MfG Tim :D
Programm zum Ausweichen weiterführen?
Huhu nochmal!
So. Ich glaube, das ist eine neue Antwort und keinen Edit wert. Ich habe jetzt, mit Hilfe von Radbruchs so freundlicher Weise geschriebenen Programm, ein Eigenes "entwickelt". Es ist nach wie vor nicht sehr komplex. Aber ich bin, dafür das ich mich seit zwei Tagen damit beschäftige und auch noch andere Dinge zu tun habe/ Hobbys ausüben möchte, sehr zufrieden damit. Dadurch, dass ich das Programm von dir immer abgeschrieben und nicht etwa Copy&Paste angewandt hätte, habe ich die einzelnen Schritte besser verstanden und kann sie nun auch selber weitestgehend verwenden. Kleine Rechtschreibfehler hier und da sind noch drin, aber ich bessere mich. Und einige Denk- und Strukturfehler im Programm habe ich auch noch, aber in meinem heutigen "Werk" ist kein Fehlercode mehr enthalten und es macht auch weitestgehend, was ich mir gewünscht habe.
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 ](*,) ), dann weicht er, wie gewünscht, z.B. nach Links aus. Jedoch versucht er dann ja den Teil seiner Tour wieder auszuführen, was aber dazu führt, dass ein weiteres Hinderniss erkannt wird, weil er ja woanders hingefahren ist, als geplant. Diesem will er wieder ausweichen und fährt noch "falscher". Und dann wieder und wieder und wieder... Bis er irgentwann in einer Ecke hängt und sich im Kreis dreht -.-
LEIDER nicht der gewünschte Effekt.
Jetzt: Was kann ich tun? Gibt es eine Möglichkeit, den Roboter vielleicht wieder auf die "richtige Bahn" zu bringen?
Wäre euch sehr verbunden.
Es genügt mir auch schon, wenn mir ein "Denk-anstoss" gegeben wird, sodass ich noch selber denken muss. Mag ich nicht so gerne, aber manchmal muss man das ja auch :D
MfG Tim