- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: SRF05 mit Servo auf RP6 Control M32

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

    Powerstation Test
    hi Jordi,

    Zitat Zitat von Jordi Beitrag anzeigen
    ich muss mal ganz blöd fragen: Was meinst Du mit 'blockierend'?
    ab hier haben wir uns mit der blockierneden und nicht-blockierenden ausführungen der mess-schleifen beschäftigt. Gehört nun Dein code zu den blockierenden? Es geht mir hier lediglich darum den prinzipiellen unterschied zu verstehen und am funktionierendem code testen zu können - die nicht blockierende ausführung habe ich nicht in einen code packen können. Dass der RP6 bei der blockierenden ausführung der US-messung mal z.b. kurz seine fahrt unterbrechen muss, stört mich nicht weiter...

    Zitat Zitat von Jordi Beitrag anzeigen
    Funktioniert der Code bei Dir?
    ja, teilweise. Die entfernungsabfrage funktioniert nun, nachdem ich es teilweise umschreiben musste (da ich für den hc-sr04 zwei pins nehmen muss - echo und trig), der servo noch nicht, das liegt vermutlich an der anderen initailisierung und dem betreiben der Servos an der multi-IO karte. Kommt noch, jetzt bin ich erstmal für eine woche weg...
    gruß inka

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

    ich habe nun mit dem code etwas "herumgespielt", es funktioniert bei mir (messung und servo auch):

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_MultiIO.h"
    #include "RP6Control_LFSBumperLib.h"
    #include "RP6Control_OrientationLib.h"
    #include "RP6Stopwatch0Lib.h"
    #include "RP6ControlServoLib.h"
    #include "standard.h"
    
    
    #define I2C_RP6_BASE_ADR 10
    
    uint16_t servopos, range;
    
    //ULTRASONIC FUNCTIONS #######################################
    
    void task_US_SW()
    {
        DDRC |= IO_PC6; // IO_PC6 Ausgang
        PORTC |= (1<<PORTC6); // IO_PC6 high IO_PC6;
        _delay_us(10); // 10uS warten
        PORTC &= (0<<PORTC6); // IO_PC6 low ~IO_PC6;
    
        DDRC &= ~IO_PC5; // IO_PC5 Eingang
        while(!(PINC & IO_PC5)); // Warten bis steigende Flanke an IO_PC5
        setStopwatch01(0);
        while(PINC & IO_PC5); // Warten bis fallende Flanke an IO_PC5
        range = getStopwatch01() * 1.67; // Wert der Stoppuhr * 1,67 = Abstand in cm.
    }
    
    
    
    void displayData()
    {
    
        writeString_P("Abstand:");
        writeInteger(range, DEC);
        writeString_P(" cm\n");
    
        //sound(170,40,0);
    }
    
    //END OF ULTRASONIC FUNCTIONS ################################
    
    int main(void)
    {
    
        initRP6Control();
        multiio_init();
        initLCD();
    
        setLEDs(0b111111);
        mSleep(500);
        setLEDs(0b000000);
    
        I2CTWI_initMaster(100);
        I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
        showScreenLCD(" RP6Control M32", " hc-sr04 plus servo"," jordi","PC5 und PC6");
        mSleep(1500);
        clearLCD();
    
        setServoPower(1);
        PCA9685_init(50);
        servopos = (SERVO1_LT);
    
        startStopwatch01();
    
        while(true)
        {
    
            PCA9685_set(1, servopos);
    
            servopos += 5;
            mSleep(2000);
    
            if (servopos > (SERVO1_RT)) servopos = (SERVO1_LT);
    
            task_US_SW();
    
            displayData();
    
        }
        return 0;
    }
    ich habe den code nach meinem verständnis angepasst, weil ich ein paar sachen in Deinem code nicht verstanden habe:

    - die funktion displayData(range) innerhalb der messfunktion - warum?

    - die variablen r und range - warum zwei, warum innerhalb der funktion deklariert/definiert?

    die messwerte, die ich bekomme sind nachvollziehbar, das einzige was mich noch stört ist das verhalten meines servos: es kommen erstmal 4 messwerte bevor die erste servobewegung stattfindet. Verstehe ich nicht, liegt aber nicht an Deinem, sondern an meinem code ...
    gruß inka

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hi inka,
    eine paar Gedanken, eine Pause in der Hauptschleife ist nicht so vorteilhaft, da Pausiert ja denn wirklich alles. Ist es denn in Deinem Projekt wirklich nötig alle 5 Servoschritte eine Messung vorzunehmen ? Wie soll das denn später funktionieren wenn der BOT sich bewegt ?
    Wäre es nicht besser nur an bestimmten Positionen links, rechts und mitte die Messung durchzuführen ?
    Dass der RP6 bei der blockierenden ausführung der US-messung mal z.b. kurz seine fahrt unterbrechen muss, stört mich nicht weiter...
    Wieviel cm bewegt sich denn der Bot bis zur nächsten Messung ?

    Wenn ich das richtig sehe, dreht Dein Servo langsam nach rechts bis er > RT erreicht hat und dann in einem Rutsch zurück nach LT. Das sieht doof aus. Warum läßt Du ihn nicht auch wieder Schrittweise nach LT drehen ? Ich habe auch eine Funktion in der Lib geschrieben wo alle meine Servos eine Grundposition einnehmen. Diese rufe ich immer vor der Hauptschleife auf (Display Zeit) und habe bei Start immer die gleiche Position.
    Gruß TrainMen

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi TrainMen,

    danke für die tipps, nicht alles was ich hier poste ist bis zum letzten detail durchdacht und fertig, das manches doof aussieht mag ja sein, es wäre aber für mich hilfreicher gewesen auf meine frage einzugehen...

    trotzdem danke...
    gruß inka

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2011
    Ort
    Hechingen
    Alter
    52
    Beiträge
    20
    Zitat Zitat von inka Beitrag anzeigen
    ich habe den code nach meinem verständnis angepasst, weil ich ein paar sachen in Deinem code nicht verstanden habe:

    - die funktion displayData(range) innerhalb der messfunktion - warum?

    - die variablen r und range - warum zwei, warum innerhalb der funktion deklariert/definiert?

    die messwerte, die ich bekomme sind nachvollziehbar, das einzige was mich noch stört ist das verhalten meines servos: es kommen erstmal 4 messwerte bevor die erste servobewegung stattfindet. Verstehe ich nicht, liegt aber nicht an Deinem, sondern an meinem code ...
    Hallo inka,

    danke für Deine Fragen. Warum ich das so programmiert habe kann ich Dir gar nicht beantworten...war nur glücklich dass Servo und Sensor endlich wie gewünscht zusammengearbeitet haben. Durch Deine Fragen habe ich mich aber nochmal mit dem Code auseinandergesetzt und muss zugeben dass ich nicht gerade elegant programmiert habe.

    Grüsse, Jordi

    Nachtrag: Ich bekomme vor der ersten Servo-Bewegung 2 US-Messungen...stört mich aber im Moment (noch) nicht...setze mich derzeit mit der Kommunikation zwischen den µCs auseinander...

  6. #16
    Unregistriert
    Gast
    Hallo
    wo kommt denn der Wert von 1,67 bei der Berechnung her ?

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    also ohne Jordi jetzt vorgreifen zu wollen würde ich sagen aus der schallgeschwindigkeit

    334 m/s - geteilt durch die zwei wege - geteilt durch 100 (cm) = 1,67...

    edit: wobei 343 m/s bei 20°C besser passen würde...
    gruß inka

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2011
    Ort
    Hechingen
    Alter
    52
    Beiträge
    20
    Hallo,

    den Faktor habe ich nicht berechnet, sondern empirisch mit einem Zollstock und einem Hindernis in 10, 20, 30, 40 und 50cm bestimmt. (Grund: Denkfaulheit )

    Genauer: Sollwert war immer der Abstand, Istwert war der Durchschnitt aus je zehn Messungen (Ausgabe im Terminal). Daraus wurde für jeden Abstand der Korrekturfaktor bestimmt (Tabellenkalkulation von Libreoffice). Die Faktoren von 20 bis 50cm waren mit 1,66667 identisch, daher habe ich den Wert 1,67 genommen. Bei 10cm war der Faktor 1,47.

    Ob die Ungenauigkeit bei ganz kurzen Distanzen am US-Sensor oder meinem Code oder an Schlampigkeit beim Anlegen des Zollstocks liegt kann ich aber nicht beantworten.

    Grüsse, Jordi

    @inka: Danke für die Formel.
    Geändert von Jordi (20.06.2015 um 12:36 Uhr) Grund: Vorgehensweise hinzugefügt

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Verkaufe RP 6 Roboter mit RP6 Control M32 und allerhand Zubehör
    Von andij84 im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 5
    Letzter Beitrag: 17.01.2014, 19:16
  2. Antworten: 5
    Letzter Beitrag: 15.03.2012, 18:03
  3. LCD am RP6 Control M32
    Von tobuc0 im Forum Robby RP6
    Antworten: 4
    Letzter Beitrag: 02.10.2009, 21:34
  4. Antworten: 5
    Letzter Beitrag: 05.03.2008, 18:46
  5. RP6 CONTROL M32 - stand alone benutzen? also ohne RP6
    Von dirtyklaus im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 16.01.2008, 22:56

Stichworte

Berechtigungen

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

12V Akku bauen