Umstieg auf ESP32-Arduino 2.x

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“

Ja, kann ich auch bestätigen. Habe es heute mal getestet. Bin aber noch in verschiedene andere Probleme gelaufen.
Werde in Kürze mal einen neuen Branch (für ESP32-Arduino2) hier eröffnen, auf dem man die Tests dann mal machen kann, nachdem ich (hoffentlich) die größten Probleme ausgemerzt habe.

1 „Gefällt mir“

Nachdem in den letzten Tagen PIO nicht richrig funktionierte konnte ich jetzt mal ein wenig Testen. Dabei treten mit letzten Release Arduino 2.0.4 / PIO-package 5.1.1 noch diese Probleme auf:

  • Wifi verbindet sich nur jedes 2.Mal im STA Modus (geht im anderen Fall auf AP-Modus)
  • In der playlistcache-Datei fehlt der führende Slash im Dateinamen und die Playlist kann nicht abgespielt werden.

Einen Workaround für das Wifi-Verbindungsproblem habe ich auf beiden Versionen 1.0.6 und 2.0.4 getestet und das klappt jetzt zuverlässig (Wlan.cpp ab Zeile 80):

        // Try to join local WiFi. If not successful, an access-point is opened
        WiFi.begin(_ssid, _pwd);

        uint8_t tryCount = 0;
        while (WiFi.status() != WL_CONNECTED && tryCount <= 20) {
            delay(500);
            Serial.print(F("."));
            tryCount++;
            wifiCheckLastTimestamp = millis();
            if (tryCount == 10 && WiFi.status() != WL_CONNECTED) {
                Serial.println("Wifi cannot connect within 5 seconds, try again..");
                WiFi.disconnect(true, true);
                WiFi.begin(_ssid, _pwd); // ESP32-workaround (otherwise WiFi-connection sometimes fails)
            }
        }

Keine große Änderung, ESPuino versucht sich 5 Sekunden lang zu verbinden, wenn das nicht klappt wird genau einmal Wifi.disconnect() aufgerufen und dann wird es nochmal 5 Sek. probiert. Damit verbindet sich mein Board zuverlässig. Problem und Workaround ist hier beschrieben. Evt. kann @biologist den Fix in den master übernehmen?

Zum fehlenden Slash im Dateinamen muss ich noch tiefer buddeln…

Ok, ich nehme das mal in meinen neuen Branch auf (den ich noch hochladen muss).
Mit dem fehlenden Slash weiß ich auch noch nicht genau, an welcher Stelle man das am sinnigsten fixt.

Schon echt lästig, dass die das mit dem WLAN-Connect nicht in den Griff kriegen.

Ja komisch, Wifi ist doch elementar für dieses Board. In einem Release sind die Probleme weg, im nächsten wieder da. Ich sehe auch nicht was wir hier bei der Verbindungsherstellung falsch/anders machen.
Bei einem Hardware Reset würde ich erwarten das sich der Chip immer gleich verhält und die Verbindung aufbaut. Naja es gibt da noch einige Baustellen…

Mit meinem letzten Commit haben wir (aus meiner Sicht) eine erste Fassung, die auf ESP32-Arduino augenscheinlich ordentlich lauffähig ist. Wer das mal testen möchte:

  • Zeile 16 auskommentieren
  • Zeile 17 einkommentieren
  • Zeile 42 auskommentieren

Anschließend neu kompilieren und hochladen.

Mir bekannte Probleme:
a) Man hört man ein Knacken auf dem Lautsprecher, wenn eine Kopfhörerplatine mit MS6324 angeschlossen ist. Allerdings nur, wenn man von SD abspielt. Das hoffe ich in den Griff zu kriegen, da von diesen Kopfhörerplatinen mehrere Dutzend im Umlauf sind und ich zudem weitere Chips davon bestellt habe :frowning:.
b) Der Effekt der flackernden LEDs scheint sich noch zu verstärken. Abhilfe schafft hier, wie von @compactflash vorgeschlagen, den Core von 0 auf 1 zu ändern, auf dem der Task des Neopixels läuft:

1 „Gefällt mir“

Moin,
mir ist noch ein Bug in 2.x aufgefallen: Der FTPServer klappt noch nicht, es wird das erste Zeichen abschnitten. Es muss an einigen Stellen noch file.name() durch file.path() ersetzt werden.
Ich könnte das fixen und @biologist einen PR zusenden?

Übrigens habe ich mal das offizielle SD_MMC Demo auf beiden Versionen 1.06 und 2.0.4 getestet: Die SD-MMC Ansteuerung ist jetzt doppelt so schnell lesen wie schreiben! Die Karte wird jetzt mit 40MHZ getaktet (vorher 20MHZ): Das würde auch den etwas schnelleren Web-Upload erklären. Evt. wird dann auch der FTP-Upload schneller…

Arduino 2.0.4 (PIO 5.1.1):
1048576 bytes read for 330 ms
1048576 bytes written for 481 ms

1048576 bytes read for 331 ms
1048576 bytes written for 486 ms

1048576 bytes read for 327 ms
1048576 bytes written for 478 ms


Arduino 1.0.6 (PIO 3.5):
1048576 bytes read for 866 ms
1048576 bytes written for 1980 ms

1048576 bytes read for 876 ms
1048576 bytes written for 2011 ms

Sehr gerne. Im Prinzip habe ich so ganz tief im Hinterkopf, dass man die FTP-Lib auch mal umstellen könnte auf das Ringbuffer-Verfahren des Webupload. Aber ich bin mir gar nicht sicher, ob allzu viele Leute FTP überhaupt verwenden. Ich selbst, und ich mag FTP ja echt, habe es selbst bei ESPuino schon lange nicht mehr benutzt :slight_smile:.

Was mir mit Arduino2 noch aufgefallen ist: Es werden vom Port-Expander manchmal Button-Aktionen ausgelöst, die gar nicht stattgefunden haben.

Hi @tueddy
Könntest du bitte mal für Dummies beschreiben wie man auf 5.1.1 umstellt . Mein erster Versuch vergangene Woche war gescheitert und das Board hat nicht mehr gebootet und ich mußte erase flash machen. Danach das Problem mit WDR2 , was mich viel Zeit gekostet hat und ich kein Lust mehr auf weitere Versuch hatte. Es müßte doch reichen den Eintrag in platformio zu ändern plus die 2 Zeilen von Wolle , oder? Oder muss es in VScode in ptlatforms/embedded grundsätzlich geädert werden ?
VG

Edit: nehme meine Anfrage zurück @biologist hat es ja weiter oben schon beschrieben

Ich habe noch einen kleinen unschönen Effekt entdeckt , der kaum auffällt. Wenn man mittels Rotary die Laustärke verstellt flackern zwischendurch kurz die Leds der Fortschrittsanzeige auf. Das sieht man nur wenn bei Fortschrittsanzeige mehr Leds leuchten als bei der Anzeige der Lautstärke . Am besten testen wenn so 20 Leds bei Fortschritt leuchten und dann nur während geringer Lautstärke am Rotary drehen. Der Effekt ist auch bei Core 0 aber häufiger bei Core 1 , es sieht für mich so aus als wäre die Led Task zu schnell .

Das ist mir auch schon aufgefallen. Das ist vielleicht aber eine Falschbehandlung im Code.

PR für FTPServer ist raus, man kann jetzt auch mit 2.x per FTP hochladen. Die Performance ist aber nicht so dolle. Der Webupload ist mittlerweile viel besseroptimiert. Ehrlich, ich habe FTP auch seit Ewigkeiten nicht mehr verwendet…

1 „Gefällt mir“

Zwei Sachen sind mir jetzt noch aufgefallen in diesem Branch:

  1. LPCD funktioniert insofern nicht, als dass der ESP32 sofort wieder aufwacht. Das gilt mindestens für den Fall, dass PN5180.IRQ am Port-Expander hängt.
  2. Ab und an werden Button-Events geworfen, obwohl keine Taste gedrückt wurde. Laut @tueddy kommen mit dem nächsten Release wohl noch ein paar Änderungen an I2C. Ggf. erledigt sich das von selbst.

Arduino 2.0.5 wurde gestern Abend veröffentlicht. Ich warte noch auf das neue PIO package für einen weiteren Test.

Das PlatformIO Package 5.2.0 ist jetzt verfügbar und bringt Arduino 2.0.5, ESP-IDF 4.4.2 und Unterstützung für den Lolin S3…
Das Update ist in PIO über Platform/Update verfügbar,.in platform.ini diese Zeile ändern:

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

Alles kompiliert fein, aber ich konnte jetzt @biologist Probleme nachvollziehen, mit der 2.x werden auf dem Portexpander sporadisch falsche Kommandos signalisiert, bei mir meist „Kommando Pause“. Das Einzige was sich dazu finden lässt:

TwoWire(1) broken in 2.0.1 and later? · Issue #6966 · espressif/arduino-esp32 · GitHub

Bin jetzt nicht so drin im Portexpander Code. Der verwendet

extern TwoWire i2cBusTwo;

Ist der I2C Bus 2? Ist es möglich den anderen Bus zu verwenden um dieses Problem zu umgehen und das sowohl für 1.0.6 als auch 2.x zu compilieren?

@biologist kannst Du den Thread-Titel ändern in „Umstieg auf Ardiuino 2.x“?

Hab’s umbenannt.
Nun, das Ding heißt nur Two, weil für den A1S die erste Instanz verwendet wird. Weil der A1S hat ja einen es8388 und für den braucht man i2c. Wenn du aber den A1S nicht verwendest, dann wird die gar nicht instanziert.

Ich muss mich mal dransetzen und das mal ne Runde debuggen. Vielleicht finde ich ja auf dem Wege auch Fehler. Pause hat es bei mir nie ausgelöst, eher Multi-Button-Aktionen. Wirklich Aktionen hat es bei mir nicht ausgelöst, aber ich habe halt immer den Neopixel blinken sehen.