-         

Ergebnis 1 bis 10 von 10

Thema: Kollisionstaster-Programm geht nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.11.2005
    Beiträge
    10

    Kollisionstaster-Programm geht nicht

    Anzeige

    Hallo!

    habe nun den Asuro endlich zum flashen gebracht.

    Hab nun folgendes Programm gecodet:

    Code:
    # include "asuro.h"
    
    int main()
    {
    
    Init();
    
    char ready[2];
    
    
    
    StatusLED(RED);
    Sleep(72000);
    StatusLED(YELLOW);
    Sleep(72000);
    StatusLED(GREEN);
    
    SerWrite("I'm gonna to drive on\n\rPress \"go\" and I 'll start...\n\r", 54);
    SerRead(ready, 2, 0);
    
    if ((ready[0]=='g')&&(ready[1]=='o'))
    {
    	Sleep(72000);
    	
    	MotorDir(FWD, FWD);
    	MotorSpeed(200,200);
    	
    	SerWrite("\n\n\n\n\rYeah! I'm drivin'", 22);
    	while(1)
    	{
    		
    		if(PollSwitch()>0)
    		{
    		SerWrite("I'm pushed on an item!", 22); 
    		StatusLED(RED);		
    		MotorSpeed(100, 100);
    		Sleep(30000);
    		MotorSpeed(0, 0);
    		Sleep(72000);		
    		MotorDir(RWD, RWD);
    		MotorSpeed(80, 80);
    		Sleep(360000);
    		MotorDir(FWD, RWD);
    		MotorSpeed(100, 100);
    		Sleep(144000);		
    		MotorDir(FWD, FWD);
    		Sleep(50000);
    		MotorSpeed(200, 200);
    		StatusLED(GREEN);
    		}		
    		
    	
    	}
    	
    }
    else
    SerWrite("\n\n\n\rI can't drive on, 'cause you 've written false signs\n\n", 58);
    
    
    
    while(1);
    
    return 0;
    
    }

    Das Einzige was er aber macht, ist fahren und wenn er kollidiert,
    schaltet ganz kurz das StatusLED von grün auf rot und das wars...
    Trotz der Sleeps? Wie kann das gehen?

    Hab ich was vergessen?


    mfg

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.10.2004
    Ort
    Rheinstetten
    Alter
    34
    Beiträge
    357
    Ich glaube die vorgegebene Sleep() Funktion funktioniert nur bis zu 3 ms. Probier mal diese Erweiterung von Sleep (funktioniert bei mir einwandfrei):

    Code:
    /* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */
    void Sleep(unsigned char time72kHz)
    {
        count72kHz = 0;
        while (count72kHz < 72);
    }
    
    void sleep(int milliseconds) {
        int i;
        for (i=0; i<milliseconds; i++) {
            Sleep(72);
    Dann natürlich sleep() verwenden, nicht Sleep().

    Kam denn "I'm pushed on an item!" bei dir überhaupt an?
    Wenn ja, dann bau mal am Ende der PollSwitch-Abfrage nochmal ein SerWrite() ein. Dann siehst du im Hyperterminal schon, wie lange die Abfrage + Behandlung dauert.
    Unwissenheit ist ein Segen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.11.2005
    Beiträge
    10
    ahh, werds mal so versuchen.
    danke

    "I'm pushed on an item!" kam an, ja, mehrmals solange der Taster gedrückt war.
    Also nicht sehr lange ^^

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.10.2004
    Ort
    Rheinstetten
    Alter
    34
    Beiträge
    357
    Hier mal meine (sehr einfache) Kollisionsabfrage:

    Code:
                MotorDir(BREAK, BREAK);
                MotorSpeed(0, 0);
                StatusLED(YELLOW);  
                
                /* compute switch state for each switch */
                int switches[6] = { 0, 0, 0, 0, 0, 0 };
                int i, switchValue;
                for (i=0; i<6; i++) {
                    switchValue = power(2, (6-i-1));
                    if (poll-switchValue >= 0) {
                        switches[i] = 1;
                        poll -= switchValue;
                    }            
                }
                
                /* frontal hit */      
                if (switches[1] == 1 || switches[4] == 1) {
                    MotorDir(RWD, RWD);
                    MotorSpeed(L_HALF, R_HALF);
                    sleep(300);
                    if (tickcount % 2 == 0) {
                        MotorDir(RWD, STOP);
                    } else {
                        MotorDir(STOP, RWD);
                    }
                    sleep(100 * tickcount);
                } else if (switches[0] == 1) {
                    MotorDir(FWD, FWD);
                    MotorSpeed(L_HALF, STOP);
                    sleep(S_EDGE);
                } else if (switches[5] == 1) {
                    MotorDir(FWD, FWD);            
                    MotorSpeed(STOP, R_HALF);
                    sleep(S_EDGE);
                }
    Überall wo die Variable tickcount steht, kannst du das auch wegmachen oder eine andere Zeit eingeben. Tickcount ist bei mir eigentlich nur eine Zufallsvariable und zuständig um zu überprüfen, ob wirklich ein "hit" vorkommt oder nur eine elektronische Störung vorliegt (was beim Asuro manchmal komischerweise so ist... Manchmal wird einfach eine Kollision erkannt, obwohl da gar nichts ist).

    Kurz zur Erklärung. Das Programm macht folgendes (Nachdem die Kollision überhaupt erkannt wurde natürlich [mit folgender Zeile: "int poll = PollSwitch();"] ):

    - Anhalten + Gelbe LED an
    - PollSwitch()-Signal aufteilen auf alle 6 Taster
    - Frontalen oder links/rechts schrägen Hit erkennen
    - Ausweichen
    Unwissenheit ist ein Segen

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.11.2005
    Beiträge
    10
    @maze2k

    hab nur das Problem das es bei mir z.B. STOP oder R_Half nicht erkennt.

    Gibts da eine neue Version von asuro.c?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    28.11.2005
    Beiträge
    10
    hallo!

    was tun bei folgender Meldung:

    test.c:21: error: `L_HALF' undeclared (first use in this function)
    test.c:21: error: `R_HALF' undeclared (first use in this function)
    test.c:22: warning: implicit declaration of function `sleep'
    test.c:24: error: `STOP' undeclared (first use in this function)
    test.c:32: error: `S_EDGE' undeclared (first use in this function)

    Und nochwas:
    ist das normal, wenn er mit neuen Batterien alle 3 Sekunden (!) glaubt, er sei kollidiert obwohl gar nichts im Wege steht?

    Bitte um eure Antworten

    mfg

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Zöttl,

    L_HALF, R_HALF, STOP und S_EDGE sind in dem Beispiel von maze2k nicht definiert. In C macht man das so:

    Code:
    #define L_HALF  100     // linker Motor halbe Kraft
    #define R_HALF  100    // rechter Motor halbe Kraft
    #define STOP  0          // Motor Stop
    #define S_EDGE 1000  // 1 Sekunde warten
    Der Compiler ersetzt dann einfach die Konstanten mit den entsprechenden Werten beim compilieren.

    Die Funktion sleep() wurde weiter oben im Thread gezeigt. Auch die muß in dein Programm, damit es funktioniert. Den Code vor die main() Funktion
    kopieren oder einen Prototypen der Funktion am Anfang des Programmes definieren.

    Code:
    void sleep(int ms);   // Prototyp für sleep Funktion
    Das Problem mit den Tasten wurde auch schon bis zur Erschöpfung in zig threads erläutert.
    Hier nochmal in Kurzfassung. PollSwitch() Funktion 2 x aufrufen (oder 3x).
    Die zurückgegeben Werte vergleichen (t1 && t2 nicht 0, und t1 identisch mit t2) und nur dann auswerten.

    Code:
    unsigned char t1, t2;
    ...
    
    t1 = PollSwitch();            // 1. Abfrage
    t2 = PollSwitch();            // 2. Abfrage
    
    if (t1 && t2 && t1 == t2)  // Beide Werte müsssen identisch sein
      poll = t1;
    else
      poll = 0;
    ...
    Alle Klarheiten beseitigt?

    Gruß Peter

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    28.11.2005
    Beiträge
    10
    JA

    Das mit den defines hätt ich eigentlich wissen müssen...
    sorry, hab mich auf Irrwege führen lassen...


    Ah, jetzt versteh ichs erst, für was das mit den mehreren Pollswitchabfragen soll.


    Danke!

    mfg

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Ort
    Dortmund
    Alter
    24
    Beiträge
    1.641
    bei mir ist das jetzt aber so, dass der Asuro die ganze zeit irgendetwas erkennt, obwohl ich nach rat der typen vom School_lab sogar siebenmal abfrage. Vielleicht fragt er jetzt so häufig ab, dass er schon meint, dass da jetzt einfach etwas sein muss
    o
    L_
    OL
    This is Schäuble. Copy Schäuble into your signature to help him on his way to Überwachungsstaat!

    http://de.youtube.com/watch?v=qV1cZ6jUeGE

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Lunarman,

    Bei meinem Asuro mußte ich sogar 8x PollSwitch aufrufen, bis das Ergebnis stabil war.
    Die Programm Variante mit 2-3 abfragen und dem Vergleich der Ergebnisse funktioniert aber genauso zuverlässig, wenn nicht sogar besser.
    Vieleicht hat bei deinem Asuro eine Taste einen Kurzschluß.
    Dann hilft nur ein Testprogramm mit Ausgabe der Tastenwerte.
    Ein entsprechendes Programm findest sich z.B. hier:
    http://asuro.pytalhost.de/pmwiki/pmw...astSensorTestC

    Gruß Peter

Berechtigungen

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