Posts by Wolfgang Glück


    Tolles Projekt. Ein R2D2 für den Enkel. Also so einen Opa hätte ich mir auch gewünscht, da hätte ich echt viel Zeit gewonnen weil die Grundlagen dann schneller in meinen Kopf geflossen wären und ich heute
    schon tolle Projekte machen könnte ;)

    Das Projekt ist wirklich schon sehr weit fortgeschritten und ich bin echt überrascht wie detailliert so ein "Hobby" Projekt sein kann. *Begeisterung*
    Schade das die mechanische Hardware so mies ist. Gibt es keine deutschen Hersteller für so ein Roboterchassis ? Da sollte die Qualität dann ebenfalls Begeisterung auslösen ...

    Danke für die Veröffentlichung !

    Hallo Marchegga
    zunächste danke fürs Kompliment.
    Ich bin seit dem Projektabbruch nicht mehr in diesem Forum aktiv. Das Forum beherbergt mir zu viele Besserwisser und Nörgler, die zu den gestellten Fragen oft nichts beitragen können.

    Natürlich habe ich mich nach Alternativen umgesehen und baue mittlerweile eine Eigenkonstruktion aus einem Alublechgehäuse. Von dem Raupenantrieb bin ich weggegangen und auf Rad umgestiegen, was sofort die Komplexität erhöht. Für den Antrieb verwende ich Standardbauteile aus dem Tuning Programm der 1:10 Modellfahrzeugwelt (Achsschenkel, Differentialgetriebe ...).

    Allerdings muss man da nochmals richtig Geld dafür in die Hand nehmen, die Modellbauer verkaufen einem jede Schraube einzeln für 20 EUR.


    Viel Spass noch und liebe Grüsse

    na die while läuft solange im Puffer eine neue Zeile gefunden wird, die Änderung in der Routine ist eh klar, nur damit while was bekommt

    jaja optimieren kann man immer, wenns erst mal vom Prinzip her läuft.

    Ist so eine Marotte hier im Forum, wenn man das Problem nicht lösen kann mäkelt man am Programmierstil herum. Nichts für Ungut :)

    Es gibt Tricks um den Zyklus zu verkürzen, das musste ich während des Drehens machen um rechtzeitig stoppen zu können bzw. um eine sinnvolle Genauigkeit zu erreichen.

    Das rechtzeitige Anhalten mache ich mit einem kleinen Vorhalt von ein paar cm.

    Aber zurück zum Thema. Allen Unkenrufen zum Trotz habe ich die Lösung ohne Protokoll:

    definition des Parsers

    Und der Aufruf in der Loop mit Mehrfachauslesen des Interfaces bis es leer ist:

    Und es gibt keine überschriebenen Befehle mehr!!

    Das sind ja alles sehr gut gemeinte Ratschläge, aber keiner kann mir meine Fragen beantworten

    recherchieren in der Tiefe des Systems... ohne mich, ich finde es lausig wie das Zeug dokumentiert ist.

    In Empfangsrichtung läuft wie gesagt ein ganzer Prozess, der nur die Schnittstelle liest und ich bekomme keinen einzigen Fehler!

    Warum ich die Daten nur alle 400ms lese im Arduino, liegt daran dass alle Beispiele das lesen nur im Zyklus machen, ich habe noch kein Beispiel gesehen das auf Timerinterrupt Basis die Schnittstelle liest. Wenn das alle so ohne Zwischenpuffer funktionieren würde könnte ich kein einziges Byte richtig empfangen...

    Ich werde mal einen anderen Ansatz versuchen:

    - Ich weiss wieviele Daten in 400ms auflaufen können, das sind maximal 4 konkurrierende Befehle macht maximal 100Byte
    - Ich übertrage mit 38200 Baud
    - Die Kommandos werden falls welche vorhanden sind nach jedem empfangenen Satz in Melderichtung einzeln runtergeschickt (\n als Trennzeichen)
    - Ich werde im Arduino die Befehlsschnittstelle mehrfach auslesen (bis \n), bis sie leer ist
    - Ich werde nun versuchen rauszufinden wo auf dem Arduino der Puffer versteckt ist und wie gross der ist.

    Ein handshake oder acknowledge würde die Befehle ja weiter verzögern bis hin zu einem Befehl pro Zyklus, das ist auch nicht zielführend

    ich weiss sehr gut was ein Protokoll ist und was es leistet. Habe früher mal mit Fernwirktechnik zu tun gehabt. Nur für meinen Anwendungsfall ist das oversized. Ich will ja nicht einen kontinuierlichen Datenstrom steuern...

    Hallo Andreas, ich mache gerne was nötig ist.

    Die Dokumentation von serial ist eher nicht so geeignet mir zu sagen was nötig ist.

    In der anderen Richtung habe ich einen Prozess, der nur liest, also da funktioniert alles ohne Protokoll.

    Ich versuche mir vorzustellen was da auf der Strecke passiert:
    - PC sendet einen Befehl der 18 Zeichen lang ist
    Wenn nun nichts weiter gesendet wird landen diese 18 Bytes wo? ich meine solange der Empfänger nicht liest

    - Ich kann ja zeigen, dass einzeln gesendete Sequenzen bis \n richtig ankommen. Also kann das Problem nicht innerhalb einer Bytesequenz liegen.

    - meine Frage zielt auf den nicht dokumentierten Teil. wo sind die Bytes während des Sendens solange das Lesen noch nicht aktiv ist? in einem Puffer auf PC Seite?
    - was passiert wenn der PC die zweite Sequenz hinterherschickt? wird die erste auf PC Seite schon überschrieben? das kann man dann nur über ein Protokoll lösen , soweit einverstanden

    Hallo zusammen

    ich habe eine Routine für das lesen der Kommandos aus der USB Schnittstelle. Die Schnittstelle bekommt die Daten vom PC bzw. Raspberry.

    z.B:

    Code
    "Forward slow: 1 \n"

    Die Zykluszeit des Arduino beträgt ca. 400ms. Der PC kann die Kommandos schneller anliefern z.B. 2 oder 3 Kommandos innerhalb der Zykluszeit des Arduino.

    Werden die Daten im Arduino (Betriebssystem) gepuffert, wie gross ist dieser Puffer?
    Es kommt vor dass ich im Arduino überschriebene Kommandos sehe (hab sie zum PC gespiegelt)


    ich rufe die Routine 1x im Zyklus des Arduino auf. Solange die Kommandos einzeln kommen ist alles richtig.

    Code
    SerialParser();
       if (ByteCount  > 0) {
         CommandString = Command;
         .....

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ein neuer Projektstand wurde veröffentlicht.[/font]

    • ich werde das Projekt in dieser Form abbrechen, siehe Statement am Anfang des Projektes
    • Der Bau des Prototyps hat wertvolle Erkenntnisse geliefert und die erarbeitete Lösung ist beachtlich.
    • Möglicherweise versuche ich auf Basis neuer Hardware einen neuen Ansatz

    So hier noch eine verbesserte Version

    Ein alter Wert wird im Schieberegister behalten und zwei neue dazugelesen (Gewichtung der neuen Werte).
    Damit erreiche ich zumindest eine Verteilung +- 6cm bei ca. 30 Werten.

    ich versuchs nochmal auf diesem Weg:

    Drei Werte lesen und nur übernehmen wenn sie gültig sind (nicht out of range), davon dann den Mittelwert bilden.

    Da ich den Wert nur für die Erkennung eines Hindernisses verwende könnte das reichen.

    Ich habe auch herausgefunden, dass die Fehlerquote (out of range) mt den eingestellten Werten 20/10 us am tiefsten ist (ca. 20%)

    interessant, ich bin schon etwas im Zweifel ob ich die richtige Hardware verwendet habe.

    Das Rover5 Chassis kann nicht geradeaus fahren ich muss in den beiden PWM Ansteuerungen 30% Differenz einstellen damit der Roboter geradeaus fährt. Dadurch ist der Antrieb einseitig (rechts wird mitgezogen) und die Odometriedaten sind mit einem Fehler beaufschlagt.
    Das Chassis hatte eine Differenz zwischen dem linken und rechten encoder...
    Die Entfernungsmessung ist unzulänglich mit US-015

    Bin kurz davor das Projekt als gescheitert hinzuschmeissen

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]WENGLOR CP35MHT80 ist ja nicht ganz billig und für einen Roboter etwas gross[/font]

    Die Logik erschliesst sich mir nun nicht, raten kann ich auch selber, es geht um Wissen.

    so wie ich die Spezifikation von PulseIn verstehe ist sie ebenfalls interruptgesteuert. d.h. das Programm wird angehalten bis der Impuls von high auf low geht bzw. bis timeout.
    In meinem Fall würde das bedeuten der Impuls bleibt auf high und der timeout schlägt zu.

    Insofern sollte ein anderer Interrupt nicht stören, höchstens das Zeitverhalten geringfügig verändern, was bei der Encoder routine kaum der Fall sein wird, da die Befehlsfolgen minimal sind.

    Was stören kann, ist das Unterdrücken der Interrupts (cli(), sei() während der Ausführung der IRS der Encoder. damit könnte ein anderer Interrupt verloren gehen, wenn ich das richtig interpretiere.

    Code
    int16_t QuadratureEncoderReadRt( void ) // read single step encoders
    {
     int16_t val;
     cli();
     val = encDeltaRt;
     encDeltaRt = 0;
     sei();
     return val; // counts since last call
    }

    Naja, so simpel war meine Frage natürlich nicht gemeint :)

    Der US Sensoren hat ein Timeout von 23ms eingestellt (Begrenzung des Messbereiches auf 400 cm)

    Klar kann ich die Interrupts verhindern, das hat natürlich Folgen, ich verliere Interrupts für das Abtasten der Encoder, was im 1 ms Zyklus passiert. (Die Pulsänge der Encoder beträgt etwa 2ms)

    Die Frage ist ob diese Interrupts überhaupt stören können?
    Wenn ja, muss ich das Lesen der US Sensoren evtl auch per Interrupt tun.

    Hi Chris
    Die Stromversorgung des Arduino ist ein NiMH Akku mit 10'000 mAh (8x 1.2 V Typ D) , ich würde mal Spanungseinbrüche ausschliessen.

    Analysewerkzeuge darauf ansetzen ist eher mühsam bei zyklischen Ereignissen mit sporadischem Effekt.

    Die Sequenz im Arduino wird möglicherweise durch die ISR der Encoder unterbrochen.

    Kann man die Sensor Sequenz schützen vor dieser Unterbrechung?

    Hallo zusammen

    ich habe folgende Sequenz im Arduino zum auslesen des Sensors programmiert:

    Die Versuchsanordung besteht aus dem Roboter mit dem Sensor und eine Schachtel im Abstand 25cm vor dem Roboter.

    Wenn ich die übertragenen Werte mit der Arduino Entwicklungsumgebung anschaue sehe ich in der Reihe

    viele richtige Werte mit 24 und 25 cm
    eingestreut der Wert 400cm (timeout) einmalig oder mehrmals hintereinander

    Ich kann mich also nicht auf die Messung verlassen!

    Mach ich was falsch oder sind die Sensoren nicht verlässlich?

    Der Arduino läuft mit einem Zyklus von ca. 400 ms

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ein neuer Projektstand wurde veröffentlicht.[/font]

    • Die Deviation für die Kompassverwendung wurde pro Baumkante (edge) implementiert
    • Das Fahrprogramm wurde mit minimaler Funktion, ohne Korrekturen, implementiert
    • Der Roboter fährt nun selbständig von einem gewählten Positionspunkt zu einem Zielpunkt
    • Leider ist die Mechanik des Chassis so ungenau dass ich mir weitere Schritte für die Stabilisierung der Geradeausfahrt überlegen muss


    habs mal umgebaut und so fub ktioniert es! (na so viel viel einfacher ist das auch nicht...