- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

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

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

    Powerstation Test
    hi, wo genau in der switch anweisung ist denn die ecke?also welche anweisung führt die 90° drehung aus?

    edit: hab´s gefunden, wer lesen kann ist klar im vorteil

    probier mal den code:

    Code:
    #include "asuro.h"
    //Schwellwert für die Hell/Dunkel-Unterscheidung
    //Eventuell muss damit etwas variiert werden
    #define TRIGGERLEVEL 680
    #define HYSTERESIS 30
    #define LOW 0
    #define HIGH 1
    
    
    int main(void)
    {
       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;
       
       Init();
       MotorDir(FWD,FWD);
       BackLED(OFF,OFF);
       
       while (zaehler<4)
       {
             
          switch(distance) {
             
             //Am Anfang der Strecke Vollgas
             case 0:MotorDir(FWD,FWD);
             MotorSpeed(speed,speed);
             break;
             //Am Ende langsamer werden...
             case 215:speed=200;
             break;
             case 230:speed=150;
             break;
             //...und stehen bleiben
             case 251:MotorDir(BREAK,BREAK);
                //etwas warten, bis der Roboter wirklich steht
                for (i=0; i<100; i++)
                {
                Sleep(255); }
                //auf der Stelle nach links drehen
                MotorDir(RWD,FWD);
                speed=255;
                //und noch vermeiden, dass die Verzögerung
                //mehrmals aufgerufen wird
                distance=252;
    zaehler++;            
    break;
             case 282: speed=200;
             break;
             case 288: speed=150;
             break;
             case 292: MotorDir(BREAK,BREAK);
                for (i=0; i<100; i++)
                {
                Sleep(255); }
                
                MotorDir(FWD,FWD);
                speed=255;
                distance=0;
                //und noch vermeiden, dass die Verzögerung
                //mehrmals aufgerufen wird
                
                break;
                }
                                     
                   
             //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);
             
          }
       
       return 0;
    }
    mfg jeffrey

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    Jipppiiii es geht!!!
    Allerdings muss man den Zähler bisschen weiter hinter setzen, das konntest du aber nicht wissen, da die Drehung bis zum distance=0 geht...
    Desweiteren muss man return 0 weglassen, da ja sonst die while-Schleife wieder von vorne beginnt. Also fügt man ein MotorDir(BREAK,BREAK) ein und ASURO bleibt genau nach einem Quadrat stehen.

    Hier nochmal mein fertiger Code...
    Code:
    #include "asuro.h"
    //Schwellwert für die Hell/Dunkel-Unterscheidung
    //Eventuell muss damit etwas variiert werden
    #define TRIGGERLEVEL 680
    #define HYSTERESIS 30
    #define LOW 0
    #define HIGH 1
    
    
    int main(void)
    {
       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;
       
       Init();
       MotorDir(FWD,FWD);
       BackLED(OFF,OFF);
       
       while (zaehler<4)
       {
             
          switch(distance) {
             
             //Am Anfang der Strecke Vollgas
             case 0:MotorDir(FWD,FWD);
             MotorSpeed(speed,speed);
             break;
             //Am Ende langsamer werden...
             case 215:speed=200;
             break;
             case 230:speed=150;
             break;
             //...und stehen bleiben
             case 251:MotorDir(BREAK,BREAK);
                //etwas warten, bis der Roboter wirklich steht
                for (i=0; i<100; i++)
                {
                Sleep(255); }
                //auf der Stelle nach links drehen
                MotorDir(RWD,FWD);
                speed=255;
                //und noch vermeiden, dass die Verzögerung
                //mehrmals aufgerufen wird
                distance=252;
              
    break;
             case 282: speed=200;
             break;
             case 288: speed=150;
             break;
             case 292: MotorDir(BREAK,BREAK);
                for (i=0; i<100; i++)
                {
                Sleep(255); }
               
                MotorDir(FWD,FWD);
                speed=255;
                distance=0;
                //und noch vermeiden, dass die Verzögerung
                //mehrmals aufgerufen wird
               zaehler++; 
                break;
                }
                                     
                   
             //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);
             
          }
       
       MotorDir(BREAK,BREAK);
    }

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    hi,
    gut, dass es jetzt geht.
    aber
    wer lesen kann ist klar im vorteil Zwinkern
    gilt auch für dich weil ich hatte ja geschrieben
    if(distance=0)
    {
    drehung 90°;
    distance=200;
    ecke ++;
    }
    da wurde der zähler auch erst in der if/case anweisung für die drehung hoch gezählt, und nicht bei jedem schleifen durchlauf.

    aber jetzt funktioniert ja alles.
    mfg jeffrey

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    So da nun endlich mein Quadrat funktioniert, versuche auch ich das Haus vom Nikolaus zu zeichnen.
    Leider funktioniert es nicht wie erhofft.
    Habe 4 Unterprogramme geschrieben, welche nacheinander ausgeführt werden sollen. Funktioniert auch ein Teil davon.
    Das Programm läuft allerdings nur bis zum Quadrat und danach hört er auf zu fahren, springt also nicht in die Unterprogramme Dach1 und Dach2.

    Könnte mal jemand drüberschauen und sagen, was ich falsch mache???
    Danke

    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)
    {
    	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;
    	}
    	
    	Odometrie();
    }	
    
    //---------------------------------------------------------------------------------
    //Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
    //---------------------------------------------------------------------------------
    void Dach2(void)
    {
    	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;
    	}
    	
    	Odometrie();
    }
    
    //-----------------------------------------------------------------------------------
    //Hauptprogramm
    //-----------------------------------------------------------------------------------
    int main (void)
    {
    Init();
    
    	MotorDir(FWD,FWD);
    	BackLED(OFF,OFF);
    	StatusLED(OFF);
    
    	Haus();
    	StatusLED(RED);
    	Dach1();
    	StatusLED(GREEN);
    	Dach2();
    	StatusLED(YELLOW);
    }

  5. #15
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    spontan fällt auf, dass am ende der main() schleife sowohl die endlosschleife
    while(1);
    sowie auch
    return 0;
    fehlen.
    ausserdem glaube ich dass die klammern {} in der funktion haus() nicht zueinander passen.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    Hi,

    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)
    {
    while(distance<364){   
    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);
                   distance++;for (i=0; i<100; i++)
                   {
                   Sleep(255);
                   }
                break;
       }
       
       Odometrie();
    } }  
    
    //---------------------------------------------------------------------------------
    //Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
    //---------------------------------------------------------------------------------
    void Dach2(void)
    {while(distance<378){
       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);
                   distance++;for (i=0; i<100; i++)
                   {
                   Sleep(255);
                   }
                break;
       }
       
       Odometrie();
    }}
    
    //-----------------------------------------------------------------------------------
    //Hauptprogramm
    //-----------------------------------------------------------------------------------
    int main (void)
    {
    Init();
    
       MotorDir(FWD,FWD);
       BackLED(OFF,OFF);
       StatusLED(OFF);
    
       Haus();
    distance=0;
       StatusLED(RED);
       Dach1();
    distance=0;
       StatusLED(GREEN);
       Dach2();
       StatusLED(YELLOW);
    }
    könnte klappen, klammern, return0 etc habe ich nicht überprüft. weiß auch nicht mehr genau wie das aussehen muss
    mfg jeffrey

    ps: hab mal ne frage, du sagst du benötigst den asuro bei der arbeit, welche firma braucht nen suro, der das haus vom nikolaus malt? und was mich noch mehr interessiert, für was brauchen die den?

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    Danke werde das am Montag mal ausprobieren, hab den ASURO leider nicht zu Hause.

    Naja das ist eher eine Arbeitsbeschaffungsmaßnahme für die Studenten. Bin zur Zeit dort in der Lehrwerkstatt und lerne Mikrocontroller zu programmieren und da dachte mein Ausbilder es wär ganz lustig doch nen Roboter zu programmieren und da ich den Wettbewerb hier im Forum gesehn habe, dachte ich ich versuch das mit dem Haus vom Nikolaus auch mal.

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    @damaltor...
    an den Klammern in der Funktion Haus kann es nicht liegen, da mir der ASURO diesen Teil ja malt...

  9. #19
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    trotzdem, ich habe nicht genau geschaut aber es könnte sein dass er aus der funktion nicht mehr rauskomt...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    37
    Beiträge
    45
    Es funktioniert immer noch nicht...
    Habe mal LED zwischendurch ein- bzw. ausschalten lassen um zu sehn wo mein Programm hängt... joa es hängt nicht, sondern überspringt einfach einen Teil. Haus macht er einwandfrei und springt auch aus dem Unterprogramm raus, soll dann in Dach1 springen, macht es aber nicht. Es überspringt mir einfach Dach1 und Dach2 und schaltet sofort die BackLEDs an.
    Habe ich die Unterprogramme in der main falsch eingefügt??
    Mögliche Fehler in den Unterprogrammen habe ich ausgeschlossen, da ich sie unabhängig voneinander getestet habe...

    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)
    {
    
    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);
    		//MotorDir(FWD,FWD);
    		Dach1();
    		StatusLED(GREEN);
    		
    		//MotorDir(FWD,FWD);
    		Dach2();
    		BackLED(ON,ON);
    		
    		zaehler++;
    		}
    	return 0;
    }

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests