-
        

Ergebnis 1 bis 10 von 10

Thema: Liniefolgen asuro hängt in if

  1. #1

    Liniefolgen asuro hängt in if

    Anzeige

    Hi,

    ich hab ein Problem.

    Wollte das mein Asuro auf einer Linie fährt und bei leichtem verlassen da gegensteuert.

    linedata ist ungefähr 200 bei weiß.

    Code:
    #include "asuro.h"
    
    int main(void)
    {unsigned int linedata[2];
    
    
    	
      Init();
     while(1)
     {
      FrontLED(ON);
    	
    
    	MotorDir(FWD,FWD);
    	MotorSpeed(80,80);
    	
    
        if(linedata[0]<180)
     {
        MotorDir(FWD,FWD);
    	MotorSpeed(0,190);
    }
        else if (linedata[1]<180)
     {
        MotorDir(FWD,FWD);
    	MotorSpeed(190,0);
    }
     
    
    }
    return (0);
    }
    jetzt dreht er sich einfach im Kreis (ich weis die werte sind sehr hoch aber des war nur damit ich auch eine Änderung sieh)

    gruß simon

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Hallo Simon, schau dir deinen Code Mal ganz genau an - Wo erfasst du die Messdaten?

    Außerdem machst du in deiner Schleife eine Reihe sinnloser Dinge - Du setzt die Geschwindigkeit und Richtung einmal pauschal am Anfang und überschreibst sie direkt danach wieder.
    Außerdem würde ich am ehesten die beiden Werte miteinander vergleichen und nicht mit einer Konstanten ...

    mfG
    Markus

  3. #3
    hi

    danke für die schnelle Antwort.

    die Messdaten hab ich wohl im laufe des Tages raus gelöscht ^^
    im Kreis ist er wohl immer gefahren weil die werte einfach doch nicht gepasst haben hab sie jetzt nochmal angepasst und ihn langsam fahren lassen jetzt Schaft er schon mal ein paar kurven.

    Sinnlosen Sachen sind jetzt denk auch soweit draußen.

    und des mit beiden werten vergleiche und abziehen hab ich noch net so ganz gerafft aber denk da wert ich morgen mal schauen ob ich dahinter komm^^

    Gruß simon

  4. #4
    So ich bins nochmal

    hab des mir dem Helligkeitsvergleich jetzt glaub hin bekommen

    jetzt hab ich nur eine frage was ist wenn ich bei den Motoren statt 255 z.b. 5000 eingebe oder ein - davor setze

    eigentlich dürfte es ja nix machen wollt mich nur mal absichern bevor er kaputt geht^^

    gruß

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

    Kaputt gehen wird nichts. Passieren kann alles mögliche, weil der Parameter für MotorSpeed() nur 8 Bit groß sein darf.

    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
    Danke für die schnelle Antwort

    habs mal versucht aber der asuro ist nur komisch rumgefahren, denk aber das liegt eher an den licht werten.

    ich hab jetzt den Code drauf um die licht werte zu vergleichen
    Code:
    #include "asuro.h"
    
    int main(void)
    {unsigned int linedata[2];
    int Sum;
    int Diff;
    
    
      Init();
     
    
    LineData(linedata);
     FrontLED(ON);
      Msleep(100);
      Sum=linedata[0]-linedata[1];
      Sum=linedata[0]-linedata[1];
     while(1)
     {LineData(linedata);
    
     Diff=(linedata[0]-linedata[1])-Sum;
    PrintInt(Diff);
    
    Msleep(1000);
    
    
    	
    }
    return (0);
    }

    jetzt müsste er doch wenn er auf einem weißen blatt steht und nicht bewegt wird oder das licht verändert 0 anzeigen oder?
    Weil meiner zeigt jetzt -40 an.

    Gruß Simon

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    auhc wenns von der rechenzeit bissl böse ist, große erfolge hab ich mit differentieller messung erhalten

    cih messe einmal die Sensoren MIT eingeschalteter diode und gleich danach mit abgeschalteteer diode und berechne mir dann die idfferenz

    (ACHTUNG: die differenz kann negativ sein, also unglaublich hoch werden wenn man mit unsigned char arbeitet, lieber aus den beiden unsgned char einen signed int machen)
    Code:
    signed int diff = (signed int) wert_mit_diode - (signed int) wert_ohne_diode;
    diff = (diff < 0)?0:diff;
    das raubt zwar rechenzeit, aber die werte sind extrem genau, wenn man nicht gerade direkte lichteinstrahlung hat und die dioden übersteuert

    MfG Frank

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Hallo Frank,

    du kriegst nen Trostpreis wenn du eine halbwegs logische Erklärung dafür aufbieten kannst, warum eine einfache Differenz "teuer" ist.
    (Kleine Tipp: Ein AVR kann in einem Takt eine 8-Bit-Addition/Subtraktion durchführen, der Aufwand steigt linear mit der Anzahl der Bytes)

    Teuer sind lediglich Multiplikationen (durch den eingebauten Hardware-Multiplizierer auch noch relativ moderat) und Divisionen (relativ teuer).
    Getoppt wird aber alles durch Fließkommaberechnungen ...

    mfG
    Markus

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    teuer ist das ein und ausschalten den diode über die asuro lib, meiner erfahrung nach passieren zwischen 2 messungen inklusive an und abschalten der diode dabei sooo viele rechenschritte (irgendwann mal hab ich mir das angesehen aber die genaue anzahl vergessen) dass man das flackern der diode mit bloßem auge erkennt und das sollte meiner meinung nach bei nem 8MHz prozessor nicht zwingend möglich sein ... daher "teuer"

    die "einfache betrachtung" ist hier leider unnütz, da muss man auch erfahrung und umgebungsbedinungen beachten

    wenn man weis WIE kann man die messung aber mit sicherheit optimieren ... z.B. die 4 aufrufe in einer methode zusammenfassen und so 3 mal "overhead" sparen

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Hallo Frank,

    ich würde Mal spontan vermuten dass das eher am restlichen Programm liegt, die Ansteuerung der Diode benötigt nur wenige Takte.
    Am längsten dauert die blockierende Auswertung der beiden Liniensensoren, wobei man das ja auch über einen Interrupt entkoppeln kann. Die wahrgenommenen Aussetzer der LED sind wohl darauf zurückzuführen.

    Im Übrigen möchte ich mich dafür entschuldigen dass ich meinen obigen Beitrag unnötig aggressiv formuliert habe ...

    mfG
    Markus

    PS: Es dürfte vermutlich reichen, den Dunkelwert mit deutlich niedrigerer Frequenz zu aktualisieren als den Wert mit eingeschalteter LED ...
    PPS: Bei einigen Versuchen hat es sich gezeigt dass bei einem normal beleuchteten Raum die Helligkeit auch ohne Front-LED zum Linienfolgen ausreicht - Du subtrahierst dir also auch ein Stück Nutzssignal weg ...

Berechtigungen

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