- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Asuro- dauernd kollision

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

    Praxistest und DIY Projekte
    Hallo

    Es dürften bei einzeln gedrückten Tasten nur die sechs Werte 1, 2, 4, 8, 16 und 32 auftreten, alles andere würde bei Tastenabfragen ohne Überprüfung zu unerwarteten Effekten führen. Ganz anders sieht es auch aus wenn man PollSwitch() häufiger ausführt. Dann sind es nicht einzelne Ausreiser sondern ganze Serien!

    Das Programm prüft bei laufenden Motoren einen von PollSwitch() gelieferten Wert auf die einzelnen Tasten. Bei unsinnigen Werten werden diese zum Terminal gesendet. K5 (Wert 2) ist Testtaste:
    Code:
    #include "asuro.h"
    
    int main (void)
    {
    unsigned char x;            //definition der pollswitch-variable
    unsigned char string [5];   //definition eines string mit max. 5 zeichen
    
    	Init ();
    
    	/********************************************
    	/* Achtung! Der asuro kann jetzt losfahren! *
    	/********************************************/
    
    	MotorSpeed(150,150);		 					 // elektrischen Krach machen
    
       while (1)
       {
          for(x=0; x<5; x++) string[x]= 0;     // String mit Endekennungen vorbelegen
          x = PollSwitch ();                   //taster werden abgefragt
    		if(x)
    		switch(x)
    		{
    		   case 1: StatusLED(YELLOW); break; // reguläre Tastenwerte prüfen
    		   //case 2: StatusLED(YELLOW); break;
    		   case 4: StatusLED(YELLOW); break;
    		   case 8: StatusLED(YELLOW); break;
    		   case 16: StatusLED(YELLOW); break;
    		   case 32: StatusLED(YELLOW); break;
    		   default :                         // Schrott empfangen
    			{
    				StatusLED(RED);
    				itoa (x, string, 10);  //wert wird umgewandelt und in string gespeichert
          		SerWrite (string, 5);  //string wird an terminal geschrieben
          		SerWrite ("\n\r", 2);  //umbruch an terminal schreiben
          		break;
    			}
    		}
       }
    }
    Bei mir wird bei diesem Test auch einiges an Schrott empfangen. Das ist eben normal und sollte softwaremäßig ausgefiltert werden.

    Gruß

    mic

    [Edit]
    Zum Vergleich noch mit einfacher Überprüfung:

    if(x) wird zu if(x && (x == PollSwitch()))

    Testtaster K5 ist natürlich Schwachsinn. Mehr als eine Taste gleichzeitig ist der Test
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2008
    Beiträge
    9
    also bei diesem programm empfange ich garnichts.
    bei if(x) drehen die motoren, sendet aber nichts


    bei if(x && (x == PollSwitch())) drehen die motoren nicht, man hört aber ein leises surren, sendet aber auch nichts



    Habe jetzt noch mal nur die taster getestet.
    mit:
    Code:
    #include "asuro.h"
    
    int main (void)
    {
    unsigned char x;            //definition der pollswitch-variable
    unsigned char string [5];   //definition eines string mit max. 5 zeichen
    
       Init ();
       while (1)
       {
          x = PollSwitch ();                   //taster werden abgefragt
          itoa (x, string, 10);                //wert wird umgewandelt und in string gespeichert
          SerWrite (string, strlen (string));  //string wird an terminal geschrieben
          SerWrite ("\n\r", 2);                //umbruch an terminal schreiben
                                               //("\n" und "\r" sind je ein byte!)
       }
    }
    alle taster tun genau das, was sie sollen nur nicht k1
    er sendet immer
    Code:
    33
    33
    33
    33
    32
    32
    32
    32
    33
    33
    33
    33
    32
    32
    .
    .
    ist er kaputt?

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Nein, der ist vermutlich nicht kaputt. Vielleicht kannst du das durch kalibrieren ausbügeln. In asuro.c am Ende der Funktion PollSwitch() steht eine Formel die den ADC-Wert umrechnet. Die sieht bei mir so aus:

    Code:
    	//return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
    	//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
            return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
    also bei diesem programm empfange ich garnichts.
    bei if(x) drehen die motoren, sendet aber nichts
    Es wird nur etwas gesendet wenn mit PollSwitch() ein Wert eingelesen wird der keiner einzelnen Taste entspricht. Wenn man also mehr als eine Taste drückt oder eine Taste einen falschen Wert liefert (mehrfach drücken!) wird der Wert ausgegeben und die StatusLED wird rot. Der nächste gültige Wert schaltet sie dann wieder auf gelb, dabei wird aber nichts ausgegeben.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2008
    Beiträge
    9
    so

    ich habe die ursprüngliche formel belassen , nur dass ich satt 61.0, 62.0 geschrieben habe.
    nun liefern alle taster die richtigen werte

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2008
    Beiträge
    9
    HAllo

    schon lange her...

    mein asuro funkt immer noch nicht.

    mein lehrer meint ich soll in diesem programm:

    Code:
    #include "asuro.h"
    
    int main(void)
    {   int Variable;
    	Init();
    	Sleep(500);
    
    	MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
    	MotorSpeed(120,120); // Beide Motoren etwa halbe Kraft voraus
    	StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten
    
    	while (PollSwitch()==0)  // Solange keine Kollision erfolgte...
    	{  SerWrite("Alles OK!\n",10); // ... Euphorie verbreiten
    	}
    	MotorSpeed(0,0); // Kollision! Sofort anhalten!
    	StatusLED(RED); // Statusleuchtdiode rot schalten
    	
    
    	while (1)
    	{   SerWrite("AUA!",5); // und weinen!
    	}
    }
    Die pollswitch auf eine varibale legen
    und dann die varibale anstatt des Aua ausgeben, damit man sieht, welcher taster betätigt worden ist.

    nur habe ich keinen ahnung wie ich das machen soll.

    könnt ihr mir helfen?

    danke

  6. #16
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    wie pollswitch funktioniert weisst du.

    wie man etwas zum pc sendet weisst du auch....

    was fehlt?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    03.10.2008
    Beiträge
    9
    ich habe es scho versucht indem ich
    variable = PollSwitch
    setzte

    und statt AUA! wollte ich die variable ausgeben-
    nur funktionierte es nicht

  8. #18
    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

    Das funktioniert so nicht weil SerWrite() eine Zeichenkette erwartet und PollSwitch() nur einen Wert liefert. Eine von vielen Möglichkeiten das zu lösen könnte etwa so aussehen:
    Code:
    #include "asuro.h"
    
    // aus: https://www.roboternetz.de/phpBB2/ze...=328394#328394
    void PrintChar(unsigned int x)
    {
       char ergebnis[5]  = {'0','0','0','0','0'};
       while (x >=10000) { ergebnis[0]++; x -=10000; }
       while (x >= 1000) { ergebnis[1]++; x -= 1000; }
       while (x >=  100) { ergebnis[2]++; x -=  100; }
       while (x >=   10) { ergebnis[3]++; x -=   10; }
       ergebnis[4] +=x;
       SerWrite(ergebnis,5);
    }
    void PrintBin(unsigned int x)
    {
       char bit=16;
       char ergebnis[16];;
       while(bit--)
       {
          ergebnis[15-bit]=0;
          while (x >= (1<<bit)) { ergebnis[15-bit]++; x -= (1<<bit); }
          ergebnis[15-bit] +='0';
       }
       SerWrite(ergebnis, 16);
    }
    
    int main(void)
    {
       char taste;
    	Init();
    	
    	while(1)
    	{
    	   taste=PollSwitch();
    	   if(taste && (taste == PollSwitch()))
    	   {
    	      PrintChar(taste);
    	      SerWrite("-", 1);
    	      PrintBin(taste);
    	      SerWrite("\n\r", 2);
    		}
    	}
       return(0);
    }
    Die Ausgabe im Terminal sieht dann so aus:
    Code:
    00001-0000000000000001
    00001-0000000000000001
    00001-0000000000000001
    00002-0000000000000010
    00002-0000000000000010
    00004-0000000000000100
    00004-0000000000000100
    00015-0000000000001111
    00016-0000000000010000
    00007-0000000000000111
    00008-0000000000001000
    00008-0000000000001000
    00008-0000000000001000
    00016-0000000000010000
    00016-0000000000010000
    00016-0000000000010000
    00032-0000000000100000
    00032-0000000000100000
    00032-0000000000100000
    00002-0000000000000010
    00003-0000000000000011
    00003-0000000000000011
    00004-0000000000000100
    00006-0000000000000110
    00006-0000000000000110
    00006-0000000000000110
    00004-0000000000000100
    00001-0000000000000001
    00001-0000000000000001
    00001-0000000000000001
    00005-0000000000000101
    00005-0000000000000101
    00005-0000000000000101
    00005-0000000000000101
    Übrigens sollte man den von PollSwitch() gelieferten Wert IMMER überprüfen!

    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!

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2009
    Ort
    nahe Karlsruhe
    Alter
    35
    Beiträge
    6
    Hallo,

    ich krame diesen Thread hier mal aus, damit ich keinen neuen öffnen muss, da das Thema das gleiche ist.

    Ich habe wie brandy89 auch das Beispielprogramm als Test laufen, um mit kleinen Schritten in die Welt des Asuros einzutauchen.
    Jedoch müsste der Roboter nach gut einer Sekunde sofort mit einem Hindernis kollidieren, was aber nicht der Fall ist. Trotzdem bricht das Programm ab und es leuchtet nur noch die StatusLED rot.

    Nach einiger Zeit bin ich dann auf den Thread gestoßen, bei dem der Schalterwert per IR an das Hyperterminal geschickt wird, um die Schalter zu kalibrieren.

    Soweit schön und gut, nur auch die Werte, die ich am Hyperterminal auslesen kann, passen alle perfekt. Die Schalter sind mit 1,2,4,8,16,32 belegt und solang keiner gedrückt wird, wird die 0 gesendet.
    Das gleiche passt auch noch wenn die Motoren mitlaufen, auch das hab ich getestet.

    Trotzdem bricht immer noch das einfache Testprogramm ab, woran liegt das? Ist es irgendeine einfache, aber leicht zu übersehende, Einstellung in der Asuro-Lib?

    Gruß und schönes Restfeiertage
    Famal Gosner

  10. #20
    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

    Trotzdem bricht immer noch das einfache Testprogramm ab, woran liegt das?
    Welches ist denn das "einfache Testprogramm"?

    Die Schalter sind mit 1,2,4,8,16,32 belegt und solang keiner gedrückt wird, wird die 0 gesendet. Das gleiche passt auch noch wenn die Motoren mitlaufen, auch das hab ich getestet.
    Bist du wirklich sicher dass keine "Ausreiser" in den Tastenwerten auftreten wenn die Motoren mitlaufen? Oben in meinem Test treten diese Ausreiser häufig auf:
    ...
    00004-0000000000000100
    00015-0000000000001111
    00016-0000000000010000
    00007-0000000000000111
    00008-0000000000001000
    00008-0000000000001000
    ...
    Dagegen hilft nur mehrfache Abfrage von PollSwitch() mit Plausibilitätsprüfung:

    taste1=PollSwitch();
    taste2=PollSwitch();
    if((taste1>0) && (taste1==taste2))...

    oder blockierend:

    while(taste1!=taste2) {taste2=taste1; taste1=PollSwitch()}

    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!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests