- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 23 von 23

Thema: Telementriedaten des ASURO -> kleines Problem

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Anzeige

    Praxistest und DIY Projekte
    @NomiS
    Ich hatte dein Programm schon angeschaut und dir einen Tip zur Korrektur gegeben. Siehe Beitrag von 02:21. Extra für dich!
    Den Hinweis von mir, dass da ein Fehler in der for()-Schleife ist, hast du ja auch in der letzten Version behoben. Dieser Fehler kann ja nun nicht am Hyperterminal gelegen haben.

    Das ich dir auch schon geschrieben habe, dass FAST immer 0.00 rauskommt, kannst du auch nachlesen. Geschrieben hatte ich dir hierzu, dass du mal selber danach siehst.
    Warum also nimmst du nicht mal eine Version, repariert den Inhalt, und strukturiert erst danach wieder alles um? Es ist dann für 'Helferlein' etwas einfacher, und es muss nicht jedesmal neu nach Syntax-Fehlern gesucht werden.

    Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    17.02.2007
    Alter
    37
    Beiträge
    49
    So ich hab jetzt hoffentlich mal alles nach euren Tips geändert.
    Leider gehts immer noch nicht so ganz.
    Das Eigenartige ist: Ohne die SerPrintbefehle, die den Programmstatus (wo ist der ASURO gerade im Programm) angeben funktioniert das Programm eine zwei durchläufe. Dann hängt es sich auf. Mit den SerPrints geht gar nix. Mal geht die StatusLED auf ROT, mal auf GRÜN, mal AUS. Dann geben die Motoren Vollgas ... . Keine Ahnung was da los ist.

    Code:
    #include <asuro.h>
    #include <string.h> // für strlen
    
    
    /*Left min/max, right min/max values da minimiert auf acht bit *4 
    
    +00150 *4  =	600			744				//data[0] left
    +00222 *4  =	888 
    										798
    +00190 *4  =	760 		852					//data[1] right
    +00236 *4  =	944 
    
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //---------------------------------------------------------------------------*/
    
    //Statische Vergabe
    
    #define Triggerlevel 798
    #define Hysteresis 15
    #define LOW 0
    #define HIGH 1
    
    
    //Variablenverageb
    
    int einticklaenge = 2; 						// /10 da 2mm	 0.02cm	//Gefahrene Strecke bei einem Tick
    
    int speed;
    											//PWM des Rades
    float cmsleft;								//Metre pro Sekunde (Radgeschwindigkeit links
    float cmsright;								//Metre pro Sekunde (Radgeschwindigkeit rechts
    
    float cmsleft1;								// Vorherige Geschwindigkeit (für a)
    float cmsright1;								// Vorherige Geschwindigkeit (für a)
    	
    float cmleft;								//Gefahrene Strecke links
    float cmright;								//Gefahrene Strecke rechts
    
    float aleft;								//Beschleunigung linkes Rad
    float aright;								//Beschleunigung rechtes Rad
    
    unsigned int data [2];  					//Array erstellen mit 2 Speicherzellen für Odometriedaten
    											//data [0] links T11
    											//data [1] rechts T12 
    	
    signed int status[2]={0,0};
    
    int Zeit = 1000;							//Zeit in der die Impulse gezählt werden 1s
    int Zeit1;									//letzte Zeit zur bestimmung der Zeit dif (für a)
    
    int leftimpuls;								//gezählte Impulse pro Zeit links
    int	rightimpuls;							//gezählte Impulse pro Zeit rechts
    
    unsigned int long stopzeit;
    
    
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    void Nullen_Sekunderwerte_a (void){
    		Zeit1 = 0 ;
    		cmsright1 =0;
    		cmsleft1 =0;
    
    
    return;}
    
    
    void Funktionsblock (void){
    
    SerPrint("\n\rFunktionsblock begonnen\n\r");
    SerPrint("\n\rNullen\n\r");
    
    			leftimpuls 	= 0;					//Impullse vor Zählvorgang auf null
    			rightimpuls = 0;				//Impullse vor Zählvorgang auf null
    			cmright 	= 0;
    			cmleft 		= 0;
    			cmsright	= 0;
    			cmsleft 	= 0;
    			aright 		= 0;
    			aleft 		= 0;
    			
    			//Detektierung der Impulse
    			stopzeit=Gettime()+Zeit; 	 	//1 sekunde Hell Dunkel Wechsel detektieren
    
    SerPrint("\n\rOdometrie\n\r");
    
    	do {
    				OdometrieData(data);								//Odo daten bereitstellen
    					
    					//Wechselt linker Sensor von niedrig auf hoch?
    					if((status[0]==LOW)&&(data[0]>Triggerlevel+Hysteresis)){  //Wenn vorher Low und jetz HI dann
    						status[0] = HIGH;
    
    						 leftimpuls++;											//1 impuls ausgeben
    						 }	
    
    					//Wechselt linker Sensor von hoch auf niedrig?
    					if((status[0]==HIGH)&&(data[0]<Triggerlevel-Hysteresis)){
    						status[0] = LOW;
    
    						 leftimpuls++;
    						 }
    
    					//Wechselt rechter Sensor von niedrig auf hoch?
    					if((status[1]==LOW)&&(data[1]>Triggerlevel+Hysteresis)){
    						status[1] = HIGH;
    
    						 rightimpuls++;	
    						 }
     
    					//Wechselt rechter Sensor von hoch auf niedrig?
    					if((status[1]==HIGH)&&(data[1]<Triggerlevel-Hysteresis)){
    						status[1] = LOW;
    
    						 rightimpuls++;	
    						 }
    					
    			} while (stopzeit>Gettime());
    
    
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------			
    SerPrint("\n\rAuswertung\n\r");	
    		
    			//Auswertung der Impulse
    				
    				//Zurückgelegter Weg
    				cmright = rightimpuls * einticklaenge /100; 
    				cmleft	= leftimpuls * einticklaenge /100;
    
    				//Geschwindigkeit
    				cmsright = cmright / (Zeit/1000);
    				cmsleft = cmleft / (Zeit/1000);	//da ms
    
    				//Beschleunigung
    				aright = (cmsright-cmsright1) / (Zeit-Zeit1);
    				aleft = (cmsleft-cmsleft1) / (Zeit-Zeit1);
    
    				Zeit1 = Zeit;			//jetzige Zeit Zwischenspeichern für a beim nächsen turn
    				cmsright1 = cmsright;	//jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn
    				cmsleft1 = cmsleft;		//jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn
    				
    						
    
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    		
    SerPrint("\n\rAusgabe\n\r");
    
    			//rechts
    			SerPrint("\n\rRechtes Rad\t");
    
    			PrintInt(rightimpuls);
    			SerPrint(" Impulse-Rechts\t");
    
    			PrintFloat(cmright,2,2);
    			SerPrint (" cm\t");
    
    			PrintFloat(cmsright,2,2);
    			SerPrint(" cm/s\t");
    
    			PrintFloat(aright,2,2);
    			SerPrint(" cm/s²");
    
    			//Zeilenwechsel zwischen rechts und links
    			SerPrint("\n\r\n\r");
    
    			//links
    			SerPrint("\n\rLinkes Rad\t");
    			
    			PrintInt(leftimpuls);
    			SerPrint(" Impulse-Links\t");
    
    			PrintFloat(cmleft,2,2);
    			SerPrint (" cm\t");
    			PrintFloat(cmsleft,2,2);
    			SerPrint(" cm/s\t");
    			PrintFloat(aleft,2,2);
    			SerPrint(" cm/s²");
    
    			//2*absatz
    
    			SerPrint("\n\r\n\r\n\r\n\r");
    		
    SerPrint("\n\rFunktionsblock beendet\n\r");
    
    	StatusLED(OFF);
    			return;}
    
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    
    int main(void)
    {	BackLED(OFF,OFF);
    	Init();
    	
    	while(1){
    //-----------------------------------------------------------------------------
    //Intro für Hyperterminal
    //----------------------------------------------------------------------------- 
    SerPrint("Telemetriedaten\n\r\n\r");
    
    //Überschrift im Hyperterminal für Vorwärts
    
    SerPrint("Vorwärts\n\r\n\r");
    //----------------------------------------------------------------------------- 
    //Los gehts 			beschleunigen
    //----------------------------------------------------------------------------- 
    	MotorDir(FWD,FWD);					//Richtung festlegen
    	Nullen_Sekunderwerte_a();
    
    
    	for (speed=120;speed<245;speed +=10){   //Geschwindigkeit von 80 auf 255 in 10er schritten speed kleiner 245
    		MotorSpeed(speed,speed);			//Geschwindigkeit einlesen
    
    			Funktionsblock();
    
    			}
    //----------------------------------------------------------------------------- 
    //Langsamer werden
    //----------------------------------------------------------------------------- 
    		Nullen_Sekunderwerte_a();
    
    		for (speed=255;speed>125;speed -=10){
    		MotorSpeed(speed,speed);
    
    			Funktionsblock();
    
    			}
    //-----------------------------------------------------------------------------
    //Rückwärts
    //----------------------------------------------------------------------------- 
    
    
    //Überschrieft im Hyperterminal
    
    SerPrint("Rückwärts\n\r\n\r");
    //----------------------------------------------------------------------------- 
    //Los gehts 			beschleunigen
    //----------------------------------------------------------------------------- 
    		MotorDir(RWD,RWD);
    		
    		Nullen_Sekunderwerte_a();
    		
    	for (speed=120;speed<245;speed +=10){
    		MotorSpeed(speed,speed);
    			
    			Funktionsblock();
    
    			}
    //----------------------------------------------------------------------------- 
    //Langsamer werden
    //----------------------------------------------------------------------------- 
    	Nullen_Sekunderwerte_a();
    		
    	for (speed=255;speed>125;speed -=10){
    		MotorSpeed(speed,speed);
    
    			Funktionsblock();
    
    			}
    		}
    
    		MotorSpeed(0,0);
    		return 0;}
    Bitte schaut es euch mal kurz an. Wäre nett wenn es jemand korrigieren könnte, mir erklärt was er gemacht hat und was nicht gegangen ist. Habe nur noch bis morgen Zeit.

    Gruß NomiS

  3. #23
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo NomiS,

    ich habe dein Programm mal ausprobiert. Mit den folgenden Änderungen bekomme ich ganz vernünftige Werte für die Geschwindigkeit.
    Die Beschleunigungswerte habe ich erst mal weggelassen, diese ergeben nämlich negativ Werte und bringen dadurch das Programm zum Absturz (vielleicht findest du selbst heraus, wie man das verhindern kann). Die weiteren Änderungen, die ich gemacht habe:
    alle zur Berechnung verwendeten Variablen und Konstanten in Float-Werte umwandeln:

    Code:
             //Auswertung der Impulse
                
                //Zurückgelegter Weg
                cmright = (float)rightimpuls * (float)einticklaenge /100.0;
                cmleft   = (float)leftimpuls * (float)einticklaenge /100.0;
    
                //Geschwindigkeit
                cmsright = cmright / ((float) Zeit/1000.0);
                cmsleft = cmleft / ((float)Zeit/1000.0);   //da ms
    
                //Beschleunigung
    //            aright = (cmsright-cmsright1) / ((float)(Zeit-Zeit1));
    //            aleft = (cmsleft-cmsleft1) / ((float)(Zeit-Zeit1));
    
                Zeit1 = Zeit;         //jetzige Zeit Zwischenspeichern für a beim nächsen turn
                cmsright1 = cmsright;   //jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn
                cmsleft1 = cmsleft;      //jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

12V Akku bauen