-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Asuro, bestimmte Zeit einstellen (z.b. beim Rückwärtsfahren)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25

    Asuro, bestimmte Zeit einstellen (z.b. beim Rückwärtsfahren)

    Anzeige

    Hallo zusammen.
    Vorweg muss gesagt werden, dass ich ein absoluter Anfäger bin was programmieren angeht. Hab zwar schon einige kleinere Programme geschrieben aber jetzt steh ich vor einer größeren Herausforderung:

    Wie schaffe ich es, dass mein Roboter nur z.b. eine halbe Sekunde rückwärts fährt, sich umdreht und dann vorwärts weiter fährt (Natürlich erst wenn er an einer Wand anstößt)
    Vielleicht kann auch jemand mein Programm durchschaun, das zwar syntaktisch korrekt ist aber trotzdem nicht das macht was ich will =)
    Speziell die Sache mit "for" erschließt sich mir nicht.

    Code:
    #include "asuro.h"
    
    int main()
    {
    Init();
    int i;
    while(1)
    {
    	if (PollSwitch()==0)  		/* Keine Kollision */
    	{
    	StatusLED(GREEN);
    	MotorDir(FWD,FWD);
    	MotorSpeed(155,155);
    	}
    
    	else if (PollSwitch()==1) 	/* Taster rechts-außen wird gedrückt */
    	{
    	StatusLED(RED);				
    	MotorDir(RWD,RWD);			/* Rückwärtskurve rechts*/
    	MotorSpeed(100,20);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    		
    	MotorDir(FWD,FWD);			/* Vorwärtskurve links*/
    	MotorSpeed(20,100);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    	}
    	
    	else if (PollSwitch()>31)	/* Taster Links-außen wird gedrückt */
    	{
    	StatusLED(YELLOW);
    	MotorDir(RWD,RWD);			/* Rückwärtskurve links */
    	MotorSpeed(20,100);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    		
    	MotorDir(FWD,FWD);			/* Vorwärtskurve rechts */
    	MotorSpeed(100,20);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    	}
    	
    	else						/* Andere Taster werden gedrückt */
    	{
    	BackLED(ON,ON);				
    	MotorDir(RWD,RWD);			/* Rückwärts fahren */
    	MotorSpeed(100,100);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    		
    	MotorDir(RWD,FWD);			/* Drehung gegen UZS */
    	MotorSpeed(100,100);
    	for (i=0; i<250;i++)
    	
    		{Sleep(216);}
    	}
    }
    return 0;
    }
    Seid nicht zu streng mit mir
    lg Ollowain

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Vielleicht kann auch jemand mein Programm durchschaun, das zwar syntaktisch korrekt ist aber trotzdem nicht das macht was ich will =)
    Auf ersten sicht sieht das gut aus. Aber das problem ist das du nicht erzählst hast was er macht, nur was du wölltest er macht. Bitte gib eine genaue beschreibung wie die motoren drehen wenn du einer der taster eindruckt. Und die farbe der Statusled.

    Und das ist nicht bösse gemeint. Sicherlich nicht persönlich. Viele anfanger mit problehmen machen ein thread mit versuchen fur hilfe, aber vergessen mit zu teilen was er (asuro) mit das Program macht. Leider haben wir keine Magische Glass-Kügel im Forum-suchfunktion.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    ok, hab das programm nochmal kurz überarbeitet (i<10 auf i<250)
    Das ist auf jeden fall schonmal ein fortschritt denn nun "ruckeln" die motoren nicht mehr so wie es vorher war. (i war wahrscheinlich zu klein).
    Im Moment leutet die StatusLED grün. außerdem fährt er rückwärts, bleibt stehn, dreht rechts, fährt rückwärts, bleibt stehn, dreht rechts, usw... Also eine Art kreis gegen den Uhrzeigersinn allerdings rückwärts. Außerdem leuchten beide hinteren LEDs. Auf Tasterdruck reagiert er nicht.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.04.2008
    Ort
    Bremen
    Alter
    27
    Beiträge
    85
    Hi,
    dass Problem bei dem PollSwitch ist meistens das auch mal ein paar Bytes einfach so kommen obwohl keine Taste gedrückt worden ist und deswegen er unkontrollierte Bewegungen macht. Also einfach ein Sleep reingebaut damit er warten muss^^

    Habs mal überarbeit:

    Code:
    #include "asuro.h"
    
    int main()
    {
    	Init();
    	
    	int i;
    
    
    	while(1)
    	{
       		if (PollSwitch()==0)        /* Keine Kollision */
       		{
    		   	StatusLED(GREEN);
    
    		   	MotorDir(FWD,FWD);
            		MotorSpeed(155,155);
    
    			for (i=0; i<50;i++)
    			{
    				Sleep (72);
    			}
       		}
    
    		
    	   	else if (PollSwitch()==1)    /* Taster rechts-außen wird gedrückt */
       		{
    			StatusLED(RED);
                
       			MotorDir(RWD,RWD);         /* Rückwärtskurve rechts*/
       			MotorSpeed(100,20);
    
    	   		for (i=0; i<1000;i++)	   /*1sekunde rückwärts fahren (1000mls)*/
       			{
          				Sleep(72);
    			}
    
          
       			MotorDir(FWD,FWD);         /* Vorwärtskurve links*/
    		   	MotorSpeed(20,100);
    
       			for (i=0; i<500;i++)
       			{
         				Sleep(72);
    			}
       		}
       
    
       		else if (PollSwitch()>31)   /* Taster Links-außen wird gedrückt */
       		{
       			StatusLED(YELLOW);
       
    			MotorDir(RWD,RWD);         /* Rückwärtskurve links */
       			MotorSpeed(20,100);
    
       			for (i=0; i<1000;i++)
       			{
         				Sleep(72);
    			}
          
    
       			MotorDir(FWD,FWD);         /* Vorwärtskurve rechts */
       			MotorSpeed(100,20);
    
       			for (i=0; i<500;i++)
       			{
         				Sleep(72);
    			}
       		}
       
    
       		else                  /* Andere Taster werden gedrückt */
       		{
       			BackLED(ON,ON);            
       
    			MotorDir(RWD,RWD);         /* Rückwärts fahren */
       			MotorSpeed(100,100);
    
       			for (i=0; i<1000;i++)
       			{
         				Sleep(72);
    			}
          
    
       			MotorDir(RWD,FWD);         /* Drehung gegen UZS */
       			MotorSpeed(100,100);
    
       			for (i=0; i<500;i++)
       			{
         				Sleep(72);
    			}
    		}
    	}
    
    return 0;
    }
    Die Sleeps hab ich auf 72 gestellt das entspricht einer Millisekunde, so kann man nämlich ganz leicht eine Sekunde einstellen (Schleife mit 1000 durchläufen). Auch war ich mal so frech und hab es bissi übersichtlicher gestaltet

    beste Grüße
    the.speciali
    Wer den Himmel auf Erden sucht hat im Erdkundeunterricht geschlafen!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    super danke the.speciali das hilft mir total weiter und ich hab wieder was dazu gelernt. Allerdings wird das bei weitem nich das letzte Problemchen gewesen sein aber ich weiß ja jetzt wohin ich mich wenden kann.
    grüße Ollowain

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Ich habe noch etwas langer daruber gedacht, und da fehlt etwas in deiner taster logik. Kein problem, binaire zahlen ist auch nicht einfach fur anfanger.

    Code:
    else if (PollSwitch()>31)   /* Taster Links-außen wird gedrückt */
    Pollswitch()>31 meinst nicht nur 'gleich 32', oder 'das muss meiner linker taster sein'. Aber auch vieleicht 'gleich 43 oder 50, 58, 63, 64, 128, 201 usw. bis 255'. Pollswitch gibt einer wert zuruck als char typ. Das könnte im prinzip werte sein von 0 bis 255 (inklussif). Asuro hat aber nur 6 taster. Dafur braucht man auch nur 6 bits in einer variabele speicherplatz. Deshalb gibt Pollswitch nur werte zwischen 0 bis 63 (inkl.) zuruck. Aber fur den werten 32 bis und inklusief 63, gibt es eine menge von 32 kombinationen mit nur eins (den ganz linker) oder jeder taster.
    Also, wenn Asuro irgendwie die meist links-ausen taster eingedruckt kriecht, aber auch einer oder mehr von den andere Taster wird diesen If-stellung war sein. Du wunscht aber nur den ganz links-aussen taster. Dazu muss es "=32" sein. Weil 32 ist gleich "100000" in binaire zahlung. ">31 ist gleich wie '001xxxxx' in binair zahlung. Wo 'x' heist 'kan 1 oder 0 sein', oder 'machts nicht was es ist'.

    Ich hoffe das obene macht sinn fur dich, weil es ganz wichtig ist wenn mann sich mit mircocontroller oder programieren beschaftigen möchtest. Leider habe ich viele schwierigkeiten das deutlich zu erklären auf Deutsch.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Hier ist meiner (bearbeiteten) code:

    Code:
    #include "asuro.h" 
    
    int main() 
    { 
       Init(); 
        
       int i;
    
       char t1,t2,tasterzustand; 
    
    
       while(1) 
       { 
    	 t1=PollSwitch();
             t2=PollSwitch();   /* zwei mal tasterwert messen fur stabiele wert */
             if (t1==t2)         /* sind die taster eindrucken stabiel?  */
                 {
                   tasterzustand=t1; /* ja ist es, tasterzustand ist erste messung */ 
                 }
             else
                 {
                   tasterzustand=0;  /* nee, ist es nicht, tasterzustand ist 'kein taster' */
                 }
             
    	 if (tasterzustand==0)        /* Keine Kollision: 00000000 im binaire zahlung */ 
             { 
               StatusLED(GREEN); 
    
                MotorDir(FWD,FWD); 
                MotorSpeed(155,155);
                BackLED(OFF,OFF);    /* Ich gehe voraus, vieleicht sind die LEDs schon aus, aber tu es sonnst */ 
    
                for (i=0; i<50;i++) 
                { 
                  Sleep (72); 
                } 
             } 
    
           
             else if (tasterzustand==1)    /* Taster rechts-außen wird gedrückt: 00000001 im binaire zahlung */ 
             { 
                StatusLED(RED); 
                
                MotorDir(RWD,RWD);         /* Rückwärtskurve rechts*/ 
                MotorSpeed(100,20); 
                BackLED(ON, OFF);    /* Meiner linken Rad dreht (schneller) rückwärts  */
    
                for (i=0; i<1000;i++)      /*1sekunde rückwärts fahren (1000mls) */ 
                { 
                      Sleep(72); 
                } 
          
                MotorDir(FWD,FWD);         /* Vorwärtskurve links*/ 
                MotorSpeed(20,100); 
                BackLED(OFF, OFF);    /* Gehe wieder vorwärts */
    
                for (i=0; i<500;i++) 
                { 
                     Sleep(72); 
                } 
             } 
        
    
             else if (tasterzustand=32)   /* Taster Links-außen wird gedrückt: 00100000 im binaire zahlung */
    				      /* '>31' is xx1xxxxx im binaire zahlung, und nicht nur die ganz linker taster*/ 
             { 
                StatusLED(YELLOW); 
        
                MotorDir(RWD,RWD);         /* Rückwärtskurve links */ 
                MotorSpeed(20,100);
                BackLED(OFF, ON);    /* Meiner Rechter Rad dreht (schneller) rückwärts  */ 
    
    
    
                for (i=0; i<1000;i++) 
                { 
                     Sleep(72); 
                } 
          
                
                MotorDir(FWD,FWD);         /* Vorwärtskurve rechts */ 
                MotorSpeed(100,20); 
                BackLED(OFF, OFF);    /* Ich gehe wieder vorwärts*/
                
                for (i=0; i<500;i++) 
                { 
                     Sleep(72); 
                } 
             } 
        
    
             else                  /* Andere Taster werden gedrückt: 00xxxxxx im binaire zahlung */ 
             { 
                
                MotorDir(RWD,RWD);         /* Rückwärts fahren */ 
                MotorSpeed(100,100); 
                BackLED(ON,ON);        /* Beider Rädern drehen zurück */             
        
                for (i=0; i<1000;i++) 
                { 
                     Sleep(72); 
                } 
          
                
     
                MotorDir(RWD,FWD);         /* Drehung gegen UZS */ 
                MotorSpeed(100,100);
                BackLED(OFF,OFF);        /* Ich fahre nicht mehr zurück */   
    
                for (i=0; i<500;i++) 
                { 
                     Sleep(72); 
                } 
             } 
       } 
    
    return 0; 
    }
    Edit von radbruch: if (t1==t2)

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    was ich mir bei der Funktion gedacht habe ist folgendes. In der Anleitung steht:

    Bit0 (1) -> K6
    Bit1 (2) -> K5
    Bit2 (4) -> K4
    Bit3 (8) -> K3
    Bit4 (16) -> K2
    Bit5 (32) -> K1

    Wenn ich jetz die werte von K6 bis K2 zusammen zähl komm ich auf 31.
    Deshalb meine überlegung -> alles was über 31 ist muss K1 sein. (selbst wenn alle anderen gleichzeitig gedrückt sind).
    Bin ich soweit richtig?

    Außerdem versteh ich diesen Teil noch nicht ganz, insbesondere das mit dem stabilen wert:

    ===============================================

    char t1,t2,tasterzustand;


    while(1)
    {
    t1=PollSwitch();
    t2=PollSwitch(); /* zwei mal tasterwert messen fur stabiele wert */
    if (t1==t2) /* sind die taster eindrucken stabiel? */
    {
    tasterzustand=t1; /* ja ist es, tasterzustand ist erste messung */
    }
    else
    {
    tasterzustand=0; /* nee, ist es nicht, tasterzustand ist 'kein taster' */
    }

    if (tasterzustand==0) /* Keine Kollision: 00000000 im binaire zahlung */

    ===============================================

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

    Durch schlechte Kalibierung und Störungen durch z.B. die Motoren "lügt" PollSwitch() recht häufig. Deshalb ist es empfehlenswert die Funktion mehrfach aufzurufen und die eingelesenen Werte auf Gleichheit zu überprüfen.

    In der Datei asuro.c findet man am Ende der Funktion PollSwitch() (beim return) eine Formel mit der die Tasten kalibriert werden können. Wenn diese Formel halbwegs stimmt wird nie ein Wert über 32 auftreten. Infos dazu findet man u.A. im asurowiki:

    http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Tasten

    Gruß

    mic

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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    okay so langsam komm ich mit immerhin beschäftige ich mich erst seit ca. einer woche mit asuro und vom programmieren hatte ich auch nicht gerade viel ahnung.
    mit kalibrieren meinst du sicherlich diese zeile?

    return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));

    woher weiß ich jetzt, was ich wie verändern muss?

    Mittlerweile stoße ich auch immer öfter auf modifizierte bibliotheken (Asuro Lib). Da gibts ja dann auch wieder verschiedene...
    Inwiefern ist es ein "Muss" (bewusst in Anführungszeichen) diesen Schritt zu machen? Vielleicht kann mir das mal jemand in einfachen Worten erklären

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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