-         

Ergebnis 1 bis 9 von 9

Thema: unterschiedliche zustände direkt nach Flashen und anschließendem Aus / Einschalten?

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344

    SRF02, m32 & multi-IO, seltsames verhalten

    Anzeige

    hallo,

    folgender code (abgespeckte version der RP6Control_MultiIO_03.c)

    Code:
    /*****************************************************************************/
    // Includes:
    
    #include "RP6ControlLib.h"                 // The RP6 Control Library.
                                            // Always needs to be included!
    #include "RP6I2CmasterTWI.h"            // Include the I2C-Bus Master Library
    
    /*****************************************************************************/
    /*****************************************************************************/
    // Include our new "RP6Control LFS Bumper library":
    // (This is the library for accessing the LFS and Bumper Board!)
    
    #include "RP6Control_LFSBumperLib.h"
    
    /*****************************************************************************/
    void writeDouble(double number, uint8_t width, uint8_t prec)
    {char buffer[width + 1];
        dtostrf(number, width, prec, &buffer[0]);
        writeString(&buffer[0]);
    }
    
    /*****************************************************************************/
    // I2C Error handler
    
    void I2C_transmissionError(uint8_t errorState)
    {
        writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
        writeInteger(errorState, HEX);
        writeChar('\n');
    }
    
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
        initRP6Control();    // Always call this first! The Processor will not
                            // work correctly otherwise.
    
        initLCD(); // Initialize the LC-Display (LCD)
                   // Always call this before using the LCD!
    
        writeString_P("\n\nRP6Control Multi IO Selftest 3!\n");
    
        // IMPORTANT:
        I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation
                                // with 100kHz SCL Frequency
    
    
        // Register the event handler:
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    
    
        uint16_t distsrf_1;
    
        startStopwatch1();
    
        // IMPORTANT:
        lfsbumper_init();                            // LFS & Bumper init!!!
        //setServoPower(1);                            // Servo power ON!
    
    
        while(true)
        {
            if(getStopwatch1() > 1000) // 1s
            {
    
    
                // SRF02 sensors test:
    
                distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM);
                writeString("\nSRF02 SENSOR_1 ->");
                writeString("\nDistance:  ");
                writeInteger(distsrf_1, DEC);
                mSleep(500);
    
                setStopwatch1(0);
            }
    
            task_I2CTWI();
        }
    
        return 0;
    }
    - der SRF02 hängt direkt an der multiIO, steckplatz 1, der code ist entsprechend angepasst, die zeilen für radar und sharps in der "RP6Control_LFSBumperLib.h" sind auskommentiert

    - der RP6 steht ca. 50 cm von der wand entfernt, der SRF ist auf einem servo montiert, so dass ich ihn drehen kann ohne den roby bewegen zu müssen

    - der code wird ohne fehlermeldungen kompiliert

    - flashe und starte ich ihn, werden als abstand 34cm angezeigt ( es sind gemessen 50cm)

    - verändere ich den code von: "distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM);" in: "............._INCH" wird nach kompilieren, flashen und starten 18 inch angezeit, (18x2,5=ca.45)

    - ändere ich den code wieder zurück in "........_CM", werden nach kompilieren, flaschen und starten 51cm angezeigt. Damit wäre ich sehr zufrieden, es bleibt aber nur bis zum AUS- und Einschalten, dann sind es wieder 34cm.

    das gleiche passiert mit der original "RP6Control_MultiIO_03.c"....

    ich verstehe es nicht, kann mir da bitte jemand helfen was da schiefläuft?
    Geändert von inka (13.10.2014 um 13:59 Uhr) Grund: passenderes thema gewählt
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344

    SRF02, m32 & multi-IO, seltsames verhalten

    eine mögliche ursache ist mir eingefallen:

    hängt das problem irgendwie damit zusammen, dass ich die m32 verwende und die jumper auf der multi-IO anders als in der standardstellung angebracht werden müssen?
    Ich kann mich daran erinnern dass da sowas in der richtung war, allerdings ging es meine ich nur um die SFR20 die auf dem bumper-board angeschlossen sind...

    gilt es auch für die vier anschlüsse auf dem board direkt?
    Geändert von inka (13.10.2014 um 14:01 Uhr)
    gruß inka

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344

    SRF02 messung in cm und inch

    Es geht hier um den SRF02, leider habe ich das thema etwas unglücklich bezeichnet...

    Habe nun weitere tests gemacht, weil ich den sensor ja brauche...

    Die erste messung nach dem einschalten bzw. wiedereinschalten (32cm) stimmt nicht, die darauffolgenden werte sind richtig.

    Mit den weiter unten erreichten ergebnisen kann ich den sensor einsetzen, muss allerdings wohl immer die abfrage der messung in inch mit durchführen. Als workaround machbar. Kennt jemand mit SFR02 und der multiIO das problem, oder bin ich allein mit dieser konstellation?

    Ist es evtl. ein problem in der lib?

    Hier noch einmal ein teil des testcodes (nur die whie-schleife)

    Code:
    while(true) 
        { 
            if(getStopwatch1() > 1000) // 1s 
            { 
     
                // SRF02 sensors test:
    
                distsrf_1 = SRF02_measure(CH_SRF02_1, MODE_CM); 
                writeString("\nSRF02 SENSOR_1 ->"); 
                writeString("\nDistance:  "); 
                writeInteger(distsrf_1, DEC);
                writeString(" cm");
    
                mSleep(500);
    
                distsrf_2 = SRF02_measure(CH_SRF02_1, MODE_INCH); 
                writeString("\nSRF02 SENSOR_1 ->"); 
                writeString("\nDistance:  "); 
                writeInteger(distsrf_2, DEC);
                writeString(" inch");
                setStopwatch1(0); 
            } 
     
            task_I2CTWI(); 
        }
    die ergebnise (mit beschreibung wann gemessen wurde):

    Code:
    # nach dem neueinschalten:
    
    
    RP6Control Multi IO Selftest 3!
    
    SRF02 SENSOR_1 ->
    Distance:  32 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    [RP6BOOT]
    
    [READY]
    
    # nach dem drücken des startbuttons:
    
    RP6Control Multi IO Selftest 3!
    
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  55 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    [RP6BOOT]
    
    [READY]
    
    # nach dem aus- und einschalten:
    
    
    RP6Control Multi IO Selftest 3!
    
    SRF02 SENSOR_1 ->
    Distance:  32 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    SRF02 SENSOR_1 ->
    Distance:  56 cm
    SRF02 SENSOR_1 ->
    Distance:  22 inch
    [RP6BOOT]
    
    [READY]
    gruß inka

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hi inka,

    ich habe die MultiIO mit M32 z.Zt. nicht so aufgebaut und gejumpert, kann also nicht testen.

    Wenn ich dazu komme, teste ich das auch mal.
    Gruß
    Dirk

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    ich habe die MultiIO mit M32 z.Zt. nicht so aufgebaut und gejumpert, kann also nicht testen.
    Wenn ich dazu komme, teste ich das auch mal.
    super, danke...

    ich hab in der "RP6Control_LFSBumperLib.c" noch diese beiden variablen gefunden, die masseinheit in [ ] - hat die was zu bedeuten?

    double distsrf02_l; // Left SRF02 distance [mm]
    double distsrf02_r; // Right SRF02 distance [mm]

    werden die überhaupt irgendwo verwendet?
    gruß inka

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hi,
    ich hab in der "RP6Control_LFSBumperLib.c" noch diese beiden variablen gefunden, die masseinheit in [ ] - hat die was zu bedeuten?
    double distsrf02_l; // Left SRF02 distance [mm]
    double distsrf02_r; // Right SRF02 distance [mm]
    werden die überhaupt irgendwo verwendet?
    Die Variablen sind für dich bzw. für dein Hauptprogramm reserviert:
    Wenn du SRF02_measure() im Modus MODE_US (also Mikrosekunden-Messung) aufrufst, kannst du den Ausgabewert danach mit SRF02_calculate() in einen Millimeterabstand umrechnen. Das Ergebnis ist dann eine Fließkomma-Variable, die man z.B. in distsrf02_l packen kann:
    Beispiel: distsrf02_l = SRF02_calculate(SRF02_measure(CH_SRF02_L, MODE_US));
    Gruß
    Dirk

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    hallo Dirk,

    danke für die erklärung...

    habe es ausprobiert, und zwar diese zwei varianten:

    Code:
    1)
    us_distanz = SRF02_measure(CH_SRF02_1, MODE_US);
    distsrf02_1 = SRF02_calculate(us_distanz);
    
    2)
    distsrf02_1 = SRF02_calculate(SRF02_measure(CH_SRF02_1, MODE_US));
    beide liefern die entfernung in mm, allerdings nur in sprüngen von 343,40 (sonic speed konstante) wie hier zu sehen:

    Code:
    SRF02 SENSOR_1 ->
    Distance:  49.00 cm
    SRF02 SENSOR_1 ->
    Distance:  19.00 inch
    SRF02 SENSOR_1 ->
    Distance:  343.40 mm
    
    SRF02 SENSOR_1 ->
    Distance:  69.00 cm
    SRF02 SENSOR_1 ->
    Distance:  27.00 inch
    SRF02 SENSOR_1 ->
    Distance:  686.80 mm
    
    SRF02 SENSOR_1 ->
    Distance:  105.00 cm
    SRF02 SENSOR_1 ->
    Distance:  41.00 inch
    SRF02 SENSOR_1 ->
    Distance:  1030.20 mm
    es sieht mir so aus, als würde sich die "time_ms", bzw. die "us" variable in der "SRF_02_calculate" funktion nur in den jeweiligen (1x /2x /3x) sprüngen ändern?
    gruß inka

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hi inka,

    da bist du wohl bei der mm-Ausgabe auf einen Bug in der RP6Control LFS Bumper Library gestoßen!
    (Wie gesagt: Ich kann z.Zt. nicht testen!)

    Probier mal, die Funktion SRF02_calculate() in der Datei RP6Control_LFCBumperLib.c so zu ändern:
    Code:
    double SRF02_calculate(uint16_t us)
    {
    	double time_ms = us / 2000.0f;				// One way [ms]
    	return (SONIC_SPEED * time_ms);				// Distance [mm]
    }
    Klappt das so besser?

    P.S.:
    Dieses Problem hat aber nichts mit deinem anfänglichen Problem zu tun, dass der jeweils 1. Meßwert nicht zuverlässig ist.
    Gruß
    Dirk

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    Hi Dirk,

    danke für die schnelle hilfe...

    Zitat Zitat von Dirk Beitrag anzeigen
    Probier mal, die Funktion SRF02_calculate() in der Datei RP6Control_LFCBumperLib.c so zu ändern:
    Code:
    double SRF02_calculate(uint16_t us)
    {
        double time_ms = us / 2000.0f;                // One way [ms]
        return (SONIC_SPEED * time_ms);                // Distance [mm]
    }
    Klappt das so besser?
    ja. die schwankungen sind denke ich normal...

    was bedeutet eigentlich dieses ".0f"?

    Code:
    SRF02 SENSOR_1 ->
    Distance:  32.00 cm
    SRF02 SENSOR_1 ->
    Distance:  13.00 inch
    SRF02 SENSOR_1 ->
    Distance:  324.00 mm
    
    SRF02 SENSOR_1 ->
    Distance:  33.00 cm
    SRF02 SENSOR_1 ->
    Distance:  12.00 inch
    SRF02 SENSOR_1 ->
    Distance:  330.35 mm
    
    SRF02 SENSOR_1 ->
    Distance:  57.00 cm
    SRF02 SENSOR_1 ->
    Distance:  22.00 inch
    SRF02 SENSOR_1 ->
    Distance:  575.37 mm
    
    SRF02 SENSOR_1 ->
    Distance:  57.00 cm
    SRF02 SENSOR_1 ->
    Distance:  22.00 inch
    SRF02 SENSOR_1 ->
    Distance:  574.51 mm
    
    SRF02 SENSOR_1 ->
    Distance:  77.00 cm
    SRF02 SENSOR_1 ->
    Distance:  30.00 inch
    SRF02 SENSOR_1 ->
    Distance:  771.28 mm
    auch wenn ich nur die messung in mm durchführe, ohne die vorher laufenden messungen in inch oder cm (die evtl. etwas an der initialisierung beeinflussen könnten)

    Code:
    SRF02 SENSOR_1 ->
    Distance:  495.87 mm
    
    SRF02 SENSOR_1 ->
    Distance:  495.87 mm
    
    SRF02 SENSOR_1 ->
    Distance:  502.74 mm
    
    SRF02 SENSOR_1 ->
    Distance:  495.01 mm
    
    SRF02 SENSOR_1 ->
    Distance:  498.45 mm
    
    SRF02 SENSOR_1 ->
    Distance:  495.01 mm
    
    SRF02 SENSOR_1 ->
    Distance:  502.74 mm


    Zitat Zitat von Dirk Beitrag anzeigen
    Dieses Problem hat aber nichts mit deinem anfänglichen Problem zu tun, dass der jeweils 1. Meßwert nicht zuverlässig ist.
    mit der nun funktionierenden messung in mm hat dieses problem etwas an seiner dringlichkeit verloren - ich kann ja nun messen
    gruß inka

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 15.03.2011, 15:16
  2. NIBObee LED4 nach einschalten an
    Von NIBObee_1 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 7
    Letzter Beitrag: 06.05.2010, 19:40
  3. Temperatur und Drehzahl aus n BIOS direkt vom Board auslesen
    Von Skynet im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 2
    Letzter Beitrag: 29.12.2008, 16:26
  4. Gelbe PowerLED beim RP6 manuell aus- und einschalten
    Von SpäteStunde im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 01.04.2008, 21:22
  5. A/D-Port: EInzelne Pins aus- und einschalten...
    Von tobimc im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 03.07.2004, 15:15

Berechtigungen

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