- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Asuro soll ein Quadrat fahren... und nicht mehrere!

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    Anzeige

    Powerstation Test
    hallo,
    hast du den code, den ich oben gepostet habe mal getestet? funktioniert der auch nicht?
    du musst den zähler auch wieder auf 0 setzen, bevor du immer weiter hoch zählst.
    also so irgendwie:

    mfg jeffrey
    Code:
    //----------------------------------------------------------------------------------
    //Projekt: HAUS VOM NIKOLAUS
    //----------------------------------------------------------------------------------
    #include "asuro.h"
    #define TRIGGERLEVEL 680
    #define HYSTERESIS 30
    #define LOW 0
    #define HIGH 1
    
    //----------------------------------------------------------------------------------
    //Variablen deklarieren
    //----------------------------------------------------------------------------------
    unsigned int data [2];
    signed int status [2]={0,0};
    unsigned int speed=255;
    //Startwert für halbe Motorgeschwindigkeit
    signed int difference=0;
    unsigned int distance=0;
    int i;
    int zaehler=0;
    
    //----------------------------------------------------------------------------------
    //Unterprogramm Odometrie
    //----------------------------------------------------------------------------------
    void Odometrie (void)
    {
          //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++;
            distance++; }
    
            //Wechsel linker Sensor von hoch auf niedrig?
            if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
            status[0]=LOW;
            difference++;
            distance++; }
             
            //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ähler den erlaubten
            //Wertebereich verlässt
            if(difference<-155) difference=-155;
            if(difference>155) difference=155;
             
            //StatusLED noch entsprechend der erkannten Segmente aufleuchten
            //lassen, grün für links, rot für rechts
            StatusLED(status[0]+status[1]*2);
         
            //Zähldifferenz passemd auf die Motoren verteilen
            if(difference>0) MotorSpeed(155-difference,155);
            else MotorSpeed(155,155+difference);
    }
    
    //----------------------------------------------------------------------------------
    //Unterprogramm Haus (Quadrat, Kantenlänge 29cm)
    //----------------------------------------------------------------------------------
    void Haus (void)
    {
        //Schleife (wird 4mal ausgeführt), da 4 Seiten
        while (zaehler<4)
        {
             
        switch(distance)
          {
            //Hausseite
            case 0:      MotorDir(FWD,FWD);
                   MotorSpeed(speed,speed);
                   break;
            case 110:   speed=200;
                   break;
            case 120:   speed=150;
                   break;
            //Drehung nach links, 90°
            case 145:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(RWD,FWD);
                   speed=255;
                   distance=146;
                   break;
            case 176:    speed=200;
                   break;
           case 182:    speed=150;
                   break;
          //stehen bleiben und kurz warten
           case 186:    MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,FWD);
                   speed=255;
                   //zurück zum Anfang
                   distance=0;
                   
                   //Schleifenzähler
                   zaehler++;
                   break;
            }
          
          Odometrie();
                                 
        }   
       //stehen bleiben, nachdem ASURO ein Quadrat gefahren ist
       MotorDir(BREAK,BREAK);
    
    }
    
    //--------------------------------------------------------------------------------
    //Unterprogramm Dach1 (Diagonale 1, 41cm; Dach Seite 1, 19cm)
    //--------------------------------------------------------------------------------
    void Dach1 (void)
    {
    zaehler=0;
    while(zaehler<1)
       {
          
       switch(distance)
          {
          //Drehung nach links, 45°
          case 0:    MotorDir(RWD,FWD);
                   MotorSpeed(speed,speed);
                   distance=1;
                   break;                  
          case 10:    speed=200;
                   break;
          case 15:    speed=150;
                   break;
          //Diagonale 1
          case 21:    MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,FWD);
                   MotorSpeed(speed,speed);
                   break;
          case 190:   speed=200;
                   break;
          case 200:   speed=150;
                   break;
          //Drehung nach rechts, 95°
          case 227:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,RWD);
                   speed=255;
                   distance=228;
                   break;
          case 248:   speed=200;
                   break;
          case 258:   speed=150;
                   break;
          //Dach Seite 1, linke Seite
          case 268:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,FWD);
                   speed=255;
                   distance=269;
                   break;
          case 340:   speed=200;
                   break;
          case 350:   speed=150;
                   break;
          case 363:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                         zaehler++;
                   break;
    
          }
       
       Odometrie();
       
       }
       
       MotorDir(BREAK,BREAK);
       
    }   
    
    //---------------------------------------------------------------------------------
    //Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
    //---------------------------------------------------------------------------------
    void Dach2 (void)
    {
    zaehler=0;
    while(zaehler<1)
       {
          
       switch(distance)
          {
          //Drehung nach rechts, 80°
          case 0:    MotorDir(RWD,FWD);
                   MotorSpeed(speed,speed);
                   distance=1;
                   break;               
          case 25:    speed=200;
                   break;
          case 30:    speed=150;
                   break;
          //Dach Seite 2, rechte Seite
          case 37:    MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,FWD);
                   MotorSpeed(speed,speed);
                   break;
          case 110:   speed=200;
                   break;
          case 120:   speed=150;
                   break;
          //Drehung nach rechts, 95°
          case 131:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   MotorDir(FWD,RWD);
                   speed=255;
                   distance=132;
                   break;
          case 150:   speed=200;
                   break;
          case 160:   speed=150;
                   break;
          //Diagonale 2
          case 171:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                      MotorDir(FWD,FWD);
                      speed=255;
                   distance=172;
                   break;
          case 340:   speed=200;
                   break;
          case 350:   speed=150;
                   break;
          case 377:   MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                   zaehler++;
                   break;
    
          }
       
       Odometrie();
       
       }
       
       MotorDir(BREAK,BREAK);
    }
    
    //-----------------------------------------------------------------------------------
    //Hauptprogramm
    //-----------------------------------------------------------------------------------
    int main (void)
    {
    Init();
    
       while(zaehler<1)
          {
          BackLED(OFF,OFF);
          StatusLED(OFF);
          
          FrontLED(ON);
          Haus();
          FrontLED(OFF);
          
          StatusLED(RED);
          //MotorDir(FWD,FWD);
          Dach1();
          StatusLED(GREEN);
          
          //MotorDir(FWD,FWD);
          Dach2();
          BackLED(ON,ON);
          
          zaehler++;
          }
       return 0;
    }
    denke allerdings, dass dieses programm genau das gleiche macht wie meines von oben, vielleicht habe ih ja au nen denkfehler drin.
    mfg jeffey

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    Hm ich dachte eigentlich, dass jedes Unterprogramm auf meine oben deklarierten Variablen zugreift. Sonst müsste ich sie ja immer wieder deklarieren und oben hab ich ja bereits den zaehler sowie distance auf 0 gesetzte.
    Was ist eigentlich der Unterschied zwischen void Haus (void) und void Haus ()??

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    hi,
    natürlich greifft jedes unterprogramm auf diese variable zu, allerdings hat die variable weiterhin den wert, den sie nach dem letzten unterprogramm hatte.
    bei den fragen zum unterschied kann ich dir nix sagen, bin nicht mehr so drin in c, habe es schon lange nicht mehr verwendet.
    mfg jeffrey

    edit: ich weiß auch nicht, ob meine codevorschläge so funktionieren, habe selbst eider keinen asuro, und selbst wenn, hätte ich nicht das privileg während der "arbeit", obwohl dipl arbeit machen auch nicht richtig arbeiten ist, damit spielen und das testen zu können.

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    ok, Danke.
    Er kommt inzwischen in das 2te Unterprogramm, bleibt aber manchmal drin hängen...
    Vlt kann mir das mit dem void Haus(void) und void Haus() jemand anderes erklären!

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    Hi,
    das hängen bleiben kommt denke ich vom case, also wenn dein distance > als 363 ist, dann wird dein stopp übersrungen. kann man auch den case distance>= 363 verwenden? dann nimm den, oder falls das nicht geht, lass den letzten case weg, und mache dafür eine if abfragen, also

    Code:
    if(distance>=363) 
    {
                      MotorDir(BREAK,BREAK);
                      for (i=0; i<100; i++)
                         {
                         Sleep(255);
                         }
                         zaehler++; 
    }
    vielleicht hilft das, oder wo im unterprogramm bleibt es hängen?
    gruß jeffrey

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    Er fährt mir nun mein Haus vom Nikolaus.. manchmal bleibt er stehn, dann muss man ihn einfach nochmal starten...

    Hab das nun garnicht mit dem distance >363 gemacht... geht auch so, wenn man distance wieder auf null setzt.

    Mein code sieht also so aus:
    Code:
    //----------------------------------------------------------------------------------
    //Projekt: HAUS VOM NIKOLAUS
    //----------------------------------------------------------------------------------
    #include "asuro.h"
    #define TRIGGERLEVEL 680
    #define HYSTERESIS 30
    #define LOW 0
    #define HIGH 1
    
    //----------------------------------------------------------------------------------
    //Variablen deklarieren
    //----------------------------------------------------------------------------------
    unsigned int data [2];
    signed int status [2]={0,0};
    unsigned int speed=255;
    //Startwert für halbe Motorgeschwindigkeit
    signed int difference=0;
    unsigned int distance=0;
    int i;
    int zaehler=0;
    
    //----------------------------------------------------------------------------------
    //Unterprogramm Odometrie
    //----------------------------------------------------------------------------------
    void Odometrie (void)
    {
    		//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++;
            distance++; }
    
            //Wechsel linker Sensor von hoch auf niedrig?
            if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
            status[0]=LOW;
            difference++;
            distance++; }
             
            //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ähler den erlaubten
            //Wertebereich verlässt
            if(difference<-155) difference=-155;
            if(difference>155) difference=155;
             
            //StatusLED noch entsprechend der erkannten Segmente aufleuchten
            //lassen, grün für links, rot für rechts
            StatusLED(status[0]+status[1]*2);
         
            //Zähldifferenz passemd auf die Motoren verteilen
            if(difference>0) MotorSpeed(155-difference,155);
            else MotorSpeed(155,155+difference);
    }
    
    //----------------------------------------------------------------------------------
    //Unterprogramm Haus (Quadrat, Kantenlänge 29cm)
    //----------------------------------------------------------------------------------
    void Haus (void)
    {
    
    distance=0;
    zaehler=0;
    
        //Schleife (wird 4mal ausgeführt), da 4 Seiten
        while (zaehler<4)
        {
             
        switch(distance) 
    		{
            //Hausseite
            case 0:		MotorDir(FWD,FWD);
    					MotorSpeed(speed,speed);
    					break;
            case 110:	speed=200;
    					break;
            case 120:	speed=150;
    					break;
            //Drehung nach links, 90°
            case 145:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(RWD,FWD);
    					speed=255;
    					distance=146;
    					break;
            case 176: 	speed=200;
    					break;
    	    case 182: 	speed=150;
    					break;
    		//stehen bleiben und kurz warten
    	    case 186: 	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,FWD);
    					speed=255;
    					//zurück zum Anfang
    					distance=0;
    					
    					//Schleifenzähler
    					zaehler++; 
    					break;
            }
    		
    		Odometrie();
                                  
        }   
    	//stehen bleiben, nachdem ASURO ein Quadrat gefahren ist
    	MotorDir(BREAK,BREAK);
    
    } 
    
    //--------------------------------------------------------------------------------
    //Unterprogramm Dach1 (Diagonale 1, 41cm; Dach Seite 1, 19cm)
    //--------------------------------------------------------------------------------
    void Dach1 (void)
    {
    
    distance=0;
    zaehler=0;
    
    while(zaehler<1)
    	{
    		
    	switch(distance) 
    		{
    		//Drehung nach links, 45°
    		case 0: 	MotorDir(RWD,FWD);
    					MotorSpeed(speed,speed);
    					distance=1;
    					break;						
    		case 10: 	speed=200;
    					break;
    		case 15: 	speed=150;
    					break;
    		//Diagonale 1
    		case 21: 	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,FWD);
    					MotorSpeed(speed,speed);
    					break;
    		case 190:	speed=200;
    					break;
    		case 200:	speed=150;
    					break;
    		//Drehung nach rechts, 95°
    		case 227:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,RWD);
    					speed=255;
    					distance=228;
    					break;
    		case 248:	speed=200;
    					break;
    		case 258:	speed=150;
    					break;
    		//Dach Seite 1, linke Seite
    		case 268:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,FWD);
    					speed=255;
    					distance=269;
    					break;
    		case 340:	speed=200;
    					break;
    		case 350:	speed=150;
    					break;
    		case 363:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					break;
    		zaehler++;
    		}
    	
    	Odometrie();
    	
    	}
    	
    	MotorDir(BREAK,BREAK);
    	
    }	
    
    //---------------------------------------------------------------------------------
    //Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
    //---------------------------------------------------------------------------------
    void Dach2 (void)
    {
    
    while(zaehler<1)
    	{
    		
    	switch(distance) 
    		{
    		//Drehung nach rechts, 80°
    		case 0: 	MotorDir(RWD,FWD);
    					MotorSpeed(speed,speed);
    					distance=1;
    					break;					
    		case 25: 	speed=200;
    					break;
    		case 30: 	speed=150;
    					break;
    		//Dach Seite 2, rechte Seite 
    		case 37: 	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,FWD);
    					MotorSpeed(speed,speed);
    					break;
    		case 110:	speed=200;
    					break;
    		case 120:	speed=150;
    					break;
    		//Drehung nach rechts, 95°
    		case 131:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					MotorDir(FWD,RWD);
    					speed=255;
    					distance=132;
    					break;
    		case 150:	speed=200;
    					break;
    		case 160:	speed=150;
    					break;
    		//Diagonale 2
    		case 171:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    						MotorDir(FWD,FWD);
    						speed=255;
    					distance=172;
    					break;
    		case 340:	speed=200;
    					break;
    		case 350:	speed=150;
    					break;
    		case 377:	MotorDir(BREAK,BREAK);
    						for (i=0; i<100; i++)
    							{
    							Sleep(255); 
    							}
    					break;
    		zaehler++;
    		}
    	
    	Odometrie();
    	
    	}
    	
    	MotorDir(BREAK,BREAK);
    }
    
    //-----------------------------------------------------------------------------------
    //Hauptprogramm
    //-----------------------------------------------------------------------------------
    int main (void)
    {
    Init();
    
       while(zaehler<1)
          {
          BackLED(OFF,OFF);
          StatusLED(OFF);
         
          FrontLED(ON);
          Haus();
          FrontLED(OFF);
          StatusLED(RED);
          Dach1();
    	  StatusLED(OFF);
    	  
          StatusLED(GREEN);
          Dach2();
    	  
          BackLED(ON,ON);
         
          zaehler++;
          }
       return 0;
    }
    Werde nun meine Winkel noch ein wenig verfeinern und dann mal mein Ergebnis dem Wettbewerb präsentieren.

  7. #27
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    variablen, die ausserhalb der main-funktion deklariert wurden, sind global und können überall im programm verwendet werden. nachteil: sie ligen dauerhaft im speicher, auch wenn sie gerade nicht verwendet werden, und der ist natürlich stark begrenzt.

    void steht am anfang: die funktion hat keinen rückgabewert (zB Odometriedata)
    bei pollswitch zB steht hier char (oder unsigned char?), welcher zurückgegeben wird.

    void steht in den klammern: die funktion benötigt keine argumente bzw übergabewerte, zB PollSwitch. Motordir hingegen bekommt die richtungen übergeben.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    Hi,
    und hast du den Wettbewerb gewonnen?
    MfG Jeffrey

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

LiFePO4 Speicher Test