Forum: Mikrocontroller und Digitale Elektronik ESP-NOW timing accuracy auf ESP8266/ESP32


von Mat. K. (matthias_kornfield)


Angehängte Dateien:

Lesenswert?

Hi
hat jemand Erfahrung mit ESP-NOW?

Ich sehe, daß meine Packete (nur ein Byte) mit Jitter empfangen werden.
Im Bild sieht man die Ergebnisse für ESP8266:
Lila: Byte sent on sender
Green: byte received on receiver
Delay: ~500 micro Sekunden
Jitter: ~ 6.5 milli Sekunden
Auf ESP8266 bekomme ich bessere Resultate als auf ESP32. Auf ESP32 ist 
Delay sowie Jitter grösser.
Gehört das mit dem Jitter so oder habe ich einen Fehler in mein INO 
(siehe Anhang)?
Warum verhält sich ESP8266 besser als ESP32?
Danke

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Im guten Fall hast du unregelmäßige Verzögerungen im einstelligen ms 
Bereich. Das ist völlig normal.

Ebenfalls normal sind Ausreißer bis 200ms. Damit muss man immer 
jederzeit rechnen. Erst darüber kommt der Bereich, wo es ernsthaft Sinn 
macht, etwas verbessern zu wollen.

von Obelix X. (obelix)


Lesenswert?

Ich hab in deine INO nicht reingeschaut. Verteile bei dem ESP32 die 
Aufgaben auf beide Kerne.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

> Warum verhält sich ESP8266 besser als ESP32?

Vielleicht, weil der ESP8266 kein Betriebssystem (RTOS) hat.

von Obelix X. (obelix)


Lesenswert?

ESP-NOW geht doch über WLAN, oder? Da kann immer jemand dazwischen 
funken. Evtl. hat der ESP32 eine schlechtere Antenne.

: Bearbeitet durch User
von Mat. K. (matthias_kornfield)


Lesenswert?

>>ESP-NOW geht doch über WLAN, oder?
dann wurde ich erwarten dass mein Packet verloren geht oder falsch 
ankommt. Es gibt doch keine repeat funktion bei ESP-NOW.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Obelix X. schrieb:
> Da kann immer jemand dazwischen funken.

Mat. K. schrieb:
> dann wurde ich erwarten dass mein Packet verloren geht oder falsch
> ankommt

WLAN vermeidet Kollisionen. Wenn der Funk-Kanal gerade belegt ist, 
müssen die anderen warten.

von Obelix X. (obelix)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> WLAN vermeidet Kollisionen. Wenn der Funk-Kanal gerade belegt ist,
> müssen die anderen warten.

Und wenn die anderen nicht wissen das sie warten sollen? Gibt ja noch 
mehr, was auf 2,4GHz funkt. Wenn ein anderer schon vorher angefangen hat 
zu funken, woher soll er wissen, dass er eine Pause machen muss, damit 
ESP-NOW Daten senden kann?

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Obelix X. schrieb:
> Und wenn die anderen nicht wissen das sie warten sollen?

Dann hast du Pech. Bluetooth und WLAN kooperieren diesbezüglich.

von Rainer W. (rawi)


Lesenswert?

Obelix X. schrieb:
> Wenn ein anderer schon vorher angefangen hat zu funken, woher soll er
> wissen, dass er eine Pause machen muss, damit ESP-NOW Daten senden kann?

Du hast die Verkehrsregelung nicht verstanden. Paket fertig senden und 
Klappe halten ist angesagt, damit die anderen auch eine Chance haben.

von Obelix X. (obelix)


Lesenswert?

Rainer W. schrieb:
> Du hast die Verkehrsregelung nicht verstanden. Paket fertig senden und
> Klappe halten ist angesagt, damit die anderen auch eine Chance haben.

Du hast meinen Kommentar nicht verstanden. (Ich hatte die Ironie Tags 
vergessen und dein Detektor hat nicht angeschlagen)

Genau und was haben wir dann? Jitter! Das war die Frage vom TO.

Für alle die meine Aussage missverstehen - wenn es auf Realtime ankommt 
würde ich nicht auf WLAN setzen.

Sherlock 🕵🏽‍♂️ schrieb:
> Dann hast du Pech.

Ich nicht, ich habe ja kein Problem damit aber der TO.

Der TO schreibt leider nicht warum ihm der Jitter so wichtig ist.

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Im guten Fall hast du unregelmäßige Verzögerungen im einstelligen ms
> Bereich. Das ist völlig normal.

Das ist so nicht richtig.
Ich habe einen ESP32 der nach exakt 700µs auf Daten antworten muss. 
Diese kommen per UART rein uns müssen 700µs nach dem letzten Byte wieder 
raus (bzw die Antwort).

Geht. Nur nicht mit den einfachen Arduino Funktionen. Man muss sich 
schon gedanken machen was man will und wie man das erreicht.
Und den ESP32 verstehen sollte man auch.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

John P. schrieb:
> Das ist so nicht richtig.
> Ich habe einen ESP32 der nach exakt 700µs auf Daten antworten muss.

Meine Nachbarn werden nicht auf ihre Tragbaren Geräte verzichten,  nur 
damit ich die gewünschten Antwortzeiten im WLAN erreiche. Wie machst du 
das, wohnst du alleine in einem freistehenden Haus?

von Cyblord -. (cyblord)


Lesenswert?

John P. schrieb:
> Ich habe einen ESP32 der nach exakt 700µs auf Daten antworten muss.

Das geht mit WLAN nicht. Du kannst dort keine beliebig schnellen 
Antwortzeiten garantieren. Deshalb wurden (kabelgebundene) Feldbusse 
erfunden.

von John P. (brushlesspower)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Wie machst du
> das, wohnst du alleine in einem freistehenden Haus?

Cyblord -. schrieb:
> Das geht mit WLAN nicht. Du kannst dort keine beliebig schnellen
> Antwortzeiten garantieren. Deshalb wurden (kabelgebundene) Feldbusse
> erfunden

Mein Fehler. Ich bin noch nicht ganz wach :(
Ich hatte gedacht innerhalb eines ESP32 wäre die Verzögerung/Jitter 
aufgetreten.

von Mat. K. (matthias_kornfield)


Lesenswert?

esp-now IST ABER KEIN ECHTES wlan: nur die untersten 2 OSI schichten.
Soweit ich lese sollte es eigentlich keinen Jitter in ms Bereich haben. 
Deshalb die Frage ob war an meinen Arduino skteches falsch ist, oder ob 
ESP-NOW die performance unter Arduino nicht bereit stellt sondern eher 
in C?

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Mat. K. schrieb:
> esp-now IST ABER KEIN ECHTES wlan: nur die untersten 2 OSI schichten.
> Soweit ich lese sollte es eigentlich keinen Jitter in ms Bereich haben.

Nochmal: Andere nutzen die gleichen Funkfrequenzen, das führt zu 
unregelmäßigen Wartezeiten. Sonst würde WLAN nicht funktionieren.

von Mat. K. (matthias_kornfield)


Lesenswert?

> Nochmal: Andere nutzen die gleichen Funkfrequenzen, das führt zu
> unregelmäßigen Wartezeiten. Sonst würde WLAN nicht funktionieren.
Alles roger dann entnehme ich aus dem was du schreibst dass die Warterei 
in den untersten 2 Schichten statfindet.
Kennst du zufällig eine andere Übertragung die ein besseres 
Jitter-Verhalten hätte?
Meine 2 Wahl war nordic priopriotory radio
https://www.nordicsemi.com/Products/Wireless/2-4-GHz-proprietary
Zufällig Erfahrungen damit?

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Mat. K. schrieb:
> Alles roger dann entnehme ich aus dem was du schreibst dass die Warterei
> in den untersten 2 Schichten statfindet.

Logisch, muss ja. Ansonsten hättest du ständig Kollisionen.

Mat. K. schrieb:
> Kennst du zufällig eine andere Übertragung die ein besseres
> Jitter-Verhalten hätte?

Die wird es auf freien Funkfrequenzen nicht geben, weil du die Frequenz 
nicht exklusiv nutzt.

Für dein gewünschtes Timing ist Funk das falsche Medium.

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?

Mat. K. schrieb:
> Kennst du zufällig eine andere Übertragung die ein besseres
> Jitter-Verhalten hätte?

Wo für brauchst du das geringe Jitter? Oft werden hier irgendwelche 
Dinge gewünscht, und dann stellt sich heraus, das es eigentlich gar 
nicht notwendig ist.

von Mario M. (thelonging)


Lesenswert?

Mat. K. schrieb:
> Deshalb die Frage ob war an meinen Arduino skteches falsch ist
Nicht direkt falsch, aber unschön und mögliche Jitter-Ursache:
* Printf seriell in einer Callback-Funktion
* doppelter Aufruf von millis()

von Michi S. (mista_s)


Lesenswert?

Mat. K. schrieb:
> Gehört das mit dem Jitter so oder
> habe ich einen Fehler in mein INO (siehe Anhang)?

Die weitaus sinnvollere Frage wäre, ob Du bzw. Deine Anwendung mit einem 
Jitter dieser Größenordnung leben kann?

Was mir aber an Deinem Sender-Sketch auffällt: Du hast keine konstanten 
Sendeintervalle, wie bestimmst Du da den Jitter überhaupt?

Denn Du startest Deinen 300ms Timer ja erst nach dem Senden neu, also 
liegen zwischen zwei Übertragungen immer: 300ms + Dauer der vorigen 
Übertragung.

Was mir noch auffällt, eher allgemeiner: Die Arduino DigitalRead/Write 
Funktionen haben einen ziemlich schlechten Ruf, wenns um schnelles der 
sehr exaktes Timing geht. Drum nimmt man besser möglichst HW-nähere 
Zugriffsmethoden um einen Timing-Pin zu toggeln.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die benötigten Takte/Zeiten für
1
digitalWrite()
 u.ä. Funktionen sind konstant und nur paar µs. Kann man als Konstante 
aus der Gesamtbetrachtung rauskürzen.

Die Mainloop hat auch kein festes Timing, weil im Hintergrund immer 
irgendwelche Interrupts beschäftigt sind.
lastTime wird hier immer aufaddiert, hat kein festes Timing in dem Sinne 
wie es gedacht ist.
Der Vergleich sollte
1
>=
 sein und
1
lastTime += timerDelay
. Damit man ein halbwegs konstantes Intervall hat.
Den Unterschied zwischen
1
lastTime = millis()
und
1
lastTime += timerDelay
sollte man sich einmal in Ruhe klarmachen. Hat beides Vor- und 
Nachteile, je nach Anwendungsfall.
Für
1
lastTime = millis()
 ist es auch entscheidend an welcher Position diese Zeile steht.

Ist aber für die Übertragung alles vollkommen egal.
Was ist denn überhaupt das Problem?
Oder ist das nur eine generelle Frage, weil man zufällig ein Oszi 
angeklemmt hat?

von Martin S. (strubi)


Lesenswert?

Wenn du das Originalzeug von Espressif nutzt (was ich annehme), hast du 
aufgrund des echtzeitbefreiten Kernels schon mal Null Latenzgarantien, 
auch wenn du den Wifi-Stack hackst (was aber gar nicht ETSI-konform 
waere).
Mit FreeRTOS kann es besser sein, aber auch da muss man den original 
Radio-Stack umdesignen. Ein Produkt sollte daraus trotzdem nie werden, 
der 8266 hat einfach zuviele Boecke und einige dieser Brettle gehoeren 
eigentlich spaetestens nach dem EMV-Test in die Entsorgung. Mit dem 
ESP32 mag's besser sein, ich bin lieber auf Mediatek umgestiegen.

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.