- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Fertiges Labyrinthprogramm!!!!

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    23.04.2009
    Alter
    38
    Beiträge
    24
    Anzeige

    E-Bike
    Hallo Valen,
    vielen dank für deinen Tip, leider habe noch nichts mit der SerWrite Funktion gemacht und weis daher nicht wie und wo ich da was einbinden muss.

    Hättest du vielleicht Zeit mir das zu machen? Wäre echt nett!

    Ich bin jetzt beim weiteren herumtesten mit dem Prog so weit gekommen, dass nach einem Tasterdruck die Funktion Firstcol() aktiviert wird.

    Er bleibt also kurz stehen und bleibt dann bei Zurueck() hängen. Es sieht für mich im Moment so aus als würde irgendwas verhindern, dass der Encoder initialisiert wird und dadurch die Go Funktion unendlich ausgeführt wird, weil keine daten von der Odometrie gemessen werden.

    MfG
    G3tzR@zor

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Code:
    void Fahren(void)                               /* Vorwärts fahren */ 
    {
        SerWrite ("FhS", 3);                         /* "Fahren start" senden uber IR*/
     
        unsigned int data[2]; 
        signed int status[2]={0,0}; 
        signed int difference=0; 
        MotorDir(FWD, FWD);
    ...
    ...
            // Z?ldifferenz passend auf die Motoren verteilen 
            if (difference>0) MotorSpeed(180-difference,180); 
            else MotorSpeed(180,180+difference); 
         }
     
      SerWrite("FhE",3);             /* "Fahren Ende" senden uber IR*/
    }
    Und ähnliche codes. Zum beispiel:

    MS,ME: Main start und ende.
    FcS, FcE: Firstcol start und ende,
    ScS, ScE: Secondcol start und ende,
    usw. fur die andere functionen in dein program.

    Und vieleicht die ADC werten auch ubermitteln. Aber das konnte zuviel daten werden zum ubertragen. [Edit] Dafur ist aber PrintInt besser ge-eignet. Lies mahl print.c im lib verzeichnis durch.

    Am ende hast du auch eine while(1) schleife (nach dem Disco anruf). Besser dort auch etwas senden damit du weist er wird da immer stecken bleiben.

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    23.04.2009
    Alter
    38
    Beiträge
    24
    Hallo Valen,
    vielen dank für deine schnelle Hilfe!
    Ich habs mal getestet und funktioniert wunderbar. Es hat sich nun herausgestellt, dass er wirlich in dem Programmteil "Zurueck()" hängen bleibt.
    Hiermit bin ich eigendlich davon überzeugt, dass der befehl "Encoder_Init()" nicht ausgeführt wird.

    Hab natürlich gleich mal getestet, was passiert wenn ich in "Zurück()" das "Encoder_Init()" raus nehme. Danach ergab sich das selbe Verhalten, was mir sagt, dass das initialisieren der Odometrie an der Stelle einfach übersprungen wird.

    Kann es sein, dass durch die Regelung in "Fahren()" die odometrie noch aktiv ist und durch das "Encoder_Init()" ausgeschaltet wird?

    Ich hoffe, dass wir mit dem Wissen nun etwas weiter kommen.

    MfG,
    G3tzR@zor

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Ich hab auch keine "Encoder_Init" in meiner lib 2.80rc1. Nur "EncoderInit". Bist du sicher den compiler hat daruber nicht geklagt. Such mahl deine lib quell code dateien durch ob da irgendwo diesen "Encoder_Init" steckt.

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    23.04.2009
    Alter
    38
    Beiträge
    24
    Ohh mann, vielen dank, das war der rettende Gedanke! Ich hatte vergessen nach der neuen Installation der Lib 2.80rc1 auch die Dateien "asuro.c, asuro.h und myasuro.h" in meinem Projektverzeichnis auszutauschen.

    In der alten Lib 2.7x(weis nicht mehr genau) war das noch Encoder_Init, dies hat sich mit der neuen geändert.

    Nachdem ich die Dateien ausgetauscht und neu compiliert hatte funktionierte das Programm ohne gößere probleme!

    Ich hätte überall den Fehler gesucht nur nicht in der Lib!

    Muss nun nur noch ein paar kleinere fehler behben. Da der Asuro im moment noch zu schnell durch das Labyrint fährt, erfolgt die nächste Kollision noch bevor die erste Zeitschleife abgelaufen ist.

    Ich werde dies noch Verbessern und dann den entgültigen Programmcode hier posten.

    @ valen...Nochmal vielen vielen Dank du warst meine Rettung! =D>

    Wünsch dir noch nen schönen Feiertag!
    G3tzR@zor

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Keinen dank, den unterstrich war mir auch komplet nicht aufgefallen.

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    23.04.2009
    Alter
    38
    Beiträge
    24
    **********kleine INFO***********
    Ich habe das Programm nun fertig und auch komplett dokumentiert! Da es sich bei dem Programm um ein Abschlussprojekt für meinen Techniker handelt, das ich bis nächste Woche Donnerstag abegeben muss, kann ich im Moment den finalen Code noch nicht posten.

    Also ich habe euch nicht Vergessen und sobald ich meine Note bekommen habe werde ich den Code veröffentlichen, damit auch alle etwas davon haben!

    Gruß
    G3tzR@zor

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    23.04.2009
    Alter
    38
    Beiträge
    24
    Hi...hier bin ich mal wieder. Da die Noten für das Projekt nun fest stehen kann ich nun den Code posten.

    Code:
    /***************************Bibliotheken einbinden*****************************/
    #include "asuro.h"
    #include "myasuro.h"
    
    /*******************Defines und Variablen für Fahren Regelung******************/
    
    unsigned int data[2];        //Speicherplatz für Odometriedaten bereitstellen
    signed int status[2]={0,0};  // Variable zur Bestimmung der Hell/Dunkel wechsel
    signed int difference=0;    // Variable zur regelung der Motorgeschwindigkeit
    
    #define TRIGGERLEVEL 650      //Schwellwert für Hell/Dunkel übergänge
    #define HYSTERESIS 10         // Ausgleich von Messfehlern
    #define LOW 0                 // Definition für Dunkel
    #define HIGH 1                // Definition für Hell
    #define keine_taste (PINC & (1<<PC4)) //Taster direkt abfragen
    
    
    /************Variablen für Zeitvorgaben zwischen den Kollisionen***************/
    
    unsigned long meineZeit;
    unsigned long meineZeit2;
    
    /**************Speicherplatz für Liniendaten bereitstellen*********************/
    
    unsigned int umgebung[1];
    
    /***Variable für Dunkelerkennung, damit der Asruro im Dunkeln stehen bleibt****/
    int dunkel;
    
    /**************************Vorwärts fahren*************************************/
    
    void Fahren(void)
    {
        // Prozessor neu initialieren um EncoderInit() zurückzusetzen
        // da sonst die Regelung nicht mehr funktioniert
        Init();
        FrontLED(ON);
        ;
        //Motor Drehrichtung bestimmen
        MotorDir(FWD, FWD);
    
         // so lange gerade aus fahren bis ein Taster gedrückt wird
         // und es hell genug ist
            while((keine_taste) && (umgebung[0]>1))
        {
            LineData(umgebung);
            // Helligkeitswerte der Lichtschranken auslesen
            OdometrieData(data);
    
            // Wechsel linker Sensor von niedrig auf hoch?
            if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
                status[0]=HIGH;
                difference++;
            }
            // Wechsel linker Sensor von hoch auf niedrig?
            if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
                status[0]=LOW;
                difference++;
            }
            // Wechsel rechter Sensor von niedrig auf hoch?
            if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
                status[1]=HIGH;
                difference--;
            }
            // Wechsel rechter Sensor von hoch auf niedrig?
            if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
                status[1]=LOW;
                difference--;
            }
            // zur Sicherheit: verhindern, dass der Differenzzäler
            // den erlaubten Wertebereich verlässt
            if (difference<-255) difference=-255;
            if (difference>255) difference=255;
    
            // Status-LED noch entsprechend der erkannten Segmente
            // aufleuchten lassen, grun für links, rot für rechts
            StatusLED(status[0]+status[1]*2);                       
    
            // Zäldifferenz passend auf die Motoren verteilen
            if (difference>0) MotorSpeed(190-difference,190);
            else MotorSpeed(190,190+difference);
        }
      Dunkel ();
    }
    
    /********Einzelfunktionen für Verarbeitung in First-,Second und Thirdcol********/
    
    void Anhalten(void)                        /* Anhalten */
    {
      StatusLED(RED);
      BackLED(OFF,OFF);
      MotorDir(BREAK,BREAK);
    }
    
    void Zurueck(void)                         /* 20mm Zurück fahren */
    {
      EncoderInit();
      GoTurn(-40,0,200);
    }
    
    
    void KurveR(void)                          /* 90° Kurve Rechts  */
    {
     EncoderInit();
     GoTurn(0,90,200);
    }
    
    void KurveL(void)                          /* 90° Kurve Links */
    {
     EncoderInit();
     GoTurn(0,-90,200);
    }
    
    void Drehung(void)                         /*180° Drehung*/
    {
     EncoderInit();                                                 
     GoTurn(0,180,200);
    }
    /****************Programm Rechtskurve im Parcour 1. Kollision******************/
    
    void Firstcol(void)
    {
      Anhalten();
      Msleep(250);
    
      Zurueck();
    
      Anhalten();
      Msleep(10);
    
      KurveR();
    
      Anhalten();
      Msleep(250);
    
      meineZeit=Gettime();    //Aktuelle Prozessorzeit für Kollisionserkennung
                              //in meineZeit speichern
      switched = 0;
      StartSwitch ();
    }
    
    /*****************Programm Linkskurve im Parcour, 2. Kollision*****************/
    
    void Secondcol(void)
    {
      Anhalten();
      Msleep(250);
    
      Zurueck();
    
      Anhalten();
      Msleep(250);
    
      Drehung();
    
      Anhalten();
      Msleep(250);
    
      meineZeit2=Gettime();        //Aktuelle Prozessorzeit für Kollisionserkennung
                                   // in meineZeit2 speichern
    
      switched = 0;                // Kollisionserkennung auf 0 setzen
      StartSwitch();               // Taster-Interrupt aktivieren
    }
    
    /*****************Programm Sackgasse im Parcour, 3. Kollision******************/
    
    void Thirdcol(void)
    {
      Anhalten();
      Msleep(250);
                   
      Zurueck();
    
      KurveL();
    
      Anhalten();
      Msleep(250);
    
      switched = 0;                         // Kollisionserkennung auf 0 setzen
      StartSwitch();                        // Taster-Interrupt aktivieren
    
    }
    
    /******Abfrage der Liniensensoren um Helligkeit der Umgebung festzustellen*****/
    void Dunkel (void)
    {
                  LineData(umgebung);
                  if (umgebung[0]<1)
                  {
                  dunkel = 1;
                  }
    
                  else if(umgebung[0]>1)
                  {
                  dunkel = 0;
                  }
    }
    
    /*****Wird ausgeführt, wenn der Asuro das ende des Labyrinths erreicht hat!****/
    /*******Ende des Labyrints muss durch eine Einhausung abgedunkelt werden!******/
    void Ziel(void)
    {
      int i;
      for(i = 0; i < 16; i++)    /* Asuro steht im Dunkeln, Ziel erreicht*/
      {
       MotorDir(FWD,FWD);
       MotorSpeed(50,50);
       BackLED(OFF,OFF);
       StatusLED(OFF);
       FrontLED(OFF);
       Msleep(200);
    
       MotorDir(BREAK,BREAK);
       BackLED(ON,ON);
       StatusLED(RED);
       FrontLED(ON);
       Msleep(200);
       }
       dunkel=0;
    }
    
    /*****************************Hauptprogrammbeginn******************************/
    
    int main (void)
    {
      Init ();                              // Prozessor initialisieren
    
      StatusLED(RED);                       // 3 Sekunden Countdown zum Start,
      Msleep(1000);
      StatusLED(YELLOW);                    // Status Led wird im Sekundentakt
      Msleep(1000);
      StatusLED(GREEN);                     // von Rot über Gelb zu Grün geschaltet
      Msleep(1000);
      FrontLED(ON);
      switched = 0;                         // Kollisionserkennung auf 0 setzen
      StartSwitch ();                       // Taster-Interrupt aktivieren
    
    
    /********************Endlosschleife für Zustandsabfrage************************/
    
      while(1)
      {
    
    /******************Wenn 1. Kollision, dann Rechtskurve 90°*********************/
    
        if ((switched == 1)&&(Gettime()>meineZeit+1000)&&(Gettime()>meineZeit2+600))
        {                                                                                       
              Firstcol();
          }
    /*********Wenn 2. Kollision innerhalb 1s nach abarbeitung von Firstcol*******/
    
          else if ((switched == 1)&&(Gettime()<meineZeit+1000))
            {
              Secondcol();
             }
    
    /********Wenn 3. Kollision innerhalb 0,6s nach abarbeitung von Secondcol*******/
    
               else if ((switched == 1)&&(Gettime()<meineZeit2+600))
                {
                 Thirdcol();
                }
    
    /**************************Wenn umgebung zu dunkel*****************************/                                                                
    
                    else if(dunkel==1)
                    {
                    Ziel();
                    }
    
    /*********************Wenn keine Kollision, Fahre normal***********************/
    
                    else
                       {
                       Fahren();
                       }
    
    
      }
    
    /*********************Endlosschleife - Ende des Programmes*********************/
    /*****Um zu verhindern, dass eventuell alte Programmteile aufgerufen werden****/
    /*********************die sich noch im Speicher befinden***********************/
    
     while(1);
     return 0;
    }
    Folgende Dinge müsst ihr beim Bau des Labyriths beachten!!!
    1. Es muss rechtwinklig aufgebaut sein
    2. Bei Sackgassen muss der Lösungsweg gegenüber der Sackgasse liegen

    Bei Meinem Asuro hab ich folgendes verbessert:
    1. Odometriesensoren abgedunkelt mit schwarzem Papier
    2. Die Odometriescheiben(12er) habe ich mit hilfe von Kabelisolierung, die ich über die Welle geschoben habe befestigt um den Abstand zu den Sensoren gleich zu halten.

    Hab euch noch 2 Bilder von den Verbesserungen und das .hex file gepostet und ein kleines Video bei Youtube hoch geladen.

    Videolink: http://www.youtube.com/watch?v=JB6F8HWTHLE

    So nun wünsch ich euch viel Spass und Erfolg mit dem Code.

    P.S. Das Programm funktioniert nur mit der aktuellen, erweiterten Lib aus dem Roboternetz Forum.

    Ein großes danke Schön an die, die die Lib entwickeln, einfach spitze was ihr da mittlerweile auf die Beine gestellt habt.

    Gruß
    G3tzR@zor
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken 100_5396__medium_.jpg   100_5395__medium_.jpg  

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Super!!!

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Auch ein SUPER von mir.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen