-         

Ergebnis 1 bis 9 von 9

Thema: Liniensensoren funktionieren nicht richtig

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2011
    Ort
    Trebur
    Alter
    23
    Beiträge
    16

    Liniensensoren funktionieren nicht richtig

    Anzeige

    Guten Morgen,

    ich versuche schon seit längerem meinen ASURO dazu zu bewegen einer schwarzen Linie zu folgen, aber er haut immer wieder ab, bzw. dreht sich im Kreis.
    Ich habe das Standartprogramm von der Arexx CD genommen und nur die Motorengeschwindigkeit etwas herabgesetzt.
    Wenn mein Kollege sein Programm auf den ASURO flasht klappt es wunderbar, wie kann das sein? Könnte das Problem sogar an meinem Computer liegen ?

    Code:
    #include "asuro.h" // Linienverfolgung auf die einfachste Art
    
    int main(void) 
    {
    unsigned int data[2]; //Speicher bereitstellen
    Init();
    
    FrontLED(ON); 		// Linienbeleuchtung einschalten
    MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
    
    while(1)			// Endlosschleife, ASURO soll beliebig
    	                // lang einer Linie nachfahren
    { 			
    LineData(data); 	// aktuelle Helligkeitswerte der
    					// Fototransistoren einlesen
    
    if (data [0] > data [1] ) 	 // links heller als rechts...
    {MotorSpeed(100,80);} 	// ... dann links mehr Gas geben...
    
    else
    {MotorSpeed(80,100);} 	// ... sonst rechts mehr Gas geben!
    
    }
    return 0;
    }

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Hallo,
    was noch nicht so ganz klar wurde: verwendet du und dein Kollege ein und denselben ASURO oder hat jeder von euch einen eigenen Roboter?
    Vielleicht ist noch etwas mit den Liniensensoren nicht in Ordnung (Lötfehler?).
    Grüße,
    Bernhard

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Das Problem wird wohl eher nicht an deinem Computer liegen. Der Code scheint ja auch in Ordnung zu sein,sonst würde es auf dem anderen auch nicht laufen.
    Was sagt denn der Selbsttest?

    Vielleicht sollte man ihm aber auch sagen was er machen soll, wenn beide Werte gleich sind.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2011
    Ort
    Trebur
    Alter
    23
    Beiträge
    16
    @BMS
    Wir verwenden 2 verschiedene ASUROs. Lötfehler kann nicht sein, weil es mit seinem Programm von seinem Computer aus auf meinem ASURO funktioniert. Das Problem tritt nur auf, wenn ich es von meinem Computer aus flashen will.
    Andere Programme funktionieren ohne Probleme. Ich versuche nochmal mit der Geschwindikeit zu spielen. Wenn ein Wert zu niedrig ist dreht sich das Rad nicht, aber wenn der Wert zu hoch ist kommt glaube ich der Liniensensor nicht mit.

    *edit
    Es ist zum heulen... Jetzt habe sogar noch Strumpschläuche um die Lichtsensoren gemacht und der ASURO fährt immer noch wie Depp durch die Gegend. Mit dem Programm stimmt alles.
    Ich lasse den ASURO schon extra langsam fahren damit er auch genug Zeit hat zum messen, aber er hält seine Bahn keine 2mm ein. Immer wieder kommt er von der schwarzen Bahn ab. Es ist egal ob der Raum Hell, ganz Hell oder Dunkel ist, bzw. ob die FrontLED an oder aus ist.
    ich komme einfach nicht mehr weiter.

    Gibt es eine Möglichkeit, dass man eine Motorengeschwindigkeit vorgibt und bei einer Veränderung der Helligkeit (LineData[0]/LineData[1]) die entsprechende Seite beschleunigt und die andere verlangsamt wird?

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

    Für einen schnellen Test:

    Code:
    #include "asuro.h" // Linienverfolgung auf die einfachste Art
    
    int main(void)
    {
    	unsigned int data[2]; //Speicher bereitstellen
    	Init();
    
    	FrontLED(ON);       // Linienbeleuchtung einschalten
    
    	while(1)         // Endlosschleife, ASURO soll beliebig
                       // lang einer Linie nachfahren
    	{
    		LineData(data);    // aktuelle Helligkeitswerte der
                   // Fototransistoren einlesen
    
    		if (data [0] > data [1] )     // links heller als rechts...
    			StatusLED(RED);            // ist rot
    		else
    		   StatusLED(YELLOW);
    	}
    	return 0;
    }
    Dann nimmst du ein Blatt Papier, malst eine Linie drauf und ziehst diese Linie unter den Sensoren durch. So kannst du feststellen, ob und wo der asuro die Linie "sieht". Das sieht etwa so aus :
    http://www.youtube.com/watch?v=46ts6GH04NI
    http://www.youtube.com/watch?v=694Q7X_PB4Q
    (hab leider kein Video mit dem asuro, es zeigt aber die Idee)

    Einer der unzähligen Ansätze mit ausgeblendetem Umgebungslicht:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=39774

    Änder mal den Titel in etwas aussagekräftigeres...

    Gruß

    mic

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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2011
    Ort
    Trebur
    Alter
    23
    Beiträge
    16
    Vielen Dank für die Hilfe! Endlich färht mein ASURO. Danke radbruch für das Programm zum test, ob die Linie gefunden wird.
    Dann habe ich mal das Programm aus deinem link genommen und siehe da es klappt Nochmals vielen Dank.

  7. #7
    Benutzer Stammmitglied Avatar von Herbert A.
    Registriert seit
    24.02.2010
    Alter
    20
    Beiträge
    46
    Ich habe das Programm etwas abgeändert, sodass es die Kurven in der Linientestarena schafft, aber das ruckelt ziemlich und ist nicht so schnell.
    Hat jemand eine Idee,wie manb das verbessern könnte(Geschwindigkeit/Ruckeln)?
    Das Programm sieht so aus:
    PHP-Code:
    #include "asuro.h" // Linienverfolgung auf die einfachste Art

    #define tol 15

    int main(void
    {
    unsigned int data[2]; //Speicher bereitstellen
    Init();

    FrontLED(ON);         // Linienbeleuchtung einschalten
    MotorDir(FWD,FWD); // Beide Motoren auf vorwärts

    while(1)            // Endlosschleife, ASURO soll beliebig
                        // lang einer Linie nachfahren
    {             
    LineData(data);     // aktuelle Helligkeitswerte der
                        // Fototransistoren einlesen

    if (data [0] > data [1] + tol )      // links heller als rechts...
    {MotorSpeed(140,80);

    MotorDir(FWD,RWD);}     // ... dann links mehr Gas geben...

    LineData(data);     // aktuelle Helligkeitswerte der
                        // Fototransistoren einlesen

     
    if (data [1] > data [0] + tol )      // links heller als rechts...
    {MotorSpeed(80,140);

    MotorDir(RWD,FWD);

    }     
    // ... dann links mehr Gas geben...

    else
    {
    MotorSpeed(120,120);}     // ... sonst rechts mehr Gas geben!

    }

    return 
    0;

    mfG
    while (!asleep()) sheep++;

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Habe mal den Code überarbeitet (ungetestet) - die if-Konstruktionen überarbeitet und ein LineData entfernt, da es ja sowieso bei jedem Schleifendurchlauf neu eingelesen wird.

    Code:
    #include "asuro.h" // Linienverfolgung auf die einfachste Art
    #define tol 15
    
    int main(void) 
    {
        unsigned int data[2]; //Speicher bereitstellen
        Init();
    
        FrontLED(ON);         // Linienbeleuchtung einschalten
        MotorDir(FWD,FWD);     // Beide Motoren auf vorwärts
    
        while(1)            // Endlosschleife, ASURO soll beliebig
        {             
            LineData(data);     // aktuelle Helligkeitswerte der
                                // Fototransistoren einlesen
            if (data [0] > data [1] + tol )
            {
                MotorSpeed(140,80);
                MotorDir(FWD,RWD);
            }
            else if (data [1] > data [0] + tol )
            {
                MotorSpeed(80,140);
                MotorDir(RWD,FWD);
            }
            else
            {
                MotorSpeed(120,120);
                MotorDir(FWD,FWD);
            }
        }
        return 0;
    }
    Am Programm selber kann man nicht mehr viel Laufzeit optimieren.
    Du kannst noch ein wenig mit den Geschwindigkeitswerten und der Toleranz spielen, dadurch lässt sich das noch optimieren.
    Außerdem ist das Rückwärtsdrehen der Motoren kontraproduktiv. Du willst ja voran kommen. Wenn er oft die Drehrichtung FWD/RWD ändern muss, bleibt er eher auf der Stelle stehen. Also lieber den Motor, der bisher rückwärts fuhr in Vorwärtsrichtung drehen lassen, vielleicht mit geringer Geschwindigkeit.
    Da musst du viel probieren. Aber Versuch macht klug
    Ansonsten stößt dieses Regelverhalten halt irgendwann an seine Grenzen. Ist ja ein Zweipunktregler. Man könnte es einmal mit einem P-Regler (Software) versuchen.
    Auch eine andere Anordnung der Sensoren (Abstand) kann viel am Regelungsverhalten ändern. Frage ist eben: willst du der Linie sehr präzise und langsam folgen oder grob und schnell ? Je schneller man folgen will, desto weiter sollten die Sensoren auseinander.

    Grüße,
    Bernhard

  9. #9
    Benutzer Stammmitglied Avatar von Herbert A.
    Registriert seit
    24.02.2010
    Alter
    20
    Beiträge
    46
    Jipiiiiiii es funktioniert.
    und danke für die schnelle Antwort.
    ich habe schon sehr viel mit den Werten rumprobiert.
    wenn ich beide Motoren in der Kurve auf vorwärts setze, schafft er aber nicht so enge Kurven.
    und wenn er vorwärts und rückwärts dreht, korrigiert er schnerller.
    ich habe die Werte jetzt so optimiert, dass der bot der Linie sehr ruhig folgt.

    mfG
    Geändert von Herbert A. (08.03.2011 um 17:19 Uhr)
    while (!asleep()) sheep++;

Berechtigungen

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