- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 10

Thema: Konstante Geschwindigkeit macht mich verrückt

  1. #1

    Konstante Geschwindigkeit macht mich verrückt

    Anzeige

    Powerstation Test
    Hallo zusammen.

    Vieleicht finde ich einen Crack unter euch, der mir sagt, warum mein ASURO nich mit einer konstanten geschwindigkeit fahren will. Habe schon mal was zusammengeschrieben, aber leider macht er lustige Sachen anstatt konstant zu fahren

    Ich wäre sehr dankbar wenn mir jemand ein paar tipps geben könnte.


    Code:
    #include "asuro.h" 
    #include <stdlib.h> 
    
    
    void speed(unsigned char wegl)
    { 
    unsigned char speed;
    int wegl;
    speed=wegl;
    if(wegl<80)speed++;
    else{speed--;}
    return (speed);
    }
    
    int main(void) 
    { 
    	unsigned char sped, flagl=0, flagr=0; 
    	unsigned int data[2]; 									//Speicher Bereitstellen
    	int wegl, wegr, diff, time, timeb;
    	int speedLeft,speedRight;
    	
    	Init();
    	MotorDir(RWD,RWD);
    	StatusLED(GREEN); 
    	speedLeft = speedRight = speed;
    	
    	
    	while(TRUE)
    	{
    		wegl=0; wegr=0;
    		for(time=1; time<500; time++)				// Zeitschleife 1 Sekunde
    		{
    			OdometrieData(data); 
    			if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;} 
    			if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;} 
    			if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;} 
    			if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;} 
    			diff=wegr-wegl; 
    			if (diff>0) speedRight--;             		     // fahre geradeaus 
    				else if (diff<0) speedLeft--; 
    				else 
    				{
    				speedRight=speed; 
    				speedLeft=speed;
    				} 
    			if (speedRight<0) {speedRight=0;} 
    			if (speedLeft<0) {speedLeft=0;} 
    		
    				MotorSpeed(speedLeft,speedRight); 
    				SerWrite(wegl, sizeof(wegl));
    				Sleep(76);									// 1 Millisekunde pause	
    		}
    		
    		if(PollSwitch()>0) 
    		{
    			for (timeb=1;timeb<500;timeb++)		
    			{
    				if(PollSwitch()>0) 
    				{
    				MotorDir(BREAK,BREAK);
    				BackLED(ON,ON);
    				Sleep(76);
    				}
    			}
    		}
    		
    	}
     
       return 0; 
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Erstmal herzlich willkommen im RN-Forum.

    Dein Programm sieht ja nicht schlecht aus. Allerdings stimmen bei deinem asuro die Motordrehrichtungen scheinbar nicht (Auslieferfehler des asuros). Mich stört das im Moment nicht, weil mein asuro grad auch falschrum läuft. Besser wäre es aber, wenn du die Motorleitungen drehen würdest.

    Zu deinem Programm:
    Ich habe die Funktion speed() entfernt, weil sie nicht verwendet wird. Die Variable sped heist jetzt speed, der SerWrite()-Befehl wurde auskommentiert. Ebenso das include der stdlib.h, die wird von asuro.h automatisch eingebunden(?). Jetzt kann ich dein Programm fehlerfrei übersetzen und, oh Wunder, scheinbar funktioniert es sogar mit meinem asuro (der ganz spezielle Odo-Scheiben drauf hat):

    Code:
    #include "asuro.h" 
    //#include <stdlib.h>
    
    int main(void)
    {
    unsigned char flagl=0, flagr=0;
    unsigned int data[2]; //Speicher Bereitstellen
    int wegl, wegr, diff, time, timeb;
    int speed=200, speedLeft,speedRight;
    
    Init();
    MotorDir(RWD,RWD);
    StatusLED(GREEN);
    speedLeft = speedRight = speed;
    
    
    while(TRUE)
    {
    wegl=0; wegr=0;
    for(time=1; time<500; time++) // Zeitschleife 1 Sekunde
    {
    OdometrieData(data);
    if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;}
    if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;}
    if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;}
    if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;}
    diff=wegr-wegl;
    if (diff>0) speedRight--; // fahre geradeaus
    else if (diff<0) speedLeft--;
    else
    {
    speedRight=speed;
    speedLeft=speed;
    }
    if (speedRight<0) {speedRight=0;}
    if (speedLeft<0) {speedLeft=0;}
    
    MotorSpeed(speedLeft,speedRight);
    //SerWrite(wegl, sizeof(wegl));
    Sleep(76); // 1 Millisekunde pause
    }
    
    if(PollSwitch()>0)
    {
    for (timeb=1;timeb<500;timeb++)
    {
    if(PollSwitch()>0)
    {
    MotorDir(BREAK,BREAK);
    BackLED(ON,ON);
    Sleep(76);
    }
    }
    }
    
    }
    
    return 0;
    }
    (längere Programme bitte immer im code-Tag posten)

    Mein asuro fährt damit fast geradeaus (etwas langsam wegen meinem Vorgelege). Wenn ich ihn in der Luft halte und ein Rad mit der Hand abbremse, wird auch das andere Rad gebremst. Prima! Auch deine Odo-Erfassung und die PollSwitch()-Auswertung sind pfiffig und auf Anhieb gut gelöst. Du scheinst mir ein kleiner Hacker zu sein.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.01.2004
    Alter
    35
    Beiträge
    645
    Nicht schlecht gemacht! Ich kanns zwar nicht testen, aber vom "Gefühl" her würde ich das Zeitfenster für die Abfrage der Odo Werte kleiner machen, va. für größere Geschwindigkeiten.
    MfG Xtreme
    RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!

  4. #4
    Erst mal danke für die schnellen Antworten.

    So wie das Programm von Radbruch umgestellt wurde ist schon ganz gut allerdings fehlt jetzt komplett die komponente mit der konstanten Geschwindigkeit.

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    allerdings fehlt jetzt komplett die komponente mit der konstanten Geschwindigkeit.
    Ups, stimmt. Das habe ich völlig verdrängt. Ein einfacher Ansatz:

    Code:
    #include "asuro.h"
    //#include <stdlib.h>
    
    int main(void)
    {
    	unsigned char flagl=0, flagr=0;
    	unsigned int data[2]; //Speicher Bereitstellen
    	int wegl, wegr, diff, time, timeb;
    	int speed, speedLeft, speedRight;
    	int speedSoll, speedDiff;
    
    	Init();
    	MotorDir(RWD,RWD);
    	StatusLED(GREEN);
    	speedSoll=200;
    	speedLeft = speedRight = speed = speedSoll;
    
    	while(TRUE)
    	{
    		wegl=0; wegr=0;
    		for(time=1; time<500; time++) // Zeitschleife 1 Sekunde
    		{
    			OdometrieData(data);
    			if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;}
    			if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;}
    			if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;}
    			if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;}
    			diff=wegr-wegl;
    			if (diff>0) speedRight--; // fahre geradeaus
    			else if (diff<0) speedLeft--;
    			else
    			{
    				speedRight=speed;
    				speedLeft=speed;
    			}
    
    			// Summe links+rechts mit 2*soll vergleichen und die Differenz addieren
    			speedDiff=(2*speedSoll-(speedLeft+speedRight))/2;
    			speedLeft+=speedDiff;
    			speedRight+=speedDiff;
    
    			StatusLED(GREEN); // gelb=beschleunigen, rot=bremsen, gruen=sollspeed?
    			if (speedDiff > 0) StatusLED(YELLOW);
    			if (speedDiff < 0) StatusLED(RED);
    
    			MotorSpeed(speedLeft,speedRight);
    			//SerWrite(wegl, sizeof(wegl));
    			Sleep(76); // 1 Millisekunde pause
    		}
    
    		if(PollSwitch()>0)
    		{
    			for (timeb=1;timeb<500;timeb++)
    			{
    			if(PollSwitch()>0)
    			{
    				MotorDir(BREAK,BREAK);
    				BackLED(ON,ON);
    				Sleep(76);
    			}
    		}
    	}
    
    }
    
    return 0;
    }
    speedSoll wird gerecht zwischen beiden Motoren aufgeteilt. Ob das so funktioniert kann ich leider nicht feststellen. Eine ernsthaftere Lösung sollte die Wege über der Zeit messen und danach die Motoren regeln. Aber das kann man nicht so auf die Schnelle zusammenbasteln...

    Eigentlich warte ich noch auf den unvermeidlichen(?) Hinweis auf die erweiterten Funktionen der aktuellen asuro-Lib. Damit gehts zwar auch, aber man lernt eben mehr, wenn man es selbst macht.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Na klar muss jetzt der Hinweis auf die Lib kommen.
    Aber diesmal ist es so, dass dort keine Lösung für eine konstante Geschwindigkeit vorhanden ist. Ja gibt es denn so was?
    Die dort vorhandenen Funktion Go() und Turn() sorgen 'nur' für ein saubers geradeausfahren und eine kontrollierte Drehung. (Allerdings wird dort sehr gut versucht die Vorgabe einzuhalten.)

    Ist aber nicht so, dass diese Forum nix zur Geschwindigkeitskonstantfaht hergibt. Suchen ist aber angesagt, da ich den Thread aktuell auch nicht kenne. (Ich bin nicht sicher, aber müsste von waste oder stochri sein.)
    Lieber Asuro programieren als arbeiten gehen.

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Ja gibt es denn so was?
    Weil ihr euch alle auf die Bezeichnung MotorSpeed() eingeschossen habt. Wenn es MotorPower() heisen würde, wäre der Unterschied deutlich und der Bedarf einer echten MotorSpeed()-Funktion sofort erkennbar.

    Ich hatte das auch mal versucht, aber der Code ist noch voller Bugs:

    https://www.roboternetz.de/phpBB2/ze...g.php?p=245126
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Ich mabe das veränderte Programm von Mic ausprobiert und finde, dass es richtig gut gelungen ist. Besonders die Pfiffige lösung mit der Konstanten Geschwindigkeit finde ich gut.

    // Summe links+rechts mit 2*soll vergleichen und die Differenz addieren
    speedDiff=(2*speedSoll-(speedLeft+speedRight))/2;
    speedLeft+=speedDiff;
    speedRight+=speedDiff;

    Offensichtlich ein Könner am werk

    Leider sieht man unteschiede beim bergauf und begabfahren. Liegt das ab der Motorleistung oder an was anderem???

    Die StatusLED zeigt zwar gelb , grün und rot an aber es flackert durcheinander.

    Würde mich über weitere Tipps freuen.

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Danke für die Blumen.

    Es ist eben keine echte Regelung. Die Werte in MotorSpeed() geben nur die Leistung an, die die Motoren erhalten. Nicht berücksichtigt werden die Motoreigenschaften, Gängigkeit der Getriebe, Ausrichtung der Räder etcetc. Das Flackern kommt vermutlich von der Trägheit des asuros, dadurch wird er schubweise beschleunigt/gebremst.

    Meinem Ketten-asuro ist es egal ob er bergauf oder bergab fährt. Auch meine Odo-Scheiben sind für dieses Programm denkbar ungeeignet. Ich habe also keine Ahnung, wie sich ein "normaler" asuro damit verhält.

    Was ich deutlich sehen kann ist das Ende der time-Schleife. Ich vermute, das ist sowieso ein Bug, denn die Hauptschleife des Programms wird in der Time-Schleife 500mal ausgeführt und dann, nach der Tastenabfrage, mit wegr=wegl=0 erneut gestartet. Ich meine, dieses Rücksetzen der Wegregister kann ich bei meinem asuro am Fahrverhalten sehen.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    habe deinen post mal etwas angepasst. funktioniert das programm denn jetzt?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad