- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Odometrie Programmfehler?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131

    Odometrie Programmfehler?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich habe auch ein problem mit der odometrie des ASURO's.
    Zwar funktioniert das geradeaus fahr programm einwandfrei, nur wollte ich mal ein programm schreiben, das den asuro nach einem meter abbremsen lässt, also habe ich die ticks pro meter errechnet (bei 8 ticks pro reifenumdrehung). Hier ergab sich der Quotient 67. Nun habe ich folgendes programm geschrieben, allerdings fährt der asuro nur kurz an und stoppt dann.

    [programmcode im nächsten post -- damaltor, 07.02.08, 20:00h]

    Hoffe ihr könnt mir weiterhelfen!

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    oh sry habe den falschen button benutzt!!
    Code:
    /*Geradeaus fahren*/
    
    #include "asuro.h"
    
    #define TRIGGERLEVEL 390
    #define HYSTERESIS 6
    #define LOW 0
    #define HIGH 1
    
    int main(void)
    {
    	unsigned int data[2];//Variable für Odometrie
    	signed int status[2]={0,0};//Variable für Status HIGH or LOW
    	signed int difference=0;//Zählvariable
    	unsigned int distance=0;
    	Init();
    	MotorDir(FWD,FWD);
    	while(1) {
    		//Heligkeitswerte 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--;}
    			
    		//Sicherheitssperre für Zählvariable
    /**********************************************************/
    		//Wertebereich größer als 255
    		if (difference>255) {
    			difference=255;}
    		//Wertebereich kleiner als -255
    		if (difference<-255) {
    			difference=-255;}
    		//Zähldifferenz auswerten:
    		//Motoren passend betreiben
    /*********************************************************/
    		//links schneller Drehen ==> links um difference verlangsamen
    		if (difference>0) {
    			MotorSpeed(150-difference,150);}
    		//sonst rechts um difference beschleunigen
    		else {MotorSpeed(150,150+difference);}
    		if (distance>=67){
    		MotorDir(BREAK,BREAK);
    		MotorSpeed(0,0);}
    	}
    	return 0;
    }

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    für den jenigen, der es selbstmal ausprobieren möchte, hier istz die .hex datei!!
    Angehängte Dateien Angehängte Dateien

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hast du den Wert für den Triggerlevel ermittelt? Ausserdem scheint mir deine Hysterese etwas "eng".

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    hi,
    betreff zu triggerlever und hysteresis:
    naja, aber es klappt ja vorher ohne die variable distance, also muss es ja eig auch jeztzt klappen, oer?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    hast du es bei dir mal ausprobiert?
    funktioniert es bei dir auch nicht?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    17.12.2007
    Ort
    Hann. Münden
    Alter
    38
    Beiträge
    63
    könnte daran liegen das je nach schwarz weiß kleber 8*5=40 bzw. 12*5=60 sind. du hast ja noch die übersetztung auf die antriebsachse

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Also ich habe folgenden Code (läuft bei mir mit den 12er Scheiben):

    Code:
    #include "asuro.h"
    
    #define TRIGGERLEVEL 830
    #define HYSTERESIS 10
    #define LOW 0
    #define HIGH 1
    
    int main(void)
    {
        unsigned int data[2];
        signed int status[2]={0,0};
        signed int difference=0;
        Init();
        MotorDir(FWD, FWD);
        while(1) {
            // 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++;
            }
            // Wechsel linker Sensor von hoch auf niedrig?
            if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
                status[0]=LOW;
                difference++;
            }
            // 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�ler
            // den erlaubten Wertebereich verl�st
            if (difference<-255) difference=-255;
            if (difference>255) difference=255;
            
            // Status-LED noch entsprechend der erkannten Segmente
            // aufleuchten lassen, grn fr links, rot fr rechts
            StatusLED(status[0]+status[1]*2);
            
            // Z�ldifferenz passend auf die Motoren verteilen
            if (difference>0) MotorSpeed(255-difference,255);
            else MotorSpeed(255,255+difference);
            
        }
        return 0;
    }

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    hallo,
    @matze: also du hast schon recht, da ha ich was übersehen. allerdings klappt das auch nicht, wenn ic hden code entsprechend ändere:
    Code:
    /*Geradeaus fahren*/
    
    #include "asuro.h"
    
    #define TRIGGERLEVEL 390
    #define HYSTERESIS 6
    #define LOW 0
    #define HIGH 1
    
    int main(void)
    {
    	unsigned int data[2];//Variable für Odometrie
    	signed int status[2]={0,0};//Variable für Status HIGH or LOW
    	signed int difference=0;//Zählvariable
    	unsigned int distance=0;
    	Init();
    	MotorDir(FWD,FWD);
    	while(1) {
    		//Heligkeitswerte 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--;}
    			
    		//Sicherheitssperre für Zählvariable
    /**********************************************************/
    		//Wertebereich größer als 255
    		if (difference>255) {
    			difference=255;}
    		//Wertebereich kleiner als -255
    		if (difference<-255) {
    			difference=-255;}
    		//Zähldifferenz auswerten:
    		//Motoren passend betreiben
    /*********************************************************/
    		//links schneller Drehen ==> links um difference verlangsamen
    		if (difference>0) {
    			MotorSpeed(150-difference,150);}
    		//sonst rechts um difference beschleunigen
    		else {MotorSpeed(150,150+difference);}
    		if (distance>=335){
    		MotorDir(BREAK,BREAK);
    		MotorSpeed(0,0);}
    	}
    	return 0;
    }
    @pinsel: also mein asuro verfolgt ja so eine linie, allerdings nicht mehr wenn ich vresuche mit der variablen distance die strecke zu definieren zu versuche,

    läuft denn test.hex auf euren asuros?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    17.01.2008
    Ort
    Ahnatal / Kassel
    Alter
    50
    Beiträge
    11
    Ich hab mir folgenden Code gebastelt.
    Anders ist, dass der Mittelwert der Sensoren permanent der Umgebung angeglichen wird.

    Mit dabei ist noch eine Abfrage der Taster, die den Asuro umkehren/ausweichen lassen. Nachteil dabei ist, dass er nach nem Richtungswechsel erstmal etwas unkontrolliert losrennt, weil er den Zähler während des Richtungswechsels nicht ausreichend hochzählt.

    Fehlen tut noch ne Begrenzung der Maximalgescheindigkeit auf 255. Wenn ich ein Rad also nach und nach stärker blockiere, geht der Motor auf null und regelt sich dann wieder neu ein.

    Aufgefallen ist mir, dass sich das linke Rad rückwärts langsamer dreht als vorwärts. Kann das mal jemand ausprobieren, obs bei anderen Asuros auch so ist?

    Code:
    #include "asuro.h"
    
    
    int main(void) {
    	unsigned int odo_max_l,odo_max_r,odo_min_l,odo_min_r,odo_mitte_l,odo_mitte_r,data[2];
    	unsigned char auf_l,auf_r,speed,speed_wert,speed_l,speed_r,zaehler_l,zaehler_r,schwing,rueckw,dreh_l,dreh_r,taste;
    	unsigned long dauer1,dauer2;
    	Init();
    	MotorDir(FWD,FWD);
    	auf_r=auf_l=0;
    	zaehler_r=zaehler_l=rueckw=dreh_l=dreh_r=0;
    	odo_max_l=odo_max_r=odo_min_l=odo_min_r=300;
    	speed=120;
    	speed_l=speed_r=speed;
    	speed_wert=(speed/20);
    	MotorSpeed(speed_l,speed_r);  
    
    	while(1) {
    		
    		for(schwing=0;schwing<30;schwing++) {
    			dauer1=Gettime();
    			odo_max_l--;
    			odo_max_r--;
    			odo_min_l++;
    			odo_min_r++;
    			OdometrieData(data);
    			if (data[0]>odo_max_l) {odo_max_l=data[0];}
    			if (data[1]>odo_max_r) {odo_max_r=data[1];}
    			if (data[0]<odo_min_l) {odo_min_l=data[0];}
    			if (data[1]<odo_min_r) {odo_min_r=data[1];}
    			odo_mitte_l=(odo_max_l+odo_min_l)/2;
    			odo_mitte_r=(odo_max_r+odo_min_r)/2;
    			if ((auf_l==0) && (data[0]>(odo_mitte_l+5))) {
    				auf_l=1;
    				zaehler_l++;
    			}
    			else if ((auf_l==1) && (data[0]<(odo_mitte_l-5))) {
    				auf_l=0;
    			}
    			if ((auf_r==0) && (data[1]>(odo_mitte_r+5))) {
    				auf_r=1;
    				zaehler_r++;
    			}
    			else if ((auf_r==1) && (data[1]<(odo_mitte_r-5))) {
    				auf_r=0;
    			}
    		
    			dauer2=Gettime();
    			while ((dauer1+5)>dauer2) {dauer2=Gettime();}
    		}
    		
    		if (zaehler_l<speed_wert) {speed_l=speed_l+speed_wert;}
    		else if (zaehler_l>speed_wert) {speed_l=speed_l-speed_wert;}
    		
    		if (zaehler_r<speed_wert) {speed_r=speed_r+speed_wert;}
    		else if (zaehler_r>speed_wert) {speed_r=speed_r-speed_wert;}
    		
    		zaehler_l=zaehler_r=0;
    		
    		if (PollSwitch()>0) {
    			taste=PollSwitch();
    			if (taste==1) {dreh_l=(800/speed);}
    			if ((taste==2) || (taste==4)) {dreh_r=(1200/speed);}
    			if (taste==31) {dreh_r=(800/speed);}
    			if ((taste==8) || (taste==16)) {dreh_l=(1200/speed);}
    		}
    		
    		if (dreh_l>0) {
    			MotorDir(RWD,BREAK);
    			dreh_l--;
    			speed_r=speed_r-speed_wert;
    		}
    		else if (dreh_r>0) {
    			MotorDir(BREAK,RWD);
    			dreh_r--;
    			speed_l=speed_l-speed_wert;
    		}
    		else {
    			MotorDir(FWD,FWD);
    		}
    		
    		MotorSpeed(speed_l,speed_r);
    	}
    	return 0;

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress