Forum: Mikrocontroller und Digitale Elektronik Arduino - Netzwerk holprig


von Frank (Gast)


Lesenswert?

Ich arbeite an einer LED-Laufschrift, bestehend aus mehreren 
16x32-RGB-Panelen und je einem Arduino Namo pro Panel. Der Code beruht 
auf der bekannten Adafruit-Lib und den dazugehörigen Beispielen. Meine 
besondere Anforderung ist die, dass ich nicht irgend eine "Show" vorher 
speichern und dann abspielen möchte, sondern Daten vom PC müssen live 
angezeigt werden. Das klappt für sich alleine mit jedem Modul per 
USB/Serial wunderbar - ich erreiche bei 115000 bit/s ca. 22 Frames/s.

Nun dachte ich, ich nehme quasi als Hub einen Arduino Uno mit 
Ethernet-Shield (also mind. 10Mbit), der dann seinerseits die MCs an den 
Modulen per SoftSerial versorgt. Es gibt einen Sync-Code, der alle 
Zähler zurücksetzt und ansonsten geht das erste Byte zu Serial-1 hinaus, 
das zweite zu Serial-2 usw., bis die 512 Bytes pro Modul (16x32) voll 
sind, dann gehts von Vorne wieder los.

Aber das klappt nun wiederum nichtmal mit einem einzelnen Clienten. Auch 
nicht mit reduzierter Baudrate von 57000.

Die Ausgabe ist extrem ruckelig, oft bleibt das System einfach ganz 
stehen. Die Daten kommen zwar ruckelig aber sauber (vollständig) am 
Hub-Arduino an, das kann ich mir per Serial-Monitor ansehen ...

Könnte es sein, dass ein TCP-Paket immer erst "voll" sein muss, bevor es 
abgesendet wird? Das würde die Ruckelei erklären, aber nicht die 
Aussetzter und Hänger ... was habe ich übersehen? Tips? Danke!

von Chris M. (yoblid) Benutzerseite


Lesenswert?

Es ist die Aufgabe von TCP dafür zu sorgen, dass die Daten vollständig 
sind, daher regelt die Flusssteuerung von TCP die Übertragungsrate 
runter, falls  die Daten schneller ankommen, als sie verarbeitet werden 
können. Das vermute ich als Ursache für das Ruckeln.

Damit es nicht ruckelt, könntest du versuchen, einen Puffer zu 
programmieren, der die Daten in ausreichender Menge aufnimmt und 
sammelt, bevor sie an die Anzeigen weitergegeben werden - ähnlich dem 
Buffering beim Video-Streaming (z.B. YouTube), denn im Grunde versucht 
du ja ein Streaming zu implementieren.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Frank schrieb:

> Könnte es sein, dass ein TCP-Paket immer erst "voll" sein muss, bevor es
> abgesendet wird? Das würde die Ruckelei erklären, aber nicht die
> Aussetzter und Hänger ... was habe ich übersehen? Tips? Danke!

Nimm UDP. Das belastet den AVR weniger, und Du machst die 
Flusskontrolle, nicht der TCP-Stack. Auch bei Internettelefonie laufen 
die Daten über UDP, und das hat seine Gründe.

fchk

von Frank (Gast)


Lesenswert?

Die Ursache scheint gefunden: SoftSerial nutzt Interrupts, die auch die 
Ethernet-Lib nutzt, das beisst sich. Die vorhandene Hardware-UART bleibt 
davon ungestört - allerdings hat der UNO ja leier nur eine, der Mega 
dagegen drei, ich brauche aber fünf :-(

Ich werde es nun damit versuchen, dass alle Modulrechner an der einen 
Hardware-Serial "horchen" und ich den Datenblöcken eine Kennung 
voranstelle, die das jeweilige Modul adressiert. Damit die Module aber 
ihren neuen Inhalt nicht nacheinander aktualisieren (sieht doof aus), 
gibts einen extra-Code zum Planeswapping, den dann alle gemeinsam 
ausführen ...

Damit muss ich wohl auf Animationen verzichten, aber damit kann man bei 
einem Info-Display vermutlich leben.

von Frank (Gast)


Lesenswert?

So, Problem gelöst: UDP war die Lösung - Danke für den Tip. In meiner 
Steuersoftware kann ich die Pakete genau so groß machen wie nötig und 
auf dem Hub-Arduino dazu passend den Empfangspuffer.

Somit erreiche ich nun über 5 Panele (160 x 16) immerhin eine Datenrate 
von beinahe "butterweichen" 14 Frames/s - absolut ausreichend.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.