Seriell vs. W5100 vs. W5200

Moins !

Ich wollte mal in die Runde fragen ob jemand zum Thema Datenaustausch ein paar Infos / Erfahrungen hat. Also folgendes Konstrukt liegt bei mir auf dem Tisch:
Arduino 1 (Mega) ← SERIELL → Raspberry Pi ← SERIELL → Arduino 2 (Mega).
Also zwei Mega die an einen Pi angeschlossen sind mit dem normalen seriellen Interface des Arduino (über USB Port).

Um es vorweg zu nehmen - es geht um mein Haussteuerungsprojekt. Aber das soll hier mal gar nichts zur Sache tun :slight_smile:

Das Szenario ist auch ganz einfach. An Arduino 1 ist ein Taster. An Arduino 2 ist ein Relais. Auf dem Pi läuft eine Anwendung welche die seriellen Daten handhabt. Der Ablauf ist so : Taster drücken → Ard 1 sendet eine Info an den Pi (5 Bytes) → Pi empfängt und wertet die Info aus → Pi sendet an Ard 2 einen Befehl das Relais zu schalten (1 Byte derzeit).

Keine Rocket Science, aber es soll auch eher ums Prinzip gehen. Wenn ich den Taster drücke und die TX / RX Lampen der Arduinos beobachte kann man schon mit dem Auge sehen das da ein ordentlichers Delay drin ist (kein programmiertes im Sketch :wink: ).
Gestern habe ich dann mal einen Logik Analyser an den Taster und den Relais Pin angeschlossen. Das entstehende Delay ist schon in der Größenordnung >250ms.
Alle Schnittstellen arbeiten übrigens mit 115200 Baud.

Nun stellt sich mir natürlich die Frage wie kriegt man das schneller hin. So ein paar ms kann man sicher noch in der Anwendung am Pi rausholen. Aber dort laufen beide Schnittstellen schon in einem eigenen Thread - sollten also recht zügig bedient werden. Ich fürchte im Moment das die USB/Seriell Umsetzung einfach eine Menge Zeit frisst. Ist allerdings schwer zu messen …

Anyway … Wenn ich nun die serielle Kommunikation verwerfe und beide Mega mit einem Ethernet Shield bestücke … Wird das dann wohl schneller? Zudem habe ich heute auch noch gelesen das es seit einiger Zeit den W5200 gibt. Den könnte man mit einem höheren SPI Takt betreiben und hat noch ein paar andere Optimierungen.

Hat jemand schon mal damit Erfahrungen gesammelt oder kann jemand abschätzen ob mir die Netzwerk Umsetzung (mittels TCP) Geschwindigkeitsvorteile bringt?

Es sind auch höhere Baudraten möglich. Die 115200 ergeben sich nur durch den SerialMonitor. Ich habe mit C# auf dem PC problemlos 250000 und 500000 laufen. Die solltest du auch auf dem Pi einstellen können. Gerade Baudraten sind da sowieso besser, da die genauer zum 16MHz Takt passen.

Wobei der Flaschenhals eher die Ethernet Lib sein wird. Es werden ja kaum Daten übertragen.

Moin !

problemlos 250000 und 500000 laufen

Ja das sollte gehen. Nur die Frage ob es an der Verzögerung was ändert. Damit würden nur die 6 Bytes schneller über den Draht geschoben. Ich vermute das bringt kaum was.

Wobei der Flaschenhals eher die Ethernet Lib sein wird.

Bzw. das SPI Interface. Ist halt im Normalfall (W5100) auf 4MHz beschränkt. Und der Overhead ist bestimmt nicht ohne ...

Werde heute Abend auf jeden Fall mal die W5100 Variante testen. Mal sehen was sich in der Praxis ergibt ...

Das entstehende Delay ist schon in der Größenordnung >250ms.

Das kann ich mir nicht vorstellen.
1/4 Sekunde?
Das geht DEUTLICH schneller.

Ich nutze für solche Probleme diese Lib: http://playground.arduino.cc/Code/CmdMessenger

Das geht DEUTLICH schneller.

Das hoffe ich mal :slight_smile:

Ich nutze für solche Probleme diese Lib

Die wird mir jetzt aber wenig helfen, oder? Damit habe ich ja noch eine Ebene mehr in meiner Kommunikation.
Ich glaube nicht das der Flaschenhals bei der seriellen Kommunikation selber zu suchen ist. Ich vermute eher das die Seriell/USB Umsetzung Zeit frisst.

Und ich werde wohl zu Testzwecken mal den Pi aus der Verarbeitungskette nehmen. Nicht das der mir in die Suppe spuckt.

Ja, denke auch dass hier der Pi aus irgendeinem Grund sehr lange braucht. So wie ich das sehe kann man aber USB umgehen und auch direkt an die serielle Schnittstelle:
http://elinux.org/RPi_Serial_Connection
Braucht aber einen 5V/3,3V Pegelwandler!!

Wenn du es über Ethernet machst, bietet sich vielleicht eher UDP als TCP an. Das ist einfacher aufgebaut.

Moin !

Ja, denke auch dass hier der Pi aus irgendeinem Grund sehr lange braucht.

Ok ich werde heute Abend mal den Pi gegen meinen normalen Desktop Rechner ersetzen. Mal sehen was dann raus kommt.

Und danach teste ich mit Pi & Desktop Rechner mal die Umsetzung mittels W5100 - TCP als auch UDP.

Mal sehen was da an Werten raus purzelt.

combie:

Das entstehende Delay ist schon in der Größenordnung >250ms.

Das kann ich mir nicht vorstellen.
1/4 Sekunde?
Das geht DEUTLICH schneller.

Das GEHT in der Tat deutlich schneller.

Wenn ich es richtig mitgekriegt habe, werden eine Handvoll Zeichen übertragen:
6 Zeichen brauchen selbst bei 9600 Baud nur 6 ms, bei 115200 sind es weniger als 1 ms.

Alle Optimierungen in dieser Richtung sind Unsinn.

Die Frage ist doch, wann und wie die Software auf PC oder PI in der Mitte merkt, dass etwas zu tun ist.

dort laufen beide Schnittstellen schon in einem eigenen Thread

Das macht das Ganze vermutlich langsamer.
Wie wecken sich die Threads gegenseitig auf?

michael_x:
Wenn ich es richtig mitgekriegt habe, werden eine Handvoll Zeichen übertragen:
6 Zeichen brauchen selbst bei 9600 Baud nur 6 ms, bei 115200 sind es weniger als 1 ms.

Ganz so schnell geht es nicht, denn die USB-Seriell-Wandlung verursacht schon eine kleine Latenzzeit, die es bei der Kommunikation "echter" serieller Schnittstellen untereinander nicht gibt. Allerdings liegt die durch die USB-Wandlung begingte Latenzzeit nur bei wenigen Millisekunden.

Ich habe es gerade mal mit einem Arduino UNO, 115200 Baud und einem Windows-7 PC getestet:
Zeit starten, Uno sendet 4 Bytes zum PC, PC sendet 15 Bytes zurück, Zeit stoppen.

Das dauert insgesamt ca. 4 bis 8 Millisekunden, Werte schwankend.

Moin !

So ich denke ich muss hier mal was aufklären. Ist schon fast peinlich … Aber wie heisst es so schön - aus Fehlern lernt man :blush:

Also ich habe das heute auf meinem Windows Rechner getestet. Also Aufbau wie folgt:
Arduino 1 mit Taster → Seriell/USB → Windows 7 → Seriell/USB → Arduino 2 mit Relais angeschlossen

Wenn ich das auf meinem Windows Rechner mache kriege ich das in ~5-10ms hin. So wie es sein soll.

Auf dem Pi war es dann wieder > 250ms. Nachdem ich den in den Code für meine Serielle Lib geschaut habe kam das große Auweia :smiley: Ich habe die Lib nun umgeschrieben auf Asynchrone Benutzung. Und siehe da … Auch der pi schafft es in ~15ms 8)

Also die Kette ist dann:
Arduino 1 mit Taster → Seriell/USB → Raspberry (auf 950MHz) → Seriell/USB → Arduino 2 mit Relais angeschlossen

Jetzt kann man mit dem Auge auch nicht mehr erkennen wenn bei den Arduinos Tx / Rx abwechselnd blinken :slight_smile:

Über Netzwerk wird es jetzt vielleicht noch einen Hauch schneller. Das teste ich mal als nächstes.
Im Moment bin ich aber froh das da kein genereller Flaschenhals war. :roll_eyes:

Wenn ich Ergebnisse zum Netzwerk habe (W5100) werde ich es hier posten.

Anbei noch das “erlösende” Ergebnis vom Logik Analyser (das Teil hat 8€ gekostet und ist Gold wert im Moment :smiley: ).

Hab ich hier erst gepostet :wink:
Ethernet Shield nachbauen

Sorry, hab moelski mit Muecke verwechselt :smiley:
Hatte dir ja schon geschrieben, wolltest es dir mal anschauen.

Moin !

wolltest es dir mal anschauen.

Jep wenn meine Hardware soweit steht. Im Moment isses ja eher noch Grundlagenforschung :wink:

Ok ich habe jetzt die Ausgangsseite ins Netzwerk verfrachtet.
Die Kette schaut also so aus:
Arduino 1 mit Taster → Seriell/USB → Raspberry (auf 950MHz) → Netzwerk/TCP → Arduino 2 mit Relais angeschlossen

Wie man auf dem Logik Analyser Bild sehen kann ist es etwas langsamer geworden 16 anstatt 22ms.

Tja dafür könnte es nun mehrere Erklärungen geben:

  • der Arduino Sketch verwendet noch einen String zum empfang der Daten. Auch das Zerlegen erfolgt mit String Funktionen. Ist unschön und muss noch sauber mit Byte Arrays gelöst werden.
  • der TCP Overhead ist einfach größer als bei der seriellen Übertragung. Und das sowohl am Pi als auch am Arduino.

Aber 22ms merkt man auch nicht wirklich wenn man auf den Taster drückt :smiley:

Und ich habe die Logik jetzt so umgesetzt das ich mehrere Anweisungen an den Output in einem Rutsch schreibe.

In Summe bin ich zufrieden mit den Ergebnissen. Und hier und da ist sicher noch Potential :wink: