- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 2 von 2

Thema: Asuro: Odometrieproblem (anfänger)

  1. #1

    Asuro: Odometrieproblem (anfänger)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo

    Ich habe jetzt seit gestern meinen Asuro fertig und damit fangen meine Probleme schon an.
    Nachdem ich mich ein bisschen mit der asurolib v26 auseinander gesetzt hab, kam folgendes stück code zustande, was den Roboter eigendlich nur geradeaus fahren lassen soll und sobald er an eine Tischkannte kommt, (im dunklen Raum und heller Platte) anhalten, zurücksetzen und wenden soll.

    Das 1. Problem ist das nach kurzem im Kreis fahren (anstatt geradeaus) die beiden Motoren stillstehen. Das 2. Problem ist das Ab beginn der if Abfrage die Variablen encoder[RIGHT] und encoder[LEFT] immer gleich 0 sind.

    Code:
    #include "asuro.h"  // bitte die neue Datei benutzen 
                        // asuro.h und asuro.c vom 31.03.05 oder neuer
    
    int main(void)
    {	
    	unsigned int ldon[2];
    	unsigned int ldoff[2];
    	int fahr=0;
    	int diff=0;
    	int ldiff=0;
    	Init();
    	Encoder_Init();
    	Encoder_Start();
    	StartSwitch();
    	MotorDir(FWD,FWD);
    	MotorSpeed(175,175);
    	while (!switched && fahr==0) {
    		SerWrite("going\n\r",9);
    		MotorDir(FWD,FWD);
    		diff=encoder[RIGHT]-encoder[LEFT];
    		MotorSpeed(175+diff,175-diff);
    		FrontLED(OFF);
    		LineData(ldoff);
    		FrontLED(ON);
    		LineData(ldon);
    		ldiff=ldon[0]-ldoff[0];
    		SerWrite("\nLinks:",8);
    		PrintInt(encoder[LEFT]);
    		SerWrite("\nRechts:",9);
    		PrintInt(encoder[RIGHT]);
    		if (ldiff<100) 
    		{	
    			SerWrite("stopped!\n\r",12);
    			MotorSpeed(0,0);
    			MotorDir(RWD,RWD);
    			MotorSpeed(175,175);
    			SerWrite("Moveing back\n\r",16);
    			Encoder_Set(0,0);
    			Encoder_Start();			
    			while (encoder[RIGHT] < 24)
    			{	
    				diff=encoder[RIGHT]-encoder[LEFT];
    				MotorSpeed(175+diff,175-diff);
    				PrintInt(encoder[RIGHT]);
    			}
    			MotorDir(BREAK,RWD);
    			SerWrite("Turning\n\r",11);
    			Encoder_Set(0,0);
    			Encoder_Start();
    			while (encoder[RIGHT] < 50)
    			{
    				diff=encoder[RIGHT]-encoder[LEFT];
    				MotorSpeed(175+diff,175-diff);
    				PrintInt(encoder[RIGHT]);
    			}
    		}
    	}
    	MotorSpeed(0,0);
    	while(1);
    	return 0;
    }
    Angehängte Dateien Angehängte Dateien

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Ort
    München
    Alter
    52
    Beiträge
    59
    Hallo,

    mir gefallen ein paar sachen an deinem Programm nicht. - Sorry

    A) Du verwendes während der Regelschleife SerWrite. Da ist jedliches Timing dahin d.h. die Regelung wird ncht mehr in definierten Abständen ausgeführt und auch zu langsam hinereinander. Da passieren bei mir auch immer komische dinge.

    B) Du berechnest ldiff aus einer Differenz zwischen der Helligkeit von ein und ausgeschalteter FrontLED. Kann es sein das die Differenz immer <100 ist und somit die Edomentriecounter immer auf 0 gesetzt werden.

    C) Fang doch mal klein an. Wenn du nur die Geradeausfahrt programmierrst, fährt dein ASURO dann gerade aus?

    ungefähr so
    while (!swithced) {
    diff = encoder[LEFT]-encoder[Right];
    Motorspeed(175-diff,175+diff); // Alternativ (175+diff,175-diff) (siehe unten)
    MSleep(100);
    }
    Damit solle er nur gerade aus fahren. Wenn du allerdings (was auch bei Dir der fall sein könnte) einen Vorzeichenfehler bem MotorSpeed drin hast, fährt er einen Kreis.

    Martin

Berechtigungen

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

Solar Speicher und Akkus Tests