-         
Ergebnis 1 bis 4 von 4

Thema: fahren im kreis

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379

    fahren im kreis

    Anzeige

    hi allerseits,
    nun habe ich schon den halben tag mit diesem progrämmchen verbracht, es mit kommentaren versehen um es zu verstehen - sind die richtig?
    Code:
    #include "asuro.h" 
    #define SPEED  200 
    int speedLeft,speedRight; 
    unsigned int lineData[2]; 
    int ADOffset; 
    void LineLeft (void) //fahre nach rechts zu linie
    { 
       speedRight  -=2; //rechts bremsen
       if (speedRight < 100) speedRight = 100; //min speed rechts
    } 
    void LineRight (void) //fahre nach links zu linie
    { 
       speedLeft  -=2; //links bremsen
       if (speedLeft < 100) speedLeft = 100; //min speed links
    } 
    void LineDemo(void) 
    { 
    int i; 
    unsigned char j; 
       FrontLED(ON); 
       for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re
       LineData(lineData); 
       ADOffset = lineData[0] - lineData[1]; 
       speedLeft = speedRight = SPEED; 
       MotorSpeed(speedLeft,speedRight); 
       for(;;) { 
          LineData(lineData); 
          i = (lineData[0] - lineData[1]) - ADOffset; 
    	  SerWrite("\n\r  i: ",9); 
    	  PrintInt(i);
          if ( i > -50) { 
             //StatusLED(GREEN);
    		 BackLED(OFF,ON); //blinker rechts
             LineLeft(); //fahre nach rechts zu linie
          } 
          else if ( i < 100) { 
             //StatusLED(RED); 
    		 BackLED(ON,OFF); //blinker links
             LineRight(); //fahre nach links zu linie
          } 
          else { 
             StatusLED(YELLOW); 
             speedLeft = speedRight = SPEED; 
          } 
          MotorSpeed(speedLeft,speedRight); 
       } 
    } 
    int main(void) 
    { 
       Init(); 
       LineDemo (); 
       while(1); 
       return 0; 
    }
    die "i" werte habe ich mir ausgeben lassen, sie verändern sich m.e. nach richtig (bzw. die reaktion des programms ist richtig), je nachdem ob ich beim aufgebockten asuro den schwarzen streifen unter den linken, oder rechten transistor drunterschiebe, die LED´s leuchten auf, die räder bremsen ab.
    Komisch ist nur, dass nach dem abbremsen die geschwindigkeit niedrig bleibt und dass, wenn ich den asuro auf dem testblatt fahren lasse diese nur rechtsherum im kreis fährt. Woran kann das liegen?
    Hängt es vielleicht von den am anfang (beim starten des asuro) eingelesenen 255 werten ab? Ob überm weissen hintergrund, oder ein sensor schwarz, der andere weiss?

    gruß inka

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    55
    Beiträge
    5.789
    Blog-Einträge
    8
    Hallo

    Mit etwas Glück und gleichmässiger Raumbeleuchtung fährt mein asuro nun mit deinem leicht geänderten Programm nach dunklen Fliesenfugen:

    Code:
    #include "asuro.h"
    #define SPEED  200 
    int speedLeft,speedRight; 
    unsigned int lineData[2]; 
    int ADOffset; 
    void LineLeft (void) //fahre nach rechts zu linie 
    { 
       speedRight  -=2; //rechts bremsen 
       if (speedRight < 100) speedRight = 100; //min speed rechts 
    } 
    void LineRight (void) //fahre nach links zu linie 
    { 
       speedLeft  -=2; //links bremsen 
       if (speedLeft < 100) speedLeft = 100; //min speed links 
    } 
    void LineDemo(void) 
    { 
    int i; 
    
    unsigned char j;
       FrontLED(ON);
       // Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei! 
       for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re 
       //  Hier beginnt der Ernst des asurolebens
       LineData(lineData);
       // bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig 
       // berechnet und als adoffset gespeichert das gibt Probleme bei
       // Helligkeitsänderungen von der Seite bei der Fahrt.
       // Es wird dann später auf grösser/kleiner null geprüft.
       ADOffset = lineData[0] - lineData[1];
       speedLeft = speedRight = SPEED;
       MotorSpeed(speedLeft,speedRight);
       for(;;) {
          LineData(lineData);
          i = (lineData[0] - lineData[1]) - ADOffset;
         SerWrite("\n\r  i: ",9);
         PrintInt(i);
    
    /*  dadurch muss auch darauf geprüft werden, also i<0 oder i>0
         aber bei i==0 darf nichts passieren, sonst ewige Kurve!
         deshalb vorsichtshalber 3 vollwertige ifs
    */
          if ( i > 0 ) {
             //StatusLED(GREEN);
           BackLED(OFF,ON); //blinker rechts 
             LineLeft(); //fahre nach rechts zu linie 
          }
          if ( i < 0) {
             //StatusLED(RED); 
           BackLED(ON,OFF); //blinker links 
             LineRight(); //fahre nach links zu linie 
          } 
          if ( i == 0) {
             StatusLED(YELLOW); 
             speedLeft = speedRight = SPEED; 
          } 
          MotorSpeed(speedLeft,speedRight); 
       } 
    } 
    int main(void) 
    { 
       Init(); 
       LineDemo (); 
       while(1); 
       return 0; 
    }
    Nachtrag: Mit einer Geschw. Korrektur von +-5 macht er's etwas besser! Ich setze den asuro beim Start ungefähr mittig in Fahrtrichtung auf die Linie.

    Gruß

    mic

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

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    hi mic,
    meiner fährt mit deinem programm geradeaus - aber sehr geradeaus!

    gruß inka

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    55
    Beiträge
    5.789
    Blog-Einträge
    8
    Klar, sobald er den Strich verlässt gilt Bedingung 3: Mit SPEED vorwärts.

    Hier sind wir nun am Beginn eines tollen neuen Linienfolgeprogramms made by inka ...

    Nachtrag: Das ist mir natürlich peinlich, aber man sollte immer die Version Posten die auch im asuro läuft. Es war oben ein Bug drin, bei i==0 wurde MotorSpeed erst nach der } gesetzt. Sorry. Hier das selbe mit Korrektur:
    Code:
    #include "asuro.h"
    #define SPEED  200 
    int speedLeft,speedRight; 
    unsigned int lineData[2]; 
    int ADOffset; 
    void LineLeft (void) //fahre nach rechts zu linie 
    { 
       speedRight  -=5; //rechts bremsen
       if (speedRight < 100) speedRight = 100; //min speed rechts 
    } 
    void LineRight (void) //fahre nach links zu linie 
    { 
       speedLeft  -=5; //links bremsen 
       if (speedLeft < 100) speedLeft = 100; //min speed links 
    } 
    void LineDemo(void)
    { 
    int i; 
    
    unsigned char j; 
       FrontLED(ON); 
       // Die folgende Mehrfachabrage der LineDatas ist völlig sinnfrei! 
       for (j = 0; j < 255; j++) LineData(lineData); //differenzberechnung li-re 
       //  Hier beginnt der Ernst des asurolebens 
       LineData(lineData); 
       // bei data[0]=data[1] ist adoffset=0 d.H. der Unterschied wird einmalig 
       // berechnet und als adoffset gespeichert das gibt Probleme bei 
       // Helligkeitsänderungen von der Seite bei der Fahrt. 
       // Es wird dann später auf grösser/kleiner null geprüft. 
       ADOffset = lineData[0] - lineData[1]; 
       speedLeft = speedRight = SPEED; 
       MotorSpeed(speedLeft,speedRight); 
       for(;;) { 
          LineData(lineData); 
          i = (lineData[0] - lineData[1]) - ADOffset; 
         SerWrite("\n\r  i: ",9); 
         PrintInt(i); 
    
    /*  dadurch muss auch darauf geprüft werden, also i<0 oder i>0 
         aber bei i==0 darf nichts passieren, sonst ewige Kurve! 
         deshalb vorsichtshalber 3 vollwertige ifs 
    */ 
          if ( i > 0 ) { 
             //StatusLED(GREEN); 
           BackLED(OFF,ON); //blinker rechts 
             LineLeft(); //fahre nach rechts zu linie 
          } 
          if ( i < 0) { 
             //StatusLED(RED); 
           BackLED(ON,OFF); //blinker links 
             LineRight(); //fahre nach links zu linie 
          } 
          if ( i == 0) { 
             StatusLED(YELLOW); 
             speedLeft = speedRight = SPEED; 
          MotorSpeed(speedLeft,speedRight);
          } 
       }
    }
    int main(void) 
    { 
       Init(); 
       LineDemo (); 
       while(1); 
       return 0; 
    }
    Das ganze ist natürlich nicht optimal. Der in adoffset gespeicherte Wert gilt nur für den Startpunkt, wirkt sich aber immer aus! Wie geschrieben, viel Spass beim Entwickeln eines eigenen Programms.

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

Berechtigungen

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