Last Updated on 4. April 2024 by sfambach
Der ESP32 ist der Nachfolger des erfolgreichen ESP8266 Controllers. Er besitzt eine 32Bit Tensilica Xtensa LX6 CPU in der Regel mit zwei Kernen (RISC Architektur). Hier sammle ich für mich interessante Informationen.
Anwendungsgebiete
- Haushaltsanwendungen
- Hausautomation
- Smarte Steckdosen und Licht Steuerung
- WLAN Steuerung
- Babyphone
- IP Kameras
- Sensor Networks
- Wearables
- Bloototh Applikationen wie Kopfhörer/Lautsprecher …
Dokumentation
https://www.espressif.com/en/products/hardware/esp32/overview
https://github.com/espressif/arduino-esp32
Hardware
Verpackung
Den ESP32 gibt es als Chip oder Modul mit zusätzlichen externen Speicher, Antennen u.ä.
Welche Versionen es aktuell gibt ist der Espressif Bestellinformation zu entnehmen. Hier der Link zu ihr:
Bezeichnung
Jeder ESP kommt mit einer Beschriftung. Die Einzelenen Chips sind mit einem Code versehen. Hier ein Beispiel:
Bei den Modulen ist der Aufdruck eher nur ein Verweis aufs jeweilige Datenblatt oder die Bestellinformationen.
Auch gibt es die Chips und Module in unterschiedlichen Versionen, die sich zusätzlich voneinander unterscheiden können.
Innenleben
Das folgende Schaubild zeigt die Architektur des Controllers.
Neben diversen Schnittstellen besitzt er:
- WLan
- Bluetooth
- Einen Temperatursensor
- Crypto Routinen
Speicher
Der ESP kommt mit unterschiedlichen Speicher Konfigurationen daher, hier ein kurzer Überblick welche Kombinationen aktuell möglich sind. Um welche Konfiguration es sich handelt kann dem jeweiligen Datenblatt oder der Bestellinformation entnommen werden.
RAM
Der Ur-Esp32 hat ein 520KB internen Speicher aber auch die Möglichkeit diesen extern zu erweitern. Aktuell wird als externe Erweiterung nur PSRAM unterstützt. Es ist möglich den Speicher auf bis zu 8MB zu erweitern wobei aktuell nur 4 MB gleichzeitig adressiert werden können.
Flash
Je nach Konfiguration kommt der ESP im Chipformat mit 0 ,2 oder 4 MB internen FLASH. Bei den Modulen kann der FLASH extern im Modul verbaut sein. Der Ur-ESP kann maximal 16 MB Flashspeicher adressieren. Jenachdem wie der Flash Speicher gemappt ist und welche Art verwendet wird, kann unterschiedlich viel davon verwaltet werden.
- QSPI Flash
- Beim Mapping als Instuctions Speicher, können bis zu 11MB + 248KB adressiert werden. Bei mehr als 3 MB + 248 KB wird der Zugriff inperformant.
- Beim Mapping als exklusiv lesen Datenspeicher können maximal 4MB adressiert werden.
- Externer SRam can als CPU Datenspeicher gemappt weden und es werden bis zu 8MB unterstützt. Es können aber nur auf 4MB gleichzeitig zugegriffen werden. (Beispiel OTA 2x 4MB Nutzbar)
ROM
Der UR-ESP hat 448 KB ROM. Sie beinhalten laut Espressif Forum spezielle interne Funktionen und zum Beispiel den Bluetooth Stack. Der extern nutzbare Funktionsumfang kann git entnommen werden:
https://github.com/espressif/esp-idf/tree/master/components/esp32/include/rom
UART 1,2,3
Der Esp32 besitzt 3 UART Schnittstellen, die von einander unabhängig konfiguriert werden können. Die Maximalgeschwindigkeit beträgt 5Mbps Dies ermöglicht eine asysnchrone Kommunikation mit RS232, RS485 und IrDa unterstützung. Als Anschluss kann jeder GPIO Pin dienen. (Quelle: Espressif ESP32Datenblatt Seite 28, 31)
Pinbelegung per default:
UART | RX IO | TX IO | CTS | RTS |
---|---|---|---|---|
UART0 | GPIO3 | GPIO1 | N/A | N/A |
UART1 | GPIO9 | GPIO10 | GPIO6 | GPIO11 |
UART2 | GPIO16 | GPIO17 | GPIO8 | GPIO7 |
In der Arduino Gui sind folgende Einstellungen:
- Serial – Uart0 GPIO 1/3
- Serial1 – Uart 1, GPIO 9/10 meist schon mit Flash Speicher belegt
- Serial2 – Uart 2 GPIO 16/17
Die Ansteuerung ist in allen gängigen Frameworks wie Arduino IDE, Espressif, Micropython… enthalten.
I²C Wire Bus
Der ESP32 hat zwei Wire Busse. Für den Anschluss kann jeder GPIO Pin gewählt werden. Er kann mit einer Geschwindigkeit von 100Kbit’s (Standard Mode), 400Kbit’s (Fast Mode) bis hin zu 5 MHz arbeiten. Die beiden Busse beherrschen 7bit und 10 Bit Addressierung. (Quelle: Espressif ESP32 Datenblatt Seite 28,31)
Die Ansteuerung ist in allen gängigen Frameworks wie Arduino IDE, Espressif, Micropython… enthalten.
ADC’s
Der ESP32 besitzt zwei getrennt ADC 12Bit Register mit insgesamt 18 Kanälen. Durch die 12 Bit ergibt sich eine Messspanne von 0 bis 4095.
ADC1 hat 8 Kanäle, diese sind an den GPIOs 32-39 Verfügbar.
ADC2 besitzt 10 Kanäle und ist mit den GPIOs 0, 2, 4, 12 – 15 und 25 – 27 verbunden. Weiterhin ist der ADC2 nicht nutzbar wenn WIFI verwendet wird.
GPIO | ADC | Kanal | Anmerkung |
---|---|---|---|
36 | 1 | 0 | |
37 | 1 | 1 | |
38 | 1 | 2 | |
39 | 1 | 3 | |
32 | 1 | 4 | |
33 | 1 | 5 | |
34 | 1 | 6 | |
35 | 1 | 7 | |
4 | 2 | 0 | |
0 | 2 | 1 | Meist mit Bootoptionen belegt |
2 | 2 | 2 | |
15 | 2 | 3 | |
13 | 2 | 4 | |
12 | 2 | 5 | |
14 | 2 | 6 | |
27 | 2 | 7 | |
25 | 2 | 8 | |
24 | 2 | 9 |
Weitere Informationen sind dem unten gelinkten Artikel von Espressif zu entnehmen.
Programmierumgebung
Arduino Gui
Platformio
Espressif IDF
VS-Code für Espressif IDF
Spannung am ESP Abfragen
Der ESP 8266 hat noch die Möglichkeit die Spannung zu messen. Beim ESP32 beötigt man eine Hilfsschaltung, ein Spannungsteiler mit 100kOhm und 10kOhm am ADC.
Mehr infos gibts in dem gelinkten Beitrag:
https://www.arduinoforum.de/arduino-Thread-ESP32-Batteriestatus
Formel zur Berechnung der Spannung:
Uin = (100 + 10) / 10 ((R1 + R2) /R2)
https://www.arduinoforum.de/arduino-Thread-ESP32-Batteriestatus
Sofware Tipps
Hardware Daten auslesen
Die Datei esp.h/Klasse ESP bietet Zugriff auf einige Informationen der Hardware. Wie Id, Versionen, freier Speicher usw.. Der komplette Funktionsumfang kann in Githup eingesehen werden.
https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/Esp.h
Eingebunden werden muss die Esp.h meist nicht diese ist bei den Standardbibliotheken mit dabei. (Danke für den Hinweis an Andreas, siehe Kommentar) . Folgend ein paar Beispiele aus der Datei.
Neustart auslösen
Eine Funktion ist das Neustarten des ESPs. Dies kann nach einem remote Update der Firmware nötig sein oder bei schlampiger Programmierung wenn der Speicher voll ist ;).
ESP.restart();
Speicher Informationen abfragen
Gerade für das Debuggen sind Speicherinfomationen ganz nützlich. Zum Beispiel kann hieran erkannt werden, ob verwendeter Speicher auch wieder frei gegeben wird. Die folgenden können hierfür aufgerufen werden:
Heap/SPI Speicher Größe
uint32_t var = ESP.getHeapSize();
uint32_t var2 = ESP.getPsramSize();
Freier Heap/PS Speicher
uint32_t var1 = ESP.getFreeHeap();
uint32_t var2 = ESP.getFreePsram();
Minimalwert des Heap/SPI Speichers seit Controller start.
uint32_t var1 = ESP.getMinFreeHeap();
uint32_t var2 = ESP.getMinFreePsram();
Maximale Blockgröße des Heap/SPI Speichers
uint32_t var1 = ESP.getMaxAllocHeap();
uint32_t var2 = ESP.getMaxAllocPsram();
Basic OTA
OTA – Over The Air – Protokolle ermöglichen es Microcontroller über das Netzwerk zu flashen. Da der ESP32 über WLAN verfügt ist ein flashen über das Netz möglich. Die ausführliche Anleitung kann unter folgenden Link gefunden werden:
Im Grunde ist das Vorgehen wie folgt:
- Python installieren
- Beispiel Project Basic OTA auswählen
- WLan Daten eingeben
- OTA Firmware flashen
- OTA teil in eigenen Code einbauen und immer über das Netzwerk flashen
Probleme
WiFi Verbindet sich nur jedes 2. Mal
Wie folgt die Verbindung starten:
WiFi.disconnect();
WiFi.mode(WIFI_STA); // kann auch ein anderer Mode sein
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(SSID, PASSWORD);
delay(1000);
}
Speicher Voll / zu Klein
Gerade bei Graphiken oder bei der Bluetooth Biliothek gerät man schnell mal an die Grenzen des verfügbaren Programmspeichers.
Ein gutes Einführungvideo gibts von Andreas Spiess:
Youtube Andreas Spiess – More Memory for the ESP32 …
Im Grunde geht es darum die Speicherzuordnung richtig einzustellen. Um mehr Speicher für die Applikationen zu bekommen, kann OTA ausgeschaltet oder der SPIFFS Speicher vermindert werden.
Arduino Gui
In der Arduino Gui sind die einstellungen im Menü Werkzeuge zu finden.
Wer zusätzliche Optionen braucht, kann diese in der Konfiguration XML hinzufügen.
Espressif-IDF
In der Espressiv-IDF können die Einstellungen über die Menuconfig und über eine eigene Partitionstabelle vorgenommen werden.
Verwandte Beiträge
Quellen
https://en.wikipedia.org/wiki/ESP32
https://www.espressif.com/en/products/hardware/esp32/overview
https://github.com/espressif/arduino-esp32
Youtube Andreas Spiess – More Memory for the ESP32 …
https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
Bitte um Überprüfung , das macht so keinen rechten Sinn.
QSPI Flash
Beim Mapping als Instuctions Speicher, können bis zu 11MB + 248KB adressiert werden. Bei mehr als 3 MB + 248 KB wird der Zugriff inperformant.
MfG Mike
Hi Mike
ist aus dem Datenblatt des ESP32:
https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
Seite 26, wenn ich etwas falsch verstanden habe bitte korrgieren.
3.1.3 External Flash and RAM ESP32 supports multiple external QSPI flash and external RAM (SRAM) chips.
More details can be found in ESP32 Technical Reference Manual > Chapter SPI Controller. ESP32 also supports hardware
encryption/decryption based on AES to protect developers’ programs and data in flash.
ESP32 can access the external QSPI flash and SRAM through high-speed caches.
• Up to 16 MB of external flash can be mapped into CPU instruction memory space and read-only memory
space simultaneously.
– When external flash is mapped into CPU instruction memory space, up to 11 MB + 248 KB can be
mapped at a time. Note that if more than 3 MB + 248 KB are mapped, cache performance will be
reduced due to speculative reads by the CPU.
– When external flash is mapped into read-only data memory space, up to 4 MB can be mapped at a
time. 8-bit, 16-bit and 32-bit reads are supported.
• External RAM can be mapped into CPU data memory space. SRAM up to 8 MB is supported and up to 4
MB can be mapped at a time. 8-bit, 16-bit and 32-bit reads and writes are supported.
Schande über mein Haupt diese Quelle hatte gefehlt im Beitrag ich habe sie jetzt hinzugefügt.
Gruß
Stefan
hallo stefan!
danke für die so informativ gestaltete seite. vielleicht kannst du mir weiterhelfen?
ich nutze die esp32 cam für eine türsprechanlage und habe das problem, dass sich die kamera nach ein paar tagen nicht mehr abrufen lässt (http://http://192.168.X.X/capture). über den resetbutton ist das problem behoben. was aber nicht die lösung ist. gibt es einen http-befehl mit der ein solcher reset ausgelöst werden kann? bei mir läuft alles über den iobroker, mit welchem solche befehle via script jederzeit absetzbar sind.
sg tom
Hi Tom,
danke für deinen Beitrag. Einen Befehl per HTML der den ESP.restart() aufruft gibt es soweit ich weiss nicht. Allerdings sollte es möglich sein in der ESP cam den Befehl im bestehenden Format zu implementieren.
in der Datei app_httpd.cpp des Cam Webservers ab ca Zeile 491 (If Kaskade) einen weitere If Bedingung eintragen:
else if (!strcmp(variable, „reset“)) { ESP.restart();}
und dann per http mit
http:///control?var=reset&val=1
aufrufen. So sollte es theoretisch gehen, ausprobiert habe ichs nicht 😉
Mehr zur ESP Cam hier: https://www.fambach.net/esp32-cam-modul/
Hi
Löte mal einen 220…470µF Elko an die 3,3V gegen GND.
Oft bricht die 3,3V ein.
hi joe!
vielen dank für den tipp. wenn ich wiedermal die kamera abmontieren muss, werde ich den elko anlöten. zur zeit überwache ich die fixe ip von der kamera. wenn sie im netzwerk nicht mehr auftaucht, wird deren stromversorgung 10 sec. unterbrochen. das ist in dem fall die einfachste und schnellste lösung.
Hallo Stefan
danke für die interessanten Hinweise.
Zuerst habe ich Esp.h in die library eingebunden und auf dem Sketch mit #include gestartet.
Die diversen Hardware-Infos konnten angezeigt werden.
Als ich dann den include auskommentierte, kam die Anzeige gleichwohl. Wie kann ich mir das erklären?
2. Frage: du hast die Anweisung „ESP.restart()“ so prominent dargestell; es funktioniert aber ich kann mir keine sinnvolle Anwendung vorstellen. Wann braucht man das?
Andreas
Hallo Anreas,
vielen Dank für deinen Kommentar. Die Esp.h ist per default bei den Boardtreibern mit dabei, diese muss nicht extra eingebunden werden. Ich habe sie nur aufgelistet weil man in Git so die Funktionalitäten finden kann die sie bietet.
Zur zentralen Darstellung muss ich zu meinder Schande gestehen, dass ich die Seite eröffnet habe um hier mehrere nützliche Informationen zu sammeln, leider ist es dabei geblieben :(. Auch weil dauernd neue Boards raus kommen die alle mal testen möchte.
Wichtig finde ich die Funktion zum Beispiel für:
Gruß Stefan
P.S. Habe den Beitrag diesbezüglich erweitert.
Hallo Stefan, danke für Deinen sorgfältig gestalteten und informativen Blog.
Als erstes einen kurzen Hinweis auf einen Tippfehler ;-).
Überschrift „Sofware Tips“ soll bestimmt „Software Tipps“ bedeuten.
Dann war ich enttäuscht, dass Du dich noch nicht mit einer besseren, als der Arduino IDE befast hast. Für mich, als lang jähriger (> 40 Jahre) Elektronik und Software Entwickler, ist diese IDE nur ein Graus.
Versuche die Arduino Umgebung in professionellere Tools einzubinden waren bisher mit einigen Hürden verbunden und nicht wirklich erfolgreich.
Hast Du sich schon einmal mit der neuen Eclipse 2019 befasst? Hier hat der Umgang mit mehren Projekten so seine Tücken.
M.f.G. Manfred
Hallo Manfred,
danke für deinen Kommentar und den Tipp ;)(habe es geändert).
Es stimmt die Arduino IDE ist wirklich nur was für einfache Anwendungen. Da ich aber immer nur sporadisch dazu kommen reicht das aktuell aus. Der Vorteil von ihr ist, sie funktioniert auch nach Updates. Ich habe Sloeber für Eclipse ausprobiert, das Plugin ist eigentlich genial, hat bei mir aber immer wieder zu Fehlern bei der Auflösung der Bibliotheken geführt. Eine Weile habe ich auch mit PlatformIO gearbeitet, diese IDE ist auch recht ordentlich, bis durch Updates nichts mehr funktionierte. Eclipse 2019 habe ich noch nicht probiert das wäre wahrscheinlich mal was für den nächsten Urlaub 🙂
Gruß
Stefan