- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

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

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    36
    Beiträge
    45

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

    Anzeige

    Powerstation Test
    Hallo!
    So brauch mal wieder eure Hilfe.
    Hab ein Programm geschrieben, bei dem mein ASURO ein Quadrat fahren soll. Macht er auch... er führt es nur ständig aus. Ich möchte aber, dass er nur ein Quadrat fährt.
    Hab schon alle möglichen Schleifen ausprobiert... er ignoriert die Anweisungen aber und fährt mehrere Quadrate..
    Kann mir jemand helfen und sagen, wie ich mein Programm abändern muss, damit er nur ein Quadrat fährt?

    Mein Programm:
    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;
    	Init();
    	MotorDir(FWD,FWD);
    	while (1) {
    	
    		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
    				
    				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);
    			
    		}	
    }
    Im Switch sage ich ihm was er fahren soll und unten werte ich die Odometrie aus. Da er die Odometrie ja auch ständig ausführen soll, dachte ich, dass ich eine Schleife direkt nach dem while einfügen muss, da ich nicht weiß wie ich die while abändere, dass sie das ganze nur 4mal ausführt.
    Habe es z.B. mit einer if else versucht.

    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 x;
    	signed int x=0;
    	Init();
    	MotorDir(FWD,FWD);
    	while (1) {
    
    	if (x==4)   {
            x++;
    		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
    				
    				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);
    			
                    }
                    else MotorDir(BREAK,BREAK);
    		}	
    }

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    41
    Beiträge
    760
    Hi,
    zähl doch einfach immer wenn du an den ecken drehst eine zählvariable um eines hoch.
    und mach die bedingung in der while(ecke < 4)
    also ungefähr so:
    ecke=0
    while (ecke<4)
    {
    if (distanz=0)
    {
    drehung;
    ecke ++
    }
    }


    mfg jeffrey

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi,
    ich denke du musst den wert von distance so am ende des ersten quadrates angeben, dass er nicht wieder in die schleife reinkommt...
    Er fängt ja mit distance=0 wieder von anfang an...
    gruß inka

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    36
    Beiträge
    45
    Hi Jeffrey,
    wenn ich das mit dem while (ecke<4) ausprobiere, dann springt er mir nicht mehr in den switch und fährt nur noch gerade aus:

    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 ecke=0;
    	Init();
    	MotorDir(FWD,FWD);
    	while (ecke<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
    				
    				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);
    			
    			
    		ecke++;	
    		}
    	
    	return 0;
    }
    Hi inka,
    versteh ich das richtig, dass du die strecke meinst bis ich ein Quadrat abgefahren hab??? das läge dann über 1000 und es macht auch nicht was es soll....

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    du hast recht. im code:
    Code:
    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
    geht er mit distance=0 wieder an den anfang der switch distance schleife,fährt also unendlich lange im quadrat...
    ich habe es dann mit einer for schleife gemacht, die "um die switch schleife" und innerhalb der while schleife liegt...
    habe den code aber nicht mehr...
    gruß inka

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    36
    Beiträge
    45
    Hm ok... du meinst das also so:
    Code:
    while (1)
    	{	for (x=0; x<4; x++) {
    		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
    				
    				break;
    				}
    				}							
    					
    			//Helligkeitswerte der Lichtschranken auslesen
    			OdometrieData(data);
    wenn ja: asuro macht nun garnichts mehr

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    41
    Beiträge
    760
    hi,
    also ich bin mit dem asuro zeug nicht so genau vertraut. deswegen weiß ich nicht genau, wqs dein programm macht, aber ich glaube, das sah vorher noch twas anders aus. hier mal kurz wie ich es machen würde:
    ecke=0;
    distance=200;
    while(ecke<4)
    {
    if(distance=0)
    {
    drehung 90°;
    distance=200;
    ecke ++;
    }
    distnace=distance mit odd überprüfen;
    }

    so also distance ist jetzt deine seitenlänge vom quadrat. das ganze abbremszeug kannst du natürlich noch zusätzlich einbauen.

    wenn du es mit for machen willst, sollte es auch so gehen:

    for i=1 to 4
    {
    distance=200;
    while (distance>0)
    {
    distnace=distance mit odd überprüfen;
    }
    drehung um 90°;
    }

    denke, dass sollte funktionieren.
    mfg jeffrey

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    36
    Beiträge
    45
    Irgendwie bekomm ich das nicht hin...
    Hier mal alle Möglichkeiten die ich ausprobiert habe...

    1) while-Schleife
    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)
    	{
    		zaehler++;
    	
    		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
    				
    				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;
    }
    Hier fährt ASURO nur geradeaus...


    2) for-Schleife
    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;
    	
    	Init();
    	MotorDir(FWD,FWD);
    	BackLED(OFF,OFF);
    	
    	while (1)
    	{
    		for(zaehler=0; zaehler<4; zaehler++)
    		{
    	
    		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
    				
    				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;
    }
    Hier fährt ASURO immer wieder das Quadrat und hört nicht mehr auf.


    3) if-Anweisung
    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 (1)
    	{
    		if (zaehler<4)
    		{
    		zaehler++;
    	
    		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
    				
    				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;
    }
    Nun fährt ASURO im Kreis.

    4) if-else-Anweisung
    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 (1)
    	{
    		if (zaehler<4)
    		{
    		zaehler++;
    	
    		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
    				
    				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);
    			
    		}
    		else MotorDir(BREAK,BREAK);
    		}
    	
    	return 0;
    }
    Hier springt er sofort in else, da er stehen bleibt.

    5) do-while-Schleife
    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 (1)
    	{
    		do
    		{
    		zaehler++;
    	
    		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
    				
    				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);
    			
    		}
    		while (zaehler<4);
    		}
    	
    	return 0;
    }
    Auch hier fährt ASURO unendlich Quadrate.

    Ich bin der Meinung, dass ich die Schleifen irgendwie falsch setze, sonst müsste ja eine funktionieren.
    Oder mein Zähler funktioniert nicht....
    Er muss ja aber sowohl die Differenz und die Odometrie 4mal ausführen, also muss ich die Schleifen in die while setzen. Ich kann ja die Schleifen nicht vor der Odometrie enden lassen, oder?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    41
    Beiträge
    760
    Hi,
    markier mal in deinem ersten programm, wo genau du dem asuro sagst, dass er in der ecke drehen soll. ich find des irgendwie net. in dieser if anweisung musst du zähler++ schreiben.
    mfg jeffrey

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    36
    Beiträge
    45
    Ich sage dem ASURO jeweils, dass er den Switch 4 mal ausführen soll. Ein sSwitch ist eine Seite + Ecke.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test