- Labornetzteil AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Asuro soll vorwärts fahren-bei hinderniss-rückwärts

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173

    Asuro soll vorwärts fahren-bei hinderniss-rückwärts

    Hallo

    Ich möchte gerne, das mein Asuro vorwärts fährt, bei einen Hinderniss ein stück zurück und dann wieder vorwärts:

    Also er soll dann vor einen Wand immer vorwärts rückwärts vorwärts rückwärts fahren.

    Mein größtes Problem liegt darin, wenn er vor der wand steht, dass er wieder zurück fährt.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Wenn du deinen Code nicht zeigst, kann dir keiner helfen, außer du erwartest eine fertige Lösung - Die zumindest ich nicht auftischen werde.

    mfG
    Markus

    PS: Ein Schlagwort zum weitersuchen: State-Machine (Zustandsautomat)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    Das ist das Programm


    #include <asuro.h>
    int main(void)
    {
    Init();
    unsigned char;
    int LANG = 0,x = 0;
    MotorSpeed(110,110);
    while( 1 )
    {
    x=x+1;

    if (x > 1000)
    LANG=LANG+1;
    if (x > 1000)
    x=0;


    {
    if (PollSwitch()>=1)
    MotorDir(BREAK,BREAK);
    else
    MotorDir(FWD,FWD);
    }

    if (PollSwitch()>=1)
    MotorDir(RWD,RWD);


    if ( LANG > 1000)
    LANG=0;

    }

    return 0;
    }




    Den roten teil benütze ich bei anderen Teilen aber hier bringt er mir nichts weil ich ja nicht weiß wann asuro anstoßt

    Bei diesen Programm, habe ich das Problem das die dauer der Rückfahrt immer sehr kurz ist. (immer genau so lang bis der schalter wieder ausgefahren ist)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2006
    Beiträge
    5
    Hallo Markus,
    deine Bemerkung, dass du "nichts auftischen" wirst finde ich sehr " überheblich".
    Wenn du überhaupt in keiner Weise helfen willst - warum Antwortest du dann überhaupt?
    Ich bin auch Anfänger , und solche Antworten wie RTFM usw. motivieren ungemein.
    Ich bin schon etwas älter - wenn immer alles so gelaufen wäre????

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    So schlimm finde ich das nicht
    ich habe mal das Programm hereingetan es funkt aber noch nicht

    mfg

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    30.11.2006
    Beiträge
    5
    sorry,

    mfG
    oswald

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    nicht so schlimm

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von h_wood44
    Hallo Markus,
    deine Bemerkung, dass du "nichts auftischen" wirst finde ich sehr " überheblich".
    Wenn du überhaupt in keiner Weise helfen willst - warum Antwortest du dann überhaupt?
    Ich will durchaus helfen - Aber: Ich bevorzuge Hilfe zur Selbsthilfe. Nach meiner Erfahrung ist der Lerneffekt am größten wenn man selbst etwas erarbeitet hat. Außerdem mache ich keine Hausaufgaben anderer (was dieses Forum weniger betrifft, aber andere dafür umso mehr).

    Jetzt zum geposteten Code:
    Der ASURO macht genau das was du ihm "gesagt" hast: Wenn ein Taster gedrückt ist, stellst du die Motoren zuerst auf BREAK und gleich danach (Sekundenbruchteile danach um genau zu sein) auf RWD. Ab dem Augenblick ab dem die Taster keinen Wandkontakt mehr haben, konfigurierst du die Motoren wieder auf FWD.

    Was du brauchst:
    Eine Zeitbasis: Momentan führt dein ASURO die Schleife mit maximaler Geschwindigkeit aus - Wenn du darauf basierend versuchen würdest, über die Anzahl der Schleifendurchläufe eine Verzögerung zu realisieren, würde sich diese bei Änderungen im Code mit ändern. Es wäre daher sinnvoll, die Ausführungsgeschwindigkeit von vornherein zu reduzieren, auf vielleicht 10 oder 100 Iterationen in der Sekunde. Realisieren kannst du dies, indem du ans Ende der Schleife den sleep-Befehl stellst und eine entsprechende Verzögerung auswählst.

    Zustände: Du möchtest Dinge in Abhängigkeit von vorherigen Ereignissen ausführen, dafür musst du dir das in irgend einer Form merken. Für deine Wünsche gibt es zwei Möglichkeiten. Entweder du nimmst eine Zählervariable die auf einen bestimmten Wert gesetzt wird, wenn du Tasterkontakt hast. Gleichzeitig wird der Rückwärtsgang "eingelegt". In der Hauptschleife reduzierst du die Variable in jeder Iteration um eins, ist sie bei 0 angelangt, konfigurierst du den ASURO wieder auf vorwärts.
    Was erreichst du damit? Solange die Taster auslösen, wird die Variable auf den Verzögerungswert gesetzt und gehalten. Wenn die Taster nicht mehr auslösen, wird der Wert mit jedem Schleifendurchlauf reduziert. Da die Schleife aber nur begrenzt schnell läuft, kannst du aus der Zeit für eine Schleifeniteration bestimmen, wie lange der ASURO braucht bis er bei 0 angekommen ist und auf vorwärts umstellt.

    Wenn du später kompliziertere Programme schreiben willst,reicht dir der Trick mit der Zählvariable vielleicht nicht mehr aus, dann kannst du noch eine Zustandsvariable einführen. In deinem Fall gibt es (momentan) nur die Zustände: "Vorwärts" und "Rückwärts", es könnte aber auch sein dass du vielleicht noch einen Zustand "Bremsen" einführen möchtest ...
    Dann wird einfach im Ereignis das den Zustandswechsel auslöst der neue Zustand und die Verzögerungsvariable gesetzt. Nachdem die Zeit für den Zustand abgelaufen ist, kann dann anhand des alten Zustands entschieden werden, ob und wenn ja, welcher Zustand der Neue sein soll.

    Das war jetzt vielleicht etwas viel auf einmal, wenn ich morgen Zeit haben sollte, kann ich dir evtl. mit einem kurzen Codeschnipsel zeigen wie das ganze gemeint ist.

    mfG
    Markus

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    Code:
    #include "asuro.h"
    int main (void)
    {
       Init();
    	int z;
       
       MotorSpeed(110,100);
      
      while(1)
    {
       
       
    if (PollSwitch()< 1) 
    	{MotorDir(FWD,FWD);
    		BackLED(ON,OFF);}
    else
    	{MotorDir(FWD,RWD);
    	BackLED(OFF,ON);}
    			for(z=0 ; z < 230 ; z++){Sleep(216);}
    	  
    MotorDir(FWD,FWD);	  
     
    
    	
    	
    	
    }
    
    return(0);
    }

    Das funkt jetzt vielen dank für die Hilfe
    kenn mich voll aus

Berechtigungen

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

12V Akku bauen