- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Labyrinth

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76

    Labyrinth

    Anzeige

    Praxistest und DIY Projekte
    hallo möchte meinen asuro im labyrinth fahren lassen.

    meine grundidee war:

    stößt er gegen eine wand, soll er rückwärtsfahren und sich um 90 grad nach links drehen und weiterfahren. stößt er dann ein 2. mal gegen die wand soll er sich um 180 grad drehen und weiterfahren.

    leider dreht sich mein asuro nur um ca. 60 grad und macht auch beim 2. mal anstoßen an die wand nur dies und dreht sich nicht um 180 grad. hier ist mal mein programm:

    #include "asuro.h"
    #include "myasuro.h"

    int main(void)
    {
    Init();
    while(1)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    if (PollSwitch())
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(RWD,BREAK);
    Msleep(300);
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    }
    if (PollSwitch())
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(RWD,BREAK);
    Msleep(300);
    MotorSpeed(100,100);
    Msleep(200);
    }
    }
    }


    kann mir jemand meinen fehler zeigen???

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    es liegt an irgendwelchen zahlenwerten, dir dafür zuständig sind wie lange sich der asuro in einer betimmten bewegung aufhält, aber welche ist das??
    oder muss ich vielleicht geschwindigkeiten verändern?
    habe mir gedacht zum beispiel beim 1. if für die drehbewegung MOTORSPEED(0,150); dann fährt er nach links
    und bei der 2. bewegung (für 180 grad) MOTORSPEED(150,150); MOTORDIE(RWD,FWD) dann müsste er genau doppelt so viel grad überbrücken wie beim ersten mal drehen, und dann müsste ich an sich doch nur mit den 150 varrieren, dass ich wirklich 90 grad bekomme. dann kann ich ja das mit RWD und BREAK weg lassen oder???
    also:

    #include "asuro.h"
    #include "myasuro.h"

    int main(void)
    {
    Init();
    while(1)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    if (PollSwitch())
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(FWD,FWD);
    MotorSpeed(0,150);
    Msleep(300);
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    }
    if (PollSwitch())
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(RWD,FWD);
    MotorSpeed(150,150);
    Msleep(300);
    MotorSpeed(100,100);
    Msleep(200);
    }
    }
    }

    könnte das so richtig sein???

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.01.2009
    Ort
    Kaiserslautern, Germany, Germany
    Alter
    35
    Beiträge
    77
    Hi Asuro11,

    es gibt hier im Forum ein extra Asuro unterforum. Aber ich versuch dir auch hier zu helfen.

    Problem ist das Asuro nicht immer gleich lang brauch für Drehungen (unterschiedliche Reibung führt z.B. zu verzögerungen) daher ist eine zeitliche Zuordnung zwischen Winkel und Geschwindigkeit nicht so leicht möglich. Du könntest aber auf deinem Untergrund durch Versuche die Zeiten ändern. Ich markiere dir dazu unten die Stellen im Quelltext.

    Für genaue Drehungen gibt es die Odometrie (das Ding mit dem Schwaz-Weiß Aufkleber auf den Rädern). Da ein direkter Einstieg in die Odometrie etwas kompliziert ist solltest du vll einstmal anfangen mit der erweiterten Befehlsbibliothek von m.a.r.v.i.n. Diese gibt es hier im Asuro Unterforum. Mit dieser kannst du direkt über einen C-Befehl Asuro um eine bestimmte Gradzahl drehen lassen.

    Außerdem stimmt in deinem Programm etwas nicht: Du hast 2 gleiche if Bedingungen drin. Das ist ein Logikproblem. Du willst so weit ich verstehe beim ersten Anstoßen um 90Grad drehen und beim 2. um 180. Dabei müsste der Code so aussehen:

    ACHTUNG! Ich habe nur den Code so verändert das beide Anweisungen wie gewollt ausgeführt werden. Werte sind nicht korrigiert!!

    Code:
    #include "asuro.h"
    #include "myasuro.h"
    
    int main(void)
    {
    
    int x=1;           //X Variable als Zähler einführen und auf 1 setzen
    Init();
    while(1)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    if ((PollSwitch()) && (x=1))   //Wenn Tastendruck und x=1
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);                          
    MotorDir(FWD,FWD);
    MotorSpeed(0,150);
    Msleep(300);                      //80Grad Drehung
    MotorDir(FWD,FWD);          //Zeile kannste weg lassen
    MotorSpeed(100,100);      //Zeile kannste weg lassen
    Msleep(200);                     //Zeile kannste weg lassen
    x++;                                  //x um 1 erhöhen (x wird 2)
    }
    if ((PollSwitch()) && (x=2))  //Wenn Tastendruck und x=2 (2. Tastendruck)
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(RWD,FWD);
    MotorSpeed(150,150);
    Msleep(300);                       //Drehung 90Grad (Siehe Bemerkung unten)
    MotorSpeed(100,100);
    Msleep(200);                      //+Drehung 90Grad(Siehe Bemerkung unten)
    x--;                             //x um 1 verringern (x wird wieder 1)
    }
    }
    }
    Den Teil
    Code:
    MotorDir(RWD,FWD);
    MotorSpeed(150,150);
    Msleep(300);                       //Drehung 90Grad (Siehe Bemerkung unten)
    MotorSpeed(100,100);
    Msleep(200);                      //+Drehung 90Grad(Siehe Bemerkung unten)
    Kanste ändern in
    Code:
    MotorDir(FWD,FWD);
    MotorSpeed(0,150);
    Msleep(300);  
    Msleep(300);

    Im Text oben würde abwechselnd die erste if bedingung und die 2. if Bedinung eintreten also zuerst um 90Grad drehn dann um 180Grad drehn.


    außerdem fehlt am ende die return 0; anweißung


    Gruß
    Thomas

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    ok danke, ist die x variable sozusagen ein zähler wie oft er jetzt an die wand gestoßen ist. oder?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.01.2009
    Ort
    Kaiserslautern, Germany, Germany
    Alter
    35
    Beiträge
    77
    genau das x++; erweitert die variable um 1 dann wird die 2. Schleife abgespielt. Das x--; in der 2. Schleife vermindert die variable um 1 und die erste Schleife wird wieder abgespielt.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    habe jetzt das programm:


    #include "asuro.h"
    #include "myasuro.h"

    int main(void)
    {

    int x=1; //X Variable als Zähler einführen und auf 1 setzen
    Init();
    while(1)
    {
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    Msleep(200);
    if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(FWD,FWD);
    MotorSpeed(0,195);
    Msleep(300); //90Grad Drehung
    x++; //x um 1 erhöhen (x wird 2)
    }
    if ((PollSwitch()) && (x=2)) //Wenn Tastendruck und x=2 (2. Tastendruck)
    {
    MotorDir(RWD,RWD);
    MotorSpeed(100,100);
    Msleep(300);
    MotorDir(FWD,RWD);
    MotorSpeed(195,195);
    Msleep(300);
    MotorSpeed(195,195);
    Msleep(300); //Drehung 90Grad
    //+Drehung 90Grad
    x--; //x um 1 verringern (x wird wieder 1)
    }
    }
    return 0;
    }




    aber die 2. klammer will er mmer noch nicht machen???

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    hat denn keiner meinen fehler entdeckt?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    17.01.2009
    Ort
    Kaiserslautern, Germany, Germany
    Alter
    35
    Beiträge
    77
    Gibts denn beim Compilen nen Fehler oder nur beim Ausführen?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    ne nur beim ausführen...ist irgendein fehler im prorgramm denke ich...

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    76
    habe mir überlegt anstatt mit x=1 und x=2 (also mit x++ und x--) nur mit x++ zu arbeiten. würde dann eben anstatt x=1 sagen wenn x ungerade ist mach die erste schleife. wenn x gerade dann die 2. gibt es denn einen befehl für gerade und ungerade??

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests