-         

Ergebnis 1 bis 6 von 6

Thema: Problem mit Linienverfolgung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Giessen und Fulda
    Alter
    32
    Beiträge
    81

    Problem mit Linienverfolgung

    Anzeige

    Servus, hab mich mal an der Linienverfolgung des Asuros ausgelassen, aber irgenwie spackt der voll ab und zappelt rum, als ob er behindert wäre ...
    Welche Werte schreibt denn die Linienverfolgungsfunktion in das Integerarray ?? Wie groß ist die Werte differenz Zwischen den 2 Fototransistoren, wenn der eine eine Schwarz "sieht" und der andere Weiß ?? Wenn ich die Integerwerte mit dem terminalprogramm an den Computer sende wird mir auch nur Mist angezeigt, werden die Ingerwerte in AscII-Zeichen umgewandelt oder was passiert da ??

    Wäre cool, wenn sich jemand die Zeit nimmt und mich aufklärt....
    P.S.:Unten is der Code von dem Programmfrag das ich zur Linienverfolgung geschrieben haben.

    Code:
    #include "asuro.h"
    
    
    unsigned int fototransistor[2];
    int i;
    
    void LinieLinks(void)
    {
    
    	for(i=0;i<=20;i++)
    	{
    	MotorDir(RWD,RWD);
    	MotorSpeed(100,120);
    	Sleep(255);
    	}
    	
    
    	for(i=0;i<=20;i++)
    	{
    	MotorDir(BREAK,RWD);
    	MotorSpeed(100,120);
    	Sleep(255);
    	}	
    
    }
    
    
    
    void LinieRechts(void)
    {
    
    	for(i=0;i<=50;i++)
    	{
    	MotorDir(RWD,RWD);
    	MotorSpeed(100,120);
    	Sleep(255);
    	}
    	
    
    	for(i=0;i<=50;i++)
    	{
    	MotorDir(BREAK,RWD);
    	MotorSpeed(100,120);
    	Sleep(255);
    	}	
    
    }
    
    
    
    
    int main(void)
    {
    	FrontLED(ON);
    	
    	
    
    	do
    	{
    		FrontLED(ON);
    	
    		SerWrite(fototransistor[0],3);
    		SerWrite("-",1);
    		SerWrite(fototransistor[1],3);
    		
    		
    		Init();
    		LineData(fototransistor);
    		
    		for(i=0;i<=50;i++)
    		{
    			MotorDir(FWD,FWD);
    			MotorSpeed(100,120);
    			Sleep(255);
    		}
    		
    		
    		
    		if((fototransistor[0]-fototransistor[1])<(-100))			//Linie links
    		{
    			BackLED(ON,OFF);
    			LinieLinks();
    		
    		}
    		
    		if((fototransistor[0]-fototransistor[1])>100)			//Linie rechts
    		{
    			BackLED(OFF,ON);
    			LinieRechts();
    		
    		}
    		
    	}
    	while(1);
    
    	return 0;
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.783
    Blog-Einträge
    8
    Hallo

    Ich hab' das immer mit einem kleinen Testprogramm untersucht, Daten einlesen und zum PC senden, im Stillstand, also ohne Motor. Dann muss man zwar die Linie von Hand bewegen, aber das schadet ja nicht.
    Blöderweise gibts dazu keinen Quellcode mehr, deshalb kann ich dir nur das .hex anbieten. Dafür funktioniert es so mit jeder Version der Lib die du verwendest. Mit K6/K5 kann man die FrontLED ein oder ausschalten. Datei ist im Anhang.

    Mein Kreismessprogramm habe ich aber noch. Kannst du dir ja mal anschauen. Der asuro dreht sich über der Linie und merkt sich die Werte, am Ende sendet er sie dann zum PC:

    Code:
    #include "asuro.h"
    
    #define limit 50
    #define NewLine SerWrite("\n\r",2)
    #define Trenner SerWrite("; ",2)
    
    unsigned int data[2], data_old[2], d_l[limit], d_r[limit], zeiger;
    
    int main( void ){
    
    Init();
    zeiger=0;
    LineData(data_old);
    d_l[zeiger]=data_old[0];
    d_r[zeiger]=data_old[1];
    zeiger++;
    FrontLED(ON);
    Msleep(500);
    MotorDir(BREAK,BREAK);
    MotorSpeed(255,255);
    while(zeiger<limit) {
    	if (zeiger & 1) StatusLED(YELLOW); else StatusLED(RED);
    	MotorDir(FWD,RWD);
    	Msleep(10);
    	MotorDir(FREE,FREE);
    	Msleep(100);
    	LineData(data);
    	if ((data[0]!=data_old[0]) || (data[1]!=data_old[1])) {
    		d_l[zeiger]=data[0];
    		d_r[zeiger]=data[1];
    		data_old[0]=data[0];
    		data_old[1]=data[1];
    		zeiger++;
    	}
    }
    MotorDir(BREAK,BREAK);
    MotorSpeed(0,0);
    FrontLED(OFF);
    Msleep(500);
    while(!PollSwitch()) { StatusLED(GREEN); Msleep(200); StatusLED(OFF); Msleep(600);}
    NewLine; NewLine;
    SerWrite("Gespeicherte Linedatas (10.3.2007)",34);
    NewLine; NewLine;
    for (zeiger=0; zeiger<limit; zeiger++) {
    	NewLine;
    	PrintInt(zeiger);
    	Trenner;
    	PrintInt(d_l[zeiger]);
    	Trenner;
    	PrintInt(d_r[zeiger]);
    	Trenner;
    	PrintInt(d_l[zeiger]+d_r[zeiger]);
    	Trenner;
    	PrintInt(d_l[zeiger]-d_r[zeiger]);
    }
    while(1) { StatusLED(RED); Msleep(200); StatusLED(OFF); Msleep(600);}
    return 0;
    }
    Das benötigt allerdings eine asuro.c die schon PrintInt() und Msleep() kennt. Links dazu findest du im FileThread. (Um es nicht unnötig kompliziert zu machen, solltest du eine Version unter 2.7 wählen.)

    Gruß

    mic
    Angehängte Dateien Angehängte Dateien

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Giessen und Fulda
    Alter
    32
    Beiträge
    81
    hmm, jo ... das Programm funktioniert, aber die FrontLED geht bei mir nicht an, wenn ich den taster drücke. Wie bekommst du denn so schöne IntegerWerte, wenn ich das Array mit den Sensordaten ausgebe, bekomme ich nur irgenwelche zeichen angezeigt, muss ich ne typenkovertierung vornehmen ??

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    ja das musst du... folgende funktion geht:

    unsigned char zumsenden[5];
    LineData(data);
    itoa(data[0],zumsenden,10);
    SerWrite(zumsenden,5);

    dann sollte der wert von data[0] an hyperterm gesendet werden.
    das gleiche dann mit data[1]
    kleinschreibung ist cool!

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.783
    Blog-Einträge
    8
    Hallo

    Die Integerwerte kann man mit der Funktion PrintInt() an den PC senden. Die ist aber in der CD-Version von asuro.c nicht enthalten. Entweder besorgst du dir eine neuere Lib oder baust diesen Code in dein Programm ein:

    Code:
    void PrintInt(int wert)
    {  	char text[6]="      ";
    	itoa(wert,text,10);
    	SerWrite(text,5);
    }
    (aus asuro.c Version größer 2.1)

    Wenn die FrontLED nicht angeht, drückst du entweder die falsche Tasten, oder deine Tasten sind nicht in Ordnung. Schau dir mal diese Beschreibung der Tastenfunktion an:

    http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

    Gruß

    mic

    [Edit]
    Oh, der Glasfaser-Mod ist auch mal wieder online *winkt*

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Giessen und Fulda
    Alter
    32
    Beiträge
    81
    Oh man, ich weiß, warum ich solche Probleme hatte, ich hab Init() vergessen !!!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •