Hallo alle zusammen,
ich versuche, das Problem nun anders (und auch wesentlich sinnvoller) zu lösen, indem ich mit der odometrie arbeite. Mein Ziel ist nämlich, das der asuro eine linie lang fährt, dann auf ein Hinderniss trifft, einige Zentimeter zurück fährt und dann um das Hinderniss herum fährt, um schließlich wieder auf die Linie zurückzukehren.(Ich wollte mit der Zeiteinstellung die Odometrie erst umgehen). Mit dem Prog. binn ich bis jetzt soweit, dass der Asuro die linie entlang fährt, auf das Hinderniss trifft und (eigentlich) ca. eine Reifenumdrehung zurückfahren soll. Nur tut er letzteres nicht. Er fährt die Linie lang und wenn man die Tater drückt, tut er, solange man sie gedrückt hält, gar nichts. Ich verwende Folgendes Programm:
Code:
#include "asuro.h" //P//LINIENVERFOLGUNG
#define LINIENWERT //D//
//folgende werte müssen ggf.
//verändert werden!!!
#define SCHWELLENWERT 600 //D//GRENZE ZWISCHEN HELL UND DUNKEL FESTLEGEN
#define HYSTERSIS 10 //D//WERT ZUR VORBEUGUNG VON STÖRUNGEN
//die hier nicht mehr!!!
#define LOW 0 //D//-}\WERTE ZUR ÜBERPRÜFUNG, OB SCHON EIN
#define HIGH 1 //D//-}/WECHSEL STATTGEFUNDEN HAT, FESTLEGEN
int main(void) //V//PROZESSOR IN GRUNDZUSTAND VERSETZEN
{
unsigned int status[2]={0,0}; //V//SPEICHER FÜR "HAT WECHSEL STSTTGEFUNDEN?"
unsigned int odata[2]; //V//SPEICHER FÜR GEBERSCHEIBENZUSTAND
unsigned int counter[2]={0,0}; //V//SPEICHER ZUM ZÄHLEN DER GEBERSCHEIBEN-IMPULSE
unsigned int ldata[2]; //V//SPEICHER FÜR LINIENFOLGE BEREITSTELLEN
unsigned char t1; //V//SPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
unsigned char t2; //V//VERGLEICHSSPEICHER FÜR KOLLISIONSTASTER BEREITSTELLEN
Init(); //S//START DES PROGRAMMS
FrontLED(ON); //A//LINIENFOLGE-LED AN
MotorDir(FWD,FWD); //A//MOTOREN AUF VOR
while(1) //E//ENDLOSSCHLEIFE:
{
t1=PollSwitch(); //A//TASTENABFRAGE
t2=PollSwitch(); //A//VERGLEICHSTASTENABFRAGE
if(t1==t2&&t1==0) //?//WENN KEINE TASTE GEDRÜCKT
{ //!//(MIT VERGLEICH MIT t2 ZUR SICHERSTELLUNG DER RICHTIGKEIT t2s)
LineData(ldata); //://LINIENFOLGE-DATEN EINLESEN
if(ldata[0]>ldata[1]) //:?/WENN LINKS HELLER ALS RECHTS,
{MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS
MotorSpeed(150,0); //://LINKS MEHR GAS
StatusLED(RED);} //://UND STATUS LED ROT;
else //:?/SONST:
{MotorDir(FWD,FWD); //://BEIDE MOTOREN AUF VORWÄRTS
MotorSpeed(0,150); //://RECHTS MEHR GAS
StatusLED(GREEN);} //://UND STATUS LED GRÜN
} //://KOLLISIONANWEISUNG SCHLIEßEN
else{ //!?/wENN KOLLISION
MotorSpeed(0,0); //!//MOTOREN ANHALTEN
MotorDir(RWD,RWD); //!//MOTOREN AUF RÜCKWÄRTS
LineData(ldata); //!//LINIENFOLGE-DATEN EINLESEN
while(counter<40) //!//SOLANGE DURCHFÜHREN,BIS COUNTER 40 IMPULSE
{ //!// 40 IMPULSE ANALOG 1REIFENUMDREHUNG ERREICHT HAT
OdometrieData(odata); //!//ODOMETRIEWERTE EINLESEN
if(status[0]==LOW&&odata[0]>SCHWELLENWERT+HYSTERSIS)
//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
{ //!//VON SCHWARZ AUF WEIß STATTGEFUNDEN ???
counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN
if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS,
{MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN;
else //!?//SONST:
{MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN;
} //!//WECHSEL?-ANWEISUNG SCHLIEßEN
if(status[0]==HIGH&&odata[0]<SCHWELLENWERT-HYSTERSIS)
//!//HAT WECHSEL DER GEBERSCHEIBENFARBE
{ //!//VON WEIß AUF SCHWARZ STATTGEFUNDEN ???
counter[0]++; //!//ZÄHLER EINEN IMPULS HOCHSETZEN
if(ldata[0]>ldata[1]) //!?/WENN LINKS HELLER ALS RECHTS,
{MotorSpeed(0,150); //!//LINKS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(ON,OFF);} //!//UND LINKE BACK-LED AN;
else //!?//SONST:
{MotorSpeed(150,0); //!/RECHTS MEHR GAS (RÜCKWÄRTS)
BackLED(OFF,OFF); //!//VORIGEN ZUSTAND DER BACK_LED`S ZURÜCKSETZEN
BackLED(OFF,ON);} //!//UND RECHTE BACK-LED AN;
} //!//WECHSEL?-ANWEISUNG SCHLIEßEN
} //!//counter-anweisung geschlossen, wenn counter<40 ist,
//!//kehre zu while(counter<40) zurück, ansonsten mache
//!// in Reihenfolge weiter
} //!//WENN KOLLISION-ANWEISUNG ZU ENDE
} ////Wieder von vorne, ENDE ENDLOSSCHLEIFE
return 0; ////return(0)
} ////PROGRAMM ENDE
Über schnelle Antwort würde ich mich freuen!!!
Viele Grüße,
C-3PO
Lesezeichen