- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: Bei linienverfolgung umdreungen der räder zählen mit odometr

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.10.2007
    Beiträge
    16

    Bei linienverfolgung umdreungen der räder zählen mit odometr

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi wieder einmal

    hab da mal einen code geschrieben wo mir der asuro die anzahl von schwarz weis feldern erkennt und dan den durchschnitt der beiden rädern am schluss ausgiebt nach dem ich stop sage. Das programm funktioniert ohne die odometrie einwandfrei doch nun läuft gar nichts mehr mit diesem code. ähm ist es überhaupt möglich die odometrie auszuwerten während dem linienverfolgen??
    Code:
    #include "asuro.h" 
    
    #define TRIGGERLEVEL 600
    	#define HYSTERESIS 10	
    	#define HIGH 1
    	#define LOW 0
    
    int main(void) 
    { 
       unsigned char data[] = "0123"; 
       unsigned int  i; 
       unsigned int linien_verfolgen ( int );
       int Odometrie_zaehler( int *a , int *b ); 
          
     
        
       Init (); 
        
       while (1) 
       { 
          for (i = 0; i < 100; i++) 
            Sleep (72); 
    
          SerRead (data, 3, 0); 
    
          for (i = 0; i < 100; i++) 
            Sleep (72); 
    
          if (data[0] == 'A' && data[1] == 'S' && data[2] == 'U') 
              
    		 
    		 linien_verfolgen ( 120 );
    		 
    
          else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'A') 
             
    		 
    		 linien_verfolgen ( 155 );
    		 
    
          else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'B') 
              
    		 linien_verfolgen ( 180 );
    		 
    
          else if (data[0] == 'G' && data[1] == 'O' && data[2] == 'C') 
              
    		 
    		 linien_verfolgen ( 200 );
    		 
    
          else 
             SerWrite ("falsch", 6); 
    		 
       } 
       
       
       return 0; 
    }
    
    	   int linien_verfolgen (  int speed )
    	{
    		 unsigned int data2[2]; 
    		 unsigned char data3[] = "0123"; 
    		 int count1 = 0; 
    		 int count2 = 0; 
    		 int count = 0; 
    		
    		Init(); 
    		FrontLED(ON); 
    		MotorDir(FWD,FWD);
    		
    			while(1) { 
    			
    			SerRead (data3, 3, 0);
    			
    			 
    			if (data3[0] == 'S' && data3[1] == 'T' && data3[2] == 'O'){
    				count = count1 + count2;
    				count = count/2;
    				SerWrite (" count ", 7);
    				PrintInt(count);
    				count1 = 0;
    				count2 = 0;
    				break;
    				}
    			else 
    			{
    				SerWrite ("falsch", 6); 
    			 
    			    LineData(data2);
    				if(data2[0]>data2[1])
    				{ 
    				MotorSpeed(speed,0);				
    				BackLED(ON,OFF); 
    				Odometrie_zaehler ( count1, count2); 
    				} 
    				else if (data2 [0] < data2 [1] ) 
    				{ 
    				MotorSpeed(0,speed); 
    				BackLED(OFF,ON); 
    				Odometrie_zaehler ( count1, count2); 
    				} 
    				else 
    				{ 
    				MotorSpeed(speed,speed); 
    				BackLED(ON,ON); 
    				Odometrie_zaehler ( count1, count2 ); 
    				} 
    			}
    			}
     	return 0; 
    }
    
    int Odometrie_zaehler ( int *a , int *b ) 
    {
    	
     
    		 unsigned int data [2];
    		 signed int status [2] = {0, 0}; 
    		
    		Init(); 
    			
    			OdometrieData(data);
    			
    			if ((status [ 0 ] == LOW) && (data [0] > TRIGGERLEVEL + HYSTERESIS)) {
    			status [0] = HIGH;
    			*a ++;
    			}
    			
    			if ((status [ 0 ] == HIGH) && (data [0] < TRIGGERLEVEL + HYSTERESIS)) {
    			status [0] = LOW;
    			*a ++;
    			}
    			if ((status [ 1 ] == LOW) && (data [1] > TRIGGERLEVEL + HYSTERESIS)) {
    			status [1] = HIGH;
    			*b ++;
    			}
    			
    			if ((status [ 1 ] == HIGH) && (data [1] < TRIGGERLEVEL + HYSTERESIS)) {
    			status [1] = LOW;
    			*b ++;
    			}
    			
    return 0 ;
     	
    }

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    ja, möglich ist das. nur backleds und odometrie stören sich.
    was genau macht der asuro mit dem code?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.10.2007
    Beiträge
    16
    zuerst kann gewählt werden mit welcher geschwindigkeit der asuro fahren soll. egal in welchem gang er dann fährt soll er die drehzahl der räder ausgeben nach dem stop gesendet wurde. anschliessend kommt man dan wieder in das menu wo man sagt in welchem gang der asuro fahren soll

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    ok. und was passiert wenn du den code flashst? was genau ist der fehler?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Touby_van,

    in deiner Funktion linien_verfolgen() benutzt du innerhalb der dortigen while()-Schleife den Befehl SerRead() im blokierenden Mode. (Der letzte Parameter ist eine 0) Das bedeutet, dass immer erst 3 Zeichen empfangen werden müssen, bevor die Schleife, und damit die aufzurufenden LineData()- / Odometrie_zaehler()-Funktion überhaupt einmal zum Arbeiten kommen.
    BTW: Du solltes auch auf das Senden mit "SerWrite ("falsch", 6);" verzichten, da dies sehr viel Zeit (6*ca.4ms) in Anspruch nimmt in der du die Sensoren nicht bearbeitest. Da wirst du wahrscheinlich dann sehr viele schwarz/weiss-Wechsel an der Odometrie nicht mitbekommen.

    Ich vermute, dass der Asuro sich keinen Millimeter von der Stelle bewegt.

    Gruß Sternthaler

    @damaltor
    Ich muss es einfach noch mal erwähnen: Deine Fußzeilen (nicht nur die) sind immer wieder gut.
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

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

LiFePO4 Speicher Test