-
        

Ergebnis 1 bis 2 von 2

Thema: Problem duch Kombination: Linienverfolgung & Batteriezus

  1. #1
    Neuer Benutzer
    Registriert seit
    23.09.2005
    Ort
    Grimma
    Beiträge
    2

    Problem duch Kombination: Linienverfolgung & Batteriezus

    Anzeige

    Guten Morgen allerseits !


    Hab folgendes Problem:

    Ich möchte meinen Asuro in Dauerbetrieb nehmen. Später soll er bei einem geringen Batteriestand die Ladestation aufsuchen. Momentan bin ich noch in der Anfangsphase und habe bisher folgenden Code:


    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    #define maxspeed 130
    #define medspeed 120 
    #define quadteiler 30 
    
    int speedLeft,speedRight, sR, sL, i; 
    unsigned int lineData[2]; 
    
    void Line (void) 
    { 
       speedRight = medspeed - ((i*abs(i))/quadteiler); 
       speedLeft = medspeed + ((i*abs(i))/quadteiler); 
       if (speedRight > maxspeed) speedRight = maxspeed; 
       if (speedLeft > maxspeed) speedLeft = maxspeed; 
       if (speedRight < -maxspeed) speedRight = -maxspeed; 
       if (speedLeft < -maxspeed) speedLeft = -maxspeed; 
          if (speedRight < 0) {MotorDir (FWD,RWD); sR=-speedRight;sL=speedLeft;} 
          else if (speedLeft < 0) {MotorDir (RWD,FWD); sL=-speedLeft;sR=speedRight;} 
          else {MotorDir(FWD,FWD);sL=speedLeft;sR=speedRight;} 
    } 
    
    int main(void) 
    { 
       Init(); 
       
       FrontLED(ON); 
       for (i = 0; i < 0xFF; i++) LineData(lineData); 
       speedLeft = speedRight = 120; 
       for(;;) { 
           
          LineData(lineData); 
          i = lineData[0] - lineData[1]; 
          if (i > 0) { 
             StatusLED(GREEN); 
             Line(); 
             } 
          else if (i < 0) { 
             StatusLED(RED); 
             Line(); 
             } 
          else { 
             StatusLED(OFF); 
             speedLeft = speedRight = medspeed; 
             MotorDir(FWD,FWD); 
             sL=speedLeft;sR=speedRight; 
          } 
          MotorSpeed(sL,sR); 
    	  SerWrite("Akkuladung: ",12);	 
          PrintInt(Batterie());
          SerWrite("\n\r",3);
    	  
    	  
       } 
    }

    Bei diesem Code, ist allerdings die Linienverfolgung miserabel. Könnte mir jemand einen Tipp geben, wie man es optimieren könnte ?


    Und noch eine Frage:
    Kann man die Akkus auch aufladen, wenn der Asuro eingeschaltet ist ?


    ===========================
    Vielen Dank!

  2. #2
    Neuer Benutzer
    Registriert seit
    23.09.2005
    Ort
    Grimma
    Beiträge
    2
    Hab ein erneutes Problem. Das folgende Programm funktioniert nach meiner Zufriedenheit:

    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    #define maxspeed 130
    #define medspeed 120  
    #define quadteiler 30 
    
    int speedLeft,speedRight, sR, sL, i; 
    unsigned int lineData[2];
    unsigned int zaehler = 0;
    int bat;
    
    void Line (void) 
    { 
       speedRight = medspeed - ((i*abs(i))/quadteiler); 
       speedLeft = medspeed + ((i*abs(i))/quadteiler); 
       if (speedRight > maxspeed) speedRight = maxspeed; 
       if (speedLeft > maxspeed) speedLeft = maxspeed; 
       if (speedRight < -maxspeed) speedRight = -maxspeed; 
       if (speedLeft < -maxspeed) speedLeft = -maxspeed; 
          if (speedRight < 0) {MotorDir (FWD,RWD); sR=-speedRight;sL=speedLeft;} 
          else if (speedLeft < 0) {MotorDir (RWD,FWD); sL=-speedLeft;sR=speedRight;} 
          else {MotorDir(FWD,FWD);sL=speedLeft;sR=speedRight;} 
    } 
    
    int main(void) 
    { 
       Init();
       FrontLED(ON); 
       for (i = 0; i < 0xFF; i++) LineData(lineData); 
       speedLeft = speedRight = 200; 
       for(;;) { 
          zaehler++;
    	  if (zaehler == 2500)  {
    	    bat = Batterie();
    	    zaehler = 0;
    	    PrintInt(bat);
            if(bat > 550){
              StatusLED(GREEN);
    		}
    		else{
    		  StatusLED(RED);
    		}
    	  }
          LineData(lineData); 
          i = lineData[0] - lineData[1]; 
          if (i > 0) {  
             Line(); 
             } 
          else if (i < 0) { 
             Line(); 
             } 
          else { 
             speedLeft = speedRight = medspeed; 
             MotorDir(FWD,FWD); 
             sL=speedLeft;sR=speedRight; 
          } 
          MotorSpeed(sL,sR); 
       } 
    }




    Nun brauch i das Programm ohne Linienverfolgung - hab mir folgendes gedacht:


    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    
    unsigned int zaehler = 0;
    int bat;
    
    
    
    int main(void) 
    { 
       Init();
      
       for(;;) { 
          zaehler++;
    	  if (zaehler == 2500)  {
    	    bat = Batterie();
    	    zaehler = 0;
    	    PrintInt(bat);
            if(bat > 550){
              StatusLED(GREEN);
    		}
    		else{
    		  StatusLED(RED);
    		}
    	  }
          
       } 
    }
    Jedoch werden jetzt ganz andere Werte, als vorher ausgeben. Beim obersten Programm Werte um 580 beim unteren Programm Werte von 830 ?

    Kann jemand helfen ?

    oder weiß jemand welche Werte bei der Batterie-Funktion ausgegeben werden müssten ?

    Danke

Berechtigungen

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