Umstieg auf ESP32-Arduino 2.x

Es gab heute ein größeres Update im Arduino master, hatte gehofft das die WLAN Verbindungsprobleme behoben sind, vor allem hier und hier. Es kompiliert aber die WLAN Verbindung ist genauso schlecht wie im 2.0.1 release. Da müssen wir wohl noch warten bis das wieder klappt.
Um sicher zu sein das hier wirklich das aktuelle IDF verwendet wird habe ich in main.cpp die Ausgabe

    Serial.print(F("ESP-IDF-version (major): "));
    Serial.println(ESP_IDF_VERSION_MAJOR);
    Serial.print(F("ESP-IDF-version (minor): "));
    Serial.println(ESP_IDF_VERSION_MINOR);

ersetzt durch

Serial.println("ESP-IDF version: " + String(esp_get_idf_version()));

Dann kommt das kürzer und genauer raus:

ESP-IDF version: v4.4-beta1-183-gf23dcd3555

@biologist evt. kannst Du das in einem der nächsten Update ersetzen.

Fazit: Umzug noch nicht reif, abwarten und Tee trinken…

Was genau ist schlecht?

Beim Starten von ESPuino wird ja ein Timeout für WLAN verwendet. Im Arduino Core gab es längere Zeit einen Bug, sodass nicht alle Kanäle gescannt wurden, um sich mit dem stärksten WLAN zu Verbinden. Aktuell wird das aber nun gemacht und damit braucht die initiale Verbindung deutlich länger. Eventuell hilft da schon das Erhöhen des Timeouts.

Ja Timeout habe ich erhöht auf 15 Sekunden. Alle Verbindungen in der FritzBox vorher gelöscht. Es kommt keine WLAN-Verbindung zustande, ESPuino wechselt dann in AP Modus, Reset, Neueingabe der WLAN Zugangsdaten hilft auch nicht… Kurzum ich kann keine Verbindung herstellen. Wechsel zurück auf 1.0.6: Verbindung ist sofort da (<2 Sekunden). Hast Du den Master ausprobiert? Klappt das bei Dir?

Bezogen auf ESPuino habe ich es noch nicht getestet, aber ich habe aktuell ESP-IDF 4.4 beta1 und Arduino als Komponente (master von heute) für ein anderes Projekt vor mir. Dort läuft Wifi ohne Probleme mit einem Unifi AP. Wir benutzen Wifi allerdings explizit ohne den Flash Storage vom Wifi-Treiber. Das könnte auch noch einen Unterschied machen. Dafür ruft man „WiFi.persistent(false);“ vor den anderen WiFi-Funktionen auf. Wer weiß schon, was er sich für zuvor gespeicherte Informationen aus dem Flash zaubert.

Klar, kann ich eintragen.

Mittlerweile ist Arduino 2.0.2 veröffentlicht, bringt aber leider keine Verbesserungen im Wifi-Bereich. Es bringt wohl auch einen neuen Bug bei der SD-Ansteuerung mit.

@tuniii Habe hier wirklich Alles probiert, NVS gelöscht, mehrfach neu verbunden. Hatte auch einen neues jungfräuliches Board sowie neben meinen TTGO-T18 Board jetzt auch einen Lollin-D32 Pro angehängt.

Die WIFI-Verbindung ist mit Arduino 2.x in diesem Projekt nicht akzeptabel zu 1.06.

Selbst wenn es sich mit dem Router verbindet ist die Performance sehr schlecht. Also aus meiner Sicht ist das Release leider noch nicht reif. Mal schauen was da noch so kommt…

Auch mit einem simplen Wifi-Sketch, oder hast du das nur mit ESPuino getestet?

Ich habe das bisher tatsächlich nur mit dem ESpuino Code getestet, denn da ist es ja entscheidend.

Aber da ich das hier reproduzierbar habe kann ich das die nächsten Tage auch einmal mit dem Minimal Sketch ausprobieren und berichten…

Ich konnte die Wifi-Verbindungsprobleme nun endgültig lösen mit diesem Arduino Fix/PR. Verbindungsaufbau dann genauso gut wie in 1.0.6. Bei mir < 3Sek und stabil. Der Fix wird wohl auch bald in einem offiziellen Release erscheinen.
@tuniii wundert mich warum die Probleme bei Dir nicht auftreten. Du verwendest ja Arduino als Komponente, sollte da nicht der gleiche Code für den Verbindungsaufbau verwendet werden? Aber vielleicht liegt es ja auch am Router, hier eine FRITZBox 7590 mit ca. 10m Entfernung, RSSI recht gut da Altbau und kein Beton dazwischen…

Was noch bleibt ist die schlechtere SD Geschwindigkeit. Komme hier nicht über 180KB/s im SD_MMC Modus hinaus. Habe auch diesen Fix eingespielt, da war auch noch was vermurkst. Das ist aus meiner Sicht noch ein Showstopper für einen Umstieg. @biologist hatte die gleich Messung, wie könnte man das noch lösen?

@tueddy Da muss ich dir jetzt echt mal ein großes Danke aussprechen, dass du die ganze Zeit bei den Neuigkeiten so am Ball bleibst und das hier immer berichtest :+1: :+1: :+1: .

Wenn man den Webtransfer macht, dann landet das ja über einen Ringpuffer auf der SD. Der Ringpuffer ist zum Schreibzeitpunkt immer sehr unterschiedlich gefüllt. Hier hatte ich ja mal die Idee aufgeworfen (auch im Zuge der spontanen Schreibabbrüche bei SPI-SD), dass man hier schaut, dass man immer mindestens 4k im Ringpuffer hat, so dass man immer 4k-Blöcke schreiben kann. Keine Ahnung ob das was ändert, aber wäre ggf. ein Ansatz. Ich hatte mir das immer vorgenommen zu entwickeln, aber final dann doch nie umgesetzt.
Sonst habe ich spontan keine Ideen. Vielleicht hat @tuniii ja noch welche.

Ja, der Code ist der gleiche, aber das Problem wird wohl netzwerkspezifisch sein. Wenn es ein generelles Problem wäre, dann hätte es der Bug vermutlich nicht in das Release geschafft.

Hast du irgendwo einen Branch mit deinen Änderungen (Upgrade auf den neuen Core)? Ich würde mir gerne mal den Stand anschauen.

@tuniii ich verwende den originalen ESPuino Code und wechsle von Arduino 1.0.6 auf 2.0.2 nur durch umschalten dieser Zeilen in der Platform.ini von 1.0.6

[env]

platform = espressif32 
;platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream

platform_packages =
	;platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git
	platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#1.0.6

auf 2.0.2/master:

[env]

;platform = espressif32 
platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream

platform_packages =
	platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git
	;platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#1.0.6

Den noch austehenden Fix für Wifi habe ich direkt im 2.0.2 Core eingebaut, danach klappt der Verbindungsaufbau auch wieder zuverlässig.
Ich habe in der FritzBox 7590 die Verschlüsselung WPA3/WPA2 eingestellt. Neuere Geräte verbinden sich mit WPA3, ältere mit WPA2. Evt. ist das die Ursache? Ich meine aber das testweise auf reines WPA2 umgestellt zu haben…

1 „Gefällt mir“

Ich hab nun mal mit dem Arduino Core 2.0.2 (master) getestet.

  • NeoPixel bleibt dunkel

  • Das Abspielen von Musik verursacht einen Reset. Vermutlich wird das durch deine Änderung bezüglich SdCard.cpp oben behoben.

  • Bei Wifi mit Timeout-Loop auf 20 starte ich sporadisch im AP, ansonsten funktioniert Wifi. Aber die häufigen Verbindungsabbrüche beim Testen mag der AP nicht unbedingt und daher kann das auch der Grund sein, warum ich sporadisch mit AP starte.

  • Bei einem reinen Schreibtest komme ich mit MMC auf: Alter Core 404 kByte/s, neuer Core 440 kByte/s

  • Bei einem reinen Wifi-Durchsatz-Test, ohne die Daten rauszuschreiben: Alter Core 361 kByte/s, neuer Core: 260 kByte/s

  • Upload-Test über HTTP: Alter Core: 332 kBytes/s, neuer Core 229 kByte/s. Beide ca. 30 kByte/s unter dem Wifi-Durchsatz.

Der Wifi-Durchsatz scheint wohl beim neuen Core das Problem zu sein. Wie sieht es bei dir beim NeoPixel aus? Bleibt der auch dunkel?

Der neue Core bringt wohl so einige Probleme mit sich.

1 „Gefällt mir“

Hat ein wenig gedauert bis ich das jetzt erneut testen konnte mit

ESP-IDF version: v4.4-beta1-189-ga79dc75f0a

Der NeoPixel läuft einwandfrei, ich verwende FastLED mit dem aktuellen Release 3.5.0

3.5.0 habe ich die Tage bereits gepinnt.

Hatte jetzt mal wieder Zeit den aktuellen Master zu testen,
die Wifi-Verbindungsprobleme und SD-Karten Bugs sind behoben.

ESP-IDF version: v4.4-beta1-308-gf3e0c8bc41

Das klappt Alles soweit. Der Wifi Durchsatz ist immer noch nicht das gelbe vom Ei, konnte aber die grottenschlechte Performance beim Web-Upload nicht mehr nachstellen: Die Vergleichsmessung Web-Upload einer 10MB Datei:

1.0.6: 9556012 bytes in 37632 ms (253 kB/s)
2.0.2 master: 9556012 bytes in 42208 ms (226 kB/s)

Evt. wurde zugunsten des freien Speicherplatzes die Wifi-Konfiguration geändert? Habe dazu diese Dokumentation gefunden und gleich mal Wifi.useStaticBuffers(true) ausprobiert - mit mauen Ergebnis:
ohne: 226 kB/s
mit: 231 kB/s, ca. 20KB mehr Speicherverbrauch
@tuniii kennst Du Dich mit der Wifi-Konfiguration aus?

MMC oder SD?

Nicht im Detail. Ich habe bisher auch nur die Arduino-Funktionen verwendet. Es muss aber auch nicht unbedingt direkt an Wifi liegen, sondern kann auch an der Verarbeitung der entsprechenden Protokolle wie TCP liegen.

Ich verwende nur SD_MMC. Da ist die Performance auch wieder in Ordnung.

Hatte nochmal die korrekte Anwendung von Wifi.useStaticBuffers(true) überprüft (Aufruf vor Wifi.begin), das bringt so 5-10 KB/s:

useStaticBuffers¶

This function is used to set the memory allocation mode for the Wi-Fi buffers.

static void useStaticBuffers(bool bufferMode);

    Set true to use the Wi-Fi buffers memory allocation as static.

    Set false to set the buffers memory allocation to dynamic.

The use of dynamic allocation is recommended to save memory and reduce resources usage. 
However, the dynamic performs slightly slower than the static allocation. 
Use static allocation if you want to have more performance and if your application is multi-tasking.

By default, the memory allocation will be set to dynamic if this function is not being used.

Reicht abeer nicht an die Geschwindigkeit von Arduino 1.0.6 heran. Auch spielen mit den Prioritäten zwischen WebServer- und SD-Task brachte keine Ergebnisse. Bin da erstmal mit meinem Latein am Ende…

Es gibt ein neues Arduino Release:

WiFi & SD-Kartenprobleme sind behoben, es kompiliert Alles fein.
Der Wifi-Durchsatz ist aber immer noch unterirdisch:

2.0.3:

ESP-IDF version: v4.4.1-1-gb8050b365e
3956316 bytes in 27169 ms (145 kB/s)
6346838 bytes in 34402 ms (184 kB/s)

2.0.3 mit WiFi.useStaticBuffers(true):

3956316 bytes in 24857 ms (159 kB/s)
6346838 bytes in 32772 ms (193 kB/s)

Unsere aktuelle Version 1.0.6:

ESP-IDF version: v3.3.5-1-g85c43024c
3956316 bytes in 16301 ms (242 kB/s)
6346838 bytes in 26726 ms (237 kB/s)

Also keine Verbesserungen :frowning:

Ich habe mal das aktuelle Arduino Release 2.0.4 getestet und komme bei gleichen Testbedingungen wie zuvor auf sehr gute Web-Upload Raten:

Arduino 2.0.4 (PlatformIO Package 5.1.0):

ESP-IDF version: v4.4.1-472-gc9140caf8c
3956316 bytes in 10521 ms (376 kiB/s)
2557616 bytes in 7253 ms (352 kiB/s)
6346838 bytes in 16536 ms (383 kiB/s)

In Platform.ini dies eintragen:

[env]
platform = espressif32@<=5.1.0
;platform = espressif32@<=3.5.0

Die Bremse aus den letzten 2.x Releases scheint raus zu sein. Ich komme jetzt auch auf etwas höhere Upload-Raten als 1.0.6. Mit WiFi.useStaticBuffers(true); habe ich sogar über 400kB/s erreicht.

Kann jemand die verbesserte WiFi-Performance bestätigen?

3 „Gefällt mir“