Liste der Anhänge anzeigen (Anzahl: 1)
Also ich hätte da mein erstes "richtiges" Programm vorzustellen.
Asuro fährt damit immer gerade aus, stösst er wo dagegen kehrt er um dreht sich leicht (nur zeitgeregelt) nd fährt wieder los. Das Programm hab ich geschrieben um zu sehen wieviel Raum ein Roboter abdeckt wenn er kreuz und quer durch einen Raum fährt. ( Dachte an evt. Saugroboter etc. )
Ach ja die Geschwindigkeiten sind für meinen Roboter angepasst, müssen noch individuell angepasst werden:
Hier also das test File (muss noch konvertierrt werden)
Wie aktiviere ich die Unterfunktionen des Selftest-Programms
Das make-file von Selftest kompiliert ja mächtig viele Quelltextdateien (alle *.c aus dem SelfTest-Ordner).
Schaut man sich die main()-Funktion an, so überprüft das Selbsttest-Programm zuerst, ob es Hell-/Dunkel-Wechsel am linken Rad erkennen kann. Werden mehr als 10 Wechsel erkannt, verzweigt das Programm in die Funktion Demo().
Hier wird es nun richtig interessant. Falls ich den C-Code richtig verstehe, werden abhängig von folgenden Kollisions-Erkennungs-Tastern verschiedene Unterfunktionen aufgerufen:
Schalter 6: LineDemo() --> Asuro folgt einer Linie
Schalter 5: RechteckDemo() --> Asuro macht was auch immer?
Schalter 4: PCDemo() --> ebenfalls recht unklar, was Asuro hier treibt.
Schalter 3: IRDemo() --> Asuro durch Fernbedienung steuern?
Hat jemand von Euch diese Programme schon einmal aus dem Selbsttest-Programm heraus starten können? Was machen die Unterprogramme genau?
Ich werde jetzt gleich einmal folgendes probieren:
- SelfTest flashen
- Asuro auf ein Blatt Papier mit einer dick schwarzen Linie setzen
- Asuro einschalten
- das linke Hinterrad mehrmals rumdrehen
- Schalter 6 drücken: Asuro sollte der Linie folgen
Habe ich den Programmcode soweit richtig verstanden?
Gruß,
SnoppysBot
Zwei Programme zusammen geworfen
Moinsen,
habs endlich geschafft: hatte ein Ausweichprogramm geschrieben und hatte das Linienfolgeprogramm soweit abgeändert, dass der Bot einer Taschenlampe folgen kann. Und jetzt kommts: beide Programme zusammen funktionieren so, dass der Roboter der Lampe folgt und wenn er anstößt ausweicht um dann wieder der Lampe zu folgen. Hier ist der Code:
Code:
/* fahrenlightfeiner
der Roboter folgt einem Licht über die zwei Phototransistoren oder fährt, bei gleichmäßiger Ausleuchtung gerade aus.
Stößt er mit den Tastern an wird ein Ausweichmanöver eingeleitet
kai 29.09.2005 */
#include "asuro.h"
#define KNOPF PollSwitch() //Funktion PollSwitch() wird als KNOPF derfiniert
#define SPEED 0x8F //SPEED wird als 248 definiert
int speedleft, speedright; //globale Variablen
unsigned int lineDaten[2]; // "
int ADOffset, i, j, k=0, l; // "
void search_left(void); //Funktionsprototyp
void search_right(void); // "
void LineLeft(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des linken Motors
speedleft+= 1;
if(speedleft>0xFE)
speedleft = 0xFF;
}
void LineRight(void){ //Funktion der main Funktion
//für die Erhöhung der Geschwindigkeit des rechten Motors
speedright += 1;
if(speedright>0xFE)
speedright = 0xFF;
}
void back(void){ //Funktion back() der Funktion taster()
//für zurücksetzen
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(254,255);
for(i=0;i<=100;i++)
Sleep(255);
}
void pause(void){ //Funktion pause() der Funktion taster()
//für eine kleine Pause mit Lichteffekten (nicht unbedingt erforderlich)
MotorSpeed(BREAK,BREAK);
while(k<=4){
StatusLED(RED);
BackLED(OFF,OFF);
FrontLED(ON);
for(i=0;i<=35;i++)
Sleep(255);
StatusLED(OFF);
BackLED(ON,ON);
FrontLED(OFF);
for(i=0;i<=35;i++)
Sleep(255);
k++;
}
}
void taster(void){ //Funktion zur Steuerung des Ausweichens
KNOPF; //mehrmaliger Aufruf von PollSwitch, wegen dem bekannten Problem mit
KNOPF; //dem Kondensator
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
KNOPF;
if(KNOPF > 0 && KNOPF < 8){ //falls Tasten 1-3 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,OFF);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF > 7 && KNOPF < 60 && KNOPF != 12 && KNOPF != 18 && KNOPF != 30){ //falls Tasten 4-6 gedrückt wurden, fahre hier fort
back();
pause();
search_right();
BackLED(OFF,ON);
MotorDir(FWD,RWD); //Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
MotorSpeed(180,180);
for(j=0;j<=170;j++)
Sleep(255);
}
else if(KNOPF == 12 || KNOPF == 18 || KNOPF == 30){ //falls Tasten 2-4 gedrückt wurden, fahre hier fort
back();
pause();
search_left();
BackLED(ON,ON);
MotorDir(RWD,FWD); //Abdrehen des Roboters in entgegengesetzer Richtung zur bisherigen Fahrtrichtung
MotorSpeed(180,180);
for(j=0;j<=240;j++)
Sleep(255);
}
}
int main(void){ //Hauptfunktion
Init();
StatusLED(GREEN);
for (l = 0; l < 0xFF; l++)
LineData(lineDaten); //Überschreiben des Speicherinhalts aus lineDaten[0,1] in die Funktion LineData
LineData(lineDaten);
ADOffset = lineDaten[0] - lineDaten[1]; //Berechnen von ADOffset
speedleft = speedright = SPEED; //Geschwindigkeit links und rechts gleich SPEED
for(;;){ //Endlosschleife
LineData(lineDaten); //Auswerten von LineData
i = (lineDaten[0] - lineDaten[1]) - ADOffset; //Berechnung von i zur Bestimmung des heller beschienen Transistiors
if(i > 50){ //falls rechter Transistor höhere Helligkeit-->
BackLED(ON,OFF);
LineRight(); //Erhöhe links die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else if(i < -50){ //falls linker Transistor höhere Helligkeit-->
BackLED(OFF,ON);
LineLeft(); //Erhöhe rechts die Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
else{ //bei gleichmäßiger Beleuchtung-->
BackLED(OFF,OFF);
speedleft = speedright = SPEED; //beide Motoren gleiche Geschwindigkeit
if(KNOPF > 0){ //Bedingung für Ausweichsequenz
taster(); //Aufruf der Ausweichfunktion
}
}
MotorDir(FWD,FWD);
MotorSpeed(speedleft,speedright); //Einsetzen der Variablen für die Geschwindigkeit der Motoren
}
while(1); //Endlosschleife (ASURO spezifisch)
return 0;
}
void search_left(void){ //Funktion search_left für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);
for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}
void search_right(void){ //Funktion search_right für Funktion taster()
//für Sucheffekt(nicht unbedingt erforderlich)
StatusLED(GREEN);
for(k=0;k<=0;k++){
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
for(i=0;i<=250;i++)
Sleep(255);
}
Sleep(255);
}
So das wärs. Endlich. Aber es gibt noch einiges zutun. Nämlich möchte ich gerne die zeitgesteuerten Elemente durch die Odometriedaten ersetzen und
außerdem muß die Suchfunktion noch einen näheren Sinn bekommen. Ich stelle mir das so vor, dass er solange in der Suchfunktion verbleibt bis ein Helligkeitsunterschied ermittelt wurde und dann wieder der Lichtquelle folgt.
Was haltet ihr davon. Wenns einer ausprobiert hat dann sagt doch mal bescheid.
Kai