- Labornetzteil AliExpress         
Seite 10 von 26 ErsteErste ... 8910111220 ... LetzteLetzte
Ergebnis 91 bis 100 von 255

Thema: IR-bake

  1. #91
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Anzeige

    Praxistest und DIY Projekte
    hi allerseits,

    eigentlich wollte ich hier ein video reinstellen, dass alles klappt, klappt ja auch aber nur im prinzip. Der RP6 findet brav die bake, fährt hin, bleibt aber per abfrage der bumper nicht zuverlässig genung stehen. mal tut er das, dann wieder nicht, ich glaube, ich habe nun in dem code die möglichkeiten die bumperabfrage zu plazieren ziemlich ausgeschöpft...

    Code:
                task_checkINT0();
                task_I2CTWI();
               if(bumper_left && bumper_right)
               {
                break;
                stop();
                }
    bzw. am ende der do-while schleife:

    Code:
    while(!bumper_left && !bumper_right);
                        break;
                        stop();
    evtl. liegt dort das problem, die abfrage der beiden task liegt innerhalb (am ende) der do-whileschleife? Könnte sich bitte jemand den code anschauen?

    das wird oberhalb der hauptschleife aufgerufen:

    Code:
    I2CTWI_initMaster(100);
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
        I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);


    Code:
    case 3://
                    setLEDs(0b0100);
    
                    writeString_P("suche der bake   \n");
                    writeChar('\n');
                    initRP6Control();
                    initLCD();
                    startStopwatch3();
                    t=0;
    
                    while(true)
                    {
                        do
                        {
    
                            if(getStopwatch3() > 50)
                            {
                                temp = read_IR_value();
    
                                if (temp == 0)
                                {
                                    x = getStopwatch3();
                                    setMultiIOLED3(1);
                                    setMultiIOLED3(0);
                                    if (t<10)
                                    {
                                    t++;
    
                                    if (t == 10)
                                    {
                                    y = getStopwatch3();
                                    z = y-x;
                                    t=0;
                                    setStopwatch3(0);
                                    if (z< 600)
                                    {
                                    move(100, FWD, DIST_MM(100), false);
                                    setStopwatch3(0);
                                    t=0;
                                    mSleep(400);
                                    task_checkINT0();
                                    task_I2CTWI();
                                    if(bumper_left && bumper_right)
                                    {
                                    break;
                                    stop();
                                    }
    
                                    }
    
                                    }
    
                                    }
    
    
                                }
    
                                else
                                {
                                    setMultiIOLED1(1);
                                    setMultiIOLED1(0);
                                    rotate(80, RIGHT, 1, false);
                                    setStopwatch3(0);
                                }
                                task_checkINT0();
                                task_I2CTWI();
                                if(bumper_left && bumper_right)
                                {
                                break;
                                stop();
                                }
    
                            }
    
                        task_checkINT0();
                        task_I2CTWI();
                        }
                        while(!bumper_left && !bumper_right);
                        break;
                        stop();
    
                        /**************************/
                        uint8_t key_1;
                        mSleep(100);
                        key_1 = getMultiIOPressedButtonNumber();
                        if(key_1 != 0) break;
                        stop();
                        /**************************/
                    }
    
                        break;
    Geändert von inka (03.02.2014 um 15:46 Uhr)
    gruß inka

  2. #92
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Muss das break; nicht hinter das stop();?
    Weil bei break wird die Schleife verlassen:
    break

    Mit dem Schlüsselwort break können wir zu jeder Zeit eine Schleife verlassen, ohne auf den Kontrollpunkt warten zu müssen.

    http://www.c-howto.de/tutorial-schleifen-break.html

    gruß Thorben

  3. #93
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi Thorben,

    ich bin da unsicher:
    gerade an der stelle hatte ich glaube ich schon alle variationen getestet. Nur break, nur stop, break/stop, stop/break. Die variante break/stop schien mir noch die "erfolgreichste" zu sein - zumindest manchmal passierte beides - er veließ die schleife UND die motoren blieben stehen.

    Ich glaube dass es etwas mit der dauer der betätigung der bumper zu tun hat, beim kurzen antippen dreht sich der RP6 anschließend im kreis, bei einer längeren betätigung bleibt er eher stehen...

    - - - Aktualisiert - - -

    ich hab jetzt die reihenfolge noch einmal geändert, zuerst stop(); und dann break;

    so lange er nach rechts dreht, bleibt er beim betätigen des bumpers stehen

    wenn er geradeaus fährt, fängt er nach der betätigung des bumpers sich nach rechts zu drehen, mal schneller, mal langsam, er misst nicht dabei, erst wenn ich den button3 betätige, also quasi den case3: noch einmal auslöse, fängt er auch an zu messen und fährt dann (nach empfang) geradeaus wieder richtung bake. Wo im code passiert das? verstehe ich nicht...
    gruß inka

  4. #94
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Könnte es sein das du in else Schleife Reinkommst da dort ja eine Rechtsbewegung ausgeführt wird?
    Code:
    case 3://
                    ...
                                if (temp == 0)
                                {
                                   ...
    
                                }
    
                                else
                                {
                                    setMultiIOLED1(1);
                                    setMultiIOLED1(0);
                                    rotate(80, RIGHT, 1, false);
                                    setStopwatch3(0);
                                }
                                ...
    War nur eine Idee da dort ja ein Befehl für rechts gegeben wird.
    gruß Thorben

  5. #95
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    du meinst, er führt den break in der schleife in der er geradeaus fährt aus und rasselt dann in die else-schleife mit der rechtsdrehung rein? Ist es nicht so, dass dieses else nur dann angesprungen wird wenn in der abfrage

    Code:
    {
                                temp = read_IR_value();
    
                                if (temp == 0)
                                {
                                    ......
    eben temp != 0 ist?
    gruß inka

  6. #96
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    eben temp != 0 ist?
    Ja das ist richtig.
    Kann es sein das wenn die Bumper ausgelößt werden, dass dann temp != 0 ist?
    Thorben

  7. #97
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi,

    jetzt bleibt der RP 6 zumindest stehen, wenn er mit dem bumper an der bake angekommen ist , das video muss noch ein bischen warten, die lichtverhältnisse sind beim bedeckten himmel nicht gut genug

    nun möchte ich weitermachen und in dem beispiel "RP6Control_10_Move2.c" habe ich ein dankbares objekt zum experimentieren gefunden. Komplett verstanden habe ich es noch nicht, aber deshalb will ich ja experimentieren...

    dort wird auch auf einen niedrigen batteriestand reagiert:

    Code:
    // Behaviour check low Battery:
    
    #define BATTERY_LOW 1
    behaviour_command_t checkLowBattery = {0, 0, FWD,
                                        false, false, 0, IDLE};
    
    /**
     * In this behaviour routine, we have nothing to do
     */
    void behaviour_checkLowBattery(void)
    {
    }
    
    /**
     * This is a new Event Handler and it gets called when the Battery Voltage
     * is getting low! The Parameter isVoltageLow is true, when the voltage
     * is low and false, when the voltage is OK.
     */
    void batteryVoltageLow(uint8_t isVoltageLow)
    {
        if(isVoltageLow)
            checkLowBattery.state = BATTERY_LOW;
            bake_suche();
    }
    die abfrage "if(isVoltageLow)" habe ich um die funktion bake_suche() ergänzt:
    Code:
    void bake_suche(void)
    {
    
    //        accuzustand();
    
    
            setLEDs(0b0100);
    
            writeString_P("bake_suche_1  \n");
            writeChar('\n');
            initRP6Control();
            initLCD();
            startStopwatch3();
            t=0;
    
            do
            {
                if(getStopwatch3() > 50)
                {
                    temp = read_IR_value();
    
                    if (temp !=0)
                    {
                        setMultiIOLED1(1);
                        setMultiIOLED1(0);
                        rotate(80, RIGHT, 5, false);
                        temp = read_IR_value();
                        if (temp == 0) stop(); //break;
                        if(bumper_left && bumper_right) //stop();//break;
                        {
                            stop();
    //                        break;
    
                        }
    
                    }
                    temp = read_IR_value();
    
                    if (temp == 0)
                    {
                        x = getStopwatch3();
                        setMultiIOLED3(1);
                        setMultiIOLED3(0);
                        if (t<10)
                        {
                            t++;
    
                            if (t == 10)
                            {
                                y = getStopwatch3();
                                z = y-x;
    
                                writeInteger(x, DEC);
                                writeChar('\n');
                                writeInteger(y, DEC);
                                writeChar('\n');
                                writeInteger(z, DEC);
                                writeChar('\n');
    
                                t=0;
                                setStopwatch3(0);
                                if (z< 600)
                                {
                                    move(100, FWD, DIST_MM(100), false);
                                    setStopwatch3(0);
                                    t=0;
                                    mSleep(400);
                                    task_checkINT0();
                                    task_I2CTWI();
                                    if(bumper_left && bumper_right)
                                    {
                                        stop();
    //                                    move(100, BWD, DIST_MM(200), false);
    //                                    break;
                                    }
    
                                }
    
                            }
    
                        }
    
    
                    }
                }
    
                task_checkINT0();
                task_I2CTWI();
            }
            while(!bumper_left && !bumper_right);
            stop();
    
        }
    das ganze lässt sich auch kompilieren, also von daher steht dem experimentieren nur eines im weg: auf welchem weg holt sich das "Behaviour check low Battery:" die batteriewerte? Das habe ich leider nicht gefunden...
    Um nicht so lange warten zu müssen bis der akku wirklich leer ist, möchte ich die abfrage irgendwie beeinflussen...
    gruß inka

  8. #98
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    ob die Akkuspannung niedrig ist, wird schon im I2C-Slave der Base in der Funktion task_update() erkannt und über ein Interrupt-Status Bit (interrupt_status.batLow) an den Master weiter gegeben.
    Ich denke, du kannst das Bit in deinem Programm zum Testen manipulieren.
    Gruß
    Dirk

  9. #99
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    gruß inka

  10. #100
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Stark!!!
    Und wie ich sehe mit Multi-IO im Einsatz

Seite 10 von 26 ErsteErste ... 8910111220 ... LetzteLetzte

Ähnliche Themen

  1. IR-Bake
    Von tornado im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 05.07.2007, 18:37
  2. IR-Bake
    Von Bernd-das-Brot im Forum Sensoren / Sensorik
    Antworten: 38
    Letzter Beitrag: 13.12.2005, 17:14
  3. ir-bake
    Von pebisoft im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 8
    Letzter Beitrag: 17.01.2005, 14:41
  4. ir-bake
    Von pebisoft im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 17.01.2005, 08:01
  5. Bake
    Von techboy im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 02.11.2004, 11:17

Berechtigungen

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

Labornetzteil AliExpress