- LiFePO4 Speicher Test         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 26 von 26

Thema: Programmierproblem

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Im Moment ist bei meinem ASURO incl. US die Odometrie nicht kalibriert, aber probiere das mal so:
    Code:
    #include "asuro.h" //incl. US
    
    int abstand=0;
    int j=0;
    
    void fahren (void)
    {
       //EncoderInit();
       Go (200,150);
       Msleep(1000);
       Turn (85,150);
       Msleep(1000);
    }
    
    void entfernung(void)
    {
      SerWrite("\r\n  --- ultrasonic test ---",29);
      Msleep(1000);
    
      do
      {
        abstand=Chirp();
        SerWrite("\r\n distanz in cm   ",16);
        Msleep(500);
        PrintInt(abstand);
    
        if(abstand > 25) 
        {
          StatusLED(GREEN);
          Msleep(500);
          fahren();
        }
        else 
        {
          StatusLED(RED);
          Msleep(500);
          Turn(180,200);
        }
      }
      while(1);
    }
    
    
    int main(void)
    {
      Init();
      EncoderInit ();
      
      for (j = 0; j < 8; j++) 
      {
        entfernung();
        StatusLED(YELLOW);
        Msleep(500);
      }
    
      while(1);
      return 0;
    }
    Damit läuft er mal in den if- und mal in den else-Zweig, und er schickt ständig Werte auf das Hyperterminal. Damit kommst Du weiter.
    Die for-Schleife in main() wird übrigens nur einmal ausgeführt, weil er sich ja in entfernung() in der do/while-Schleife fängt. Das macht bezüglich der Ablauflogik keinen Sinn. Das solltest Du ändern.

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi ehenkes,
    ich musste vorher noch die ionka.h includen, ohne die dort vorhadenen funktionen für die US-erweiterung kam asuro gleich in den "turn.
    bei diesem code:

    Code:
    #include "asuro.h" //incl. US 
    #include "inka.h"
    int abstand=0; 
    int j=0; 
    
    void fahren (void) 
    { 
       //EncoderInit(); 
       Go (200,150); 
       Msleep(1000); 
       Turn (85,150); 
       Msleep(1000); 
    } 
    
    void entfernung(void) 
    { 
      SerWrite("\r\n  --- ultrasonic test ---",29); 
      Msleep(1000); 
    
      do 
      { 
        abstand=Chirp(); 
        SerWrite("\r\n distanz in cm   ",16); 
        Msleep(500); 
        PrintInt(abstand); 
    
        if(abstand > 25) 
        { 
          StatusLED(GREEN); 
          Msleep(500); 
          fahren(); 
        } 
        else 
        { 
          StatusLED(RED); 
          Msleep(500); 
          Turn(180,200); 
        } 
      } 
      while(1); 
    } 
    
    
    int main(void) 
    { 
      Init(); 
      EncoderInit (); 
      
      for (j = 0; j < 8; j++) 
      { 
    
        entfernung(); 
        StatusLED(YELLOW); 
        Msleep(500); 
      } 
    
      while(1); 
      return 0; 
    }
    geht er aber auch sofort in die drehung, an das terminal wird ebenfalls nichts gesendet...
    gruß inka

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    17.06.2007
    Ort
    Geretsried
    Alter
    34
    Beiträge
    43
    ach jetzt versteh ich das while... ...hatte vergessen dass das zu do gehört, sorry
    Gruß datobbs

  4. #24
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    So ich habe jetzt die Odometrie in Ordnung gebracht und Dein Programm - wie von mir geändert - nochmals getestet. Bei mir klappt das prinzipiell gut. Allerdings reagiert er noch nicht schnell genug auf Hindernisse. Er rennt dagegen. Das lässt sich aber leicht optimieren.

    Dies heißt nun aber, dass bei Dir irgendwo an anderer Stelle im Programmgerüst etwas nicht stimmt. Klappt das bei Dir mit der Status-LED? Geht die auf rot, wenn Du etwas davor hälst, und dann wieder auf grün, wenn alles frei ist?

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    ich habe auch überlegt und herumgespielt, ich denke es liegt am vorgegebenem abstand >25, das muss ich ändern, weil es bei der messung bei mir aussreiser nach oben wie auch nach unten gibt. Vielleich würde es reichen 2-3mal zu messen, also eine for schleife statt dem do/while und mitteln, ähnlich wie bei den tasterabfragen? Was hälst du davon? Würde das helfen?
    Momentan muss ich opfer bringen, komme nicht an "meinen" rechner, meiner tochter hat ferien und spielt simms
    gruß inka

  6. #26
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    Ausreißer sind ein Problem. Ich habe dafür an anderer Stelle mal Folgendes entwickelt, aber das geht sicher noch raffinierter:
    Code:
    #include "asuro.h"
    #define MAXDIFF 90
    
    int main(void)
    {
      int abstand, abstand_alt, diff, zaehler=0;
      Init();
      abstand = Chirp();
       
      while(TRUE)
      {
        abstand_alt = abstand;
    	abstand = Chirp();	++zaehler;
    	diff = abstand - abstand_alt;
    	
    	if( (abstand>15) && (abs(diff)<MAXDIFF) )
    	{
    	  StatusLED(GREEN);
    	  MotorDir(FWD, FWD);
    	  MotorSpeed(150, 150);
    	}
    	else if( (abstand>10) && (abstand<=15) && (abs(diff)<MAXDIFF) )
    	{
    	  StatusLED(YELLOW);
    	  MotorDir(FWD, FWD);
    	  MotorSpeed(150, 100);
    	  Msleep(10);
    	}
    	else
    	{
    	  StatusLED(RED);
    	  MotorDir(RWD, RWD);
    	  MotorSpeed(150, 100);
    	  Msleep(10);
    	}
    	
    	if (zaehler > 800)
    	{
    		StatusLED(RED);
    		BackLED(ON,ON);
    	    MotorDir(RWD, RWD);
    	    MotorSpeed(200, 250);
    	    Msleep(10);
    		BackLED(OFF,OFF);
    	}
    	if (zaehler > 810)
    	{
    		StatusLED(RED);
    		BackLED(ON,ON);
    	    MotorDir(RWD, RWD);
    	    MotorSpeed(250, 200);
    	    Msleep(10);
    		BackLED(OFF,OFF);
    				
    		if(zaehler > 820)
    		  zaehler = 0;
    	}
      }
      return 0;
    }

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress