Basteln mit dem ESP32
von Matthias, DD7NT
Sei es bei einem CW-Keyer für einen selbstgebauten QRP-Transceiver oder bei kleinen Geräten zum Messen, zur Stationsüberwachung oder zur Steuerung von Stationsgeräten – man kommt um die Verwendung von Mikroprozessoren kaum herum.
Links im Bild befinden sich die Prozessoren der ATMEL-Familie. DIe Prozessoren der ATTiny- und ATMega-Reihe wie auch die Prozessoren der PIC-Familie kommen von der US-Fima Atmel (heute Microchip AVR). Sie sind im Hobbybereich weit verbreitet.
Merkmale: (8 Bit RISC Prozessor, Taktrate zwischen 8 und 20 MHz, Flashspeicher für das Programm zwischen 2 kB und 256 Kb, RAM zwischen 512 Byte bis 16 kB). Im Bild vertreten sind von links nach rechts der ATtiny13, der ATmega48, der ATmega8, der ATmega32 und bereits in einer Baugruppe der ATmega328.
Rechts ist ein ESP32-WROOM-32UE zu sehen. Die ESP32 gibt es seit 2016. Der Prozessor wurde von der chinesischen Firma Espressif entwickelt. Es ist ein 32-Bit-Prozessor mit 40-240 MHz Takt, bis zu 520 kB RAM. Der Flashspeicher ist extern auf der Prozessorplatine untergebracht. Typisch sind 4 MB Flash. Espressif fertigt die Prozessoren nicht selbst. Prozessoren und bestückte Boards kommen von verschiedenen Firmen. Dadurch gibt es Unterschiede in der Ausstattung und der Pinbelegung.
Beide Prozessorreihen haben eine weite Anwendungbreite und „können“ UART/RS232, SPI, I2C, ADC u.a.. Der ESP32 eröffnet durch die Fülle an Speicher für Programm und Abarbeitung, durch den schnellen Takt, den vergleichsweise riesigen Flashspeicher und die 4-fache Verarbeitungsbreite gegenüber den ATMEL-Prozessoren neue Möglichkeiten für unsere Hobbyprojekte . Das verdeutlicht bereits das Blockbild der Teilsysteme des ESP32.
Ich habe mich bei zwei laufenden Bauvorhaben entschieden, mit ESP32-Boards zu arbeiten:
- Überarbeitung der „Zentralsteuerung“ für meine Funkstation. /1/ Hier geht es darum die auf 5 Prozessoren (ATmega8, ATmega328 und 3 x ATtiny13) und 3 Gehäuse verteilte Steuerung kompakter auf einem Prozessor und in einem Gehäuse unterzubringen. Dadurch soll der Kabelwust hinter den Geräten deutlich verringert werden. Ein weiterer Transceiver soll in die Steuerung eingebunden werden.
- Bau einer Rotorsteuerung: Für die Kurzwelle wird bereits eine ARCO-Rotorsteuerung eingesetzt. Die für den Sächsischen Bergwettbewerb im „Talfunk“ benutzte UKW-Antenne wird derzeit noch per Hand positioniert. Künftig soll das mit einem älteren Rotor passieren, zu dem kein Steuergerät vorhanden war. Hier möchte ich vor allem die drahtlose Übertragung von Daten mit dem integrierten Funkmodul des ESP32 nutzen.
Natürlich spielt auch die Neugier eine Rolle. Was kann der ESP32 und wie arbeitet man damit?
Programmieren mit Arduino
Für die Programmierung der ATMEL-Prozessoren habe ich bisher das ATMEL-Studio /Microchip Studio von AVR benutzt. Für den ESP32 kann man zwischen Arduino, Visual Studio oder Espressif IDF wählen. Ich habe mich für die Arduino IDE entschieden. Ich benutze sie in der Version 2.3.2 unter Windows 11. Nach kurzer Einarbeitungszeit komme ich mit der Arduino IDE gut zurecht und sie bereitet keine Probleme. Gegenüber der „alten“ Arbeitsweise gibt es eine Menge Vorteile:
- Durch den vergleichsweise riesigen Flashspeicher des ESP32 fallen auch umfangreiche Bibliotheken weniger ins Gewicht, so dass man sich voll und ganz seiner speziellen Anwendung widmen kann. Man wundert sich zunächst, dass mit dem ersten winzigen Beispielprogramm bereits 6 % des Flashspeichers verbraucht sein sollen. Als ich alle Funktionen der alten „Zentralsteuerung“ auf dem ESP32 übertragen hatte, waren es erst 25 %. DIe anfäglich belegten 6 % ergeben sich offenbar durch das Laufzeitsystem der Arduino IDE für den ESP32.
- Ein „Programmer“ wird nicht mehr benötigt. Arduino Boards werden per USB-Schnittstelle programmiert. Wenn keine Fehler vorliegen überträgt die Arduino IDE den bei der Übersetzung erzeugten Code per USB-Schnittstelle in den Flashspeicher des Prozessors.
- Für die Programmierung gibt es zahllose Beispielle und eine Unmenge an Bibliotheken. Um hier das Passende für eine bestimmte Aufgabe zu finden, braucht man etwas Zeit. Es geht aber deutlich schneller, als wenn man alles selbst programmiert.
- Fehlersuche: Debugging ist ein wichtiges Thema. Kaum ein Programm läuft nach dem Erstellen exakt so, wie man es sich vorgestellt hat. Ein paar Fehler hat man immer eingebaut. Bei den kleineren ATMEL-Prozessoren war die Fehlersuche schwierig. Beim ESP32 kann man in den Programmcode von Anfang an Protokollierungsanweisungen einbauen, um den Programmablauf mitzuverfolgen. Treten an einer Stelle Probleme auf, kann man die Protokollierung dort erweitern. Die Protokollierung wird per USB zur IDE übertragen und in einem separaten Fenster ausgegeben.
Die Makerindustrie
Wo die Programmierung stark vereinfacht ist und standardisierte Schnittstellen zum Anschluss von Peripherie vorhanden sind, ist es naheliegend, auch fertige Hardware für viele Aufgaben zu produzieren. Das spart Zeit und Lötzinn… Beispiele aus der Bastelkiste:
Um den Einstieg, das Basteln eigener Geräte jeder Art, zu erleichtern, findet sich am Markt ein großes Sortiment an Fertigplantinen. Es reicht vom Spannungsreglern über alle möglichen Sensoren, Displays, Schnittstellenadaptern, Port-Enhancern bis zu kompletten Subsystemen. In meiner Bastelkiste fanden sich u.a. ein 2 x 16 Zeichen-Display mit I2C-Ansteuerung. Die aufgelötete Platine für den I2C-Bus spart die sonst ziemlich umfangreiche Verkabelung des Displays und der Hintergrundbeleuchtung. Ebenfalls über I2C lassen sich der Port-Enhancer (unten Mitte) und der Kompasssensor (unten rechts) betreiben. Für die neue „Zentralsteuerung“ werden insgesamt 18 Relais zur Schaltung von Antennen, Audioquellen, Morsetasten, PA und Antennentuner benötigt. 16 der benötigten Anschlüsse davon werden von 2-Port-Enhancern bereitgestellt. Das hier abgebildete Modell ist mit seinen Anschlüssen und dem „Adressschalter“ wohl eher für das Steckbrett geeignet, als für den Aufbau auf einer Leiterplatte oder einer Lochrasterplatte. Mit etwas Mühe kann man es trotzdem verwenden.
Viel Spaß für wenig Geld
Die Konkurrenz der Hersteller von Boards und die Automatisierung der Fertigung sorgt für niedrige Preise.
Am preiswertesten kauft man bei Ali-Express. Die Preise deutscher Distributoren sind höher. Dafür hat man bei Problemen ein Rückgaberecht und kommt schnell an benötigte Bauteile. Einge Händler haben zu den angeboteten Bauteilen auch Hinweise, Hilfestelungen und Programmbeispiele auf ihren Webseiten. Ich habe bisher nichts zurücksenden müssen, die gelieferten Teile funktionierten.
Die Makerszene hilft…
Rund um die Arduino-Plattform und deren Möglichkeiten, damit zu experimentieren und zu bauen, hat sich eine unübersehbare und hilfsbereite Community formiert. Als Beispiel soll hier „Wolles Elektronikkiste“ /2/ von Wolfgang Ewald genannt werden. Das Beitragsverzeichnis der Webseite umfasst 112 gut aufbereitete Themen rund um den Arduino mit Programmcode und vielen Tipps.
Wolfgang Ewald hilf auch bei Fragen weiter.
Ärger beim Start mit ESP32 ?
Sehr viele Problemmeldungen beim ESP32 beziehen sich auf die Frage: Wie bekomme ich das erste kleine Beispielprogramm in den Prozessor? Ich habe daran bei 2 Prozessortypen auch einige Stunden lernen müssen. Worauf muss man achten:
- Welcher Treiber ist für die USB-Schnittstelle des ESP32 zu benutzen? Es ist bei den 240-MHz-Typen meist eine „CP120x USB to UART Bridge“ von Silicon Labs verbaut. Manche ESP-Prozessoren haben auch CH340-Chips. Der Treiber für „CP120x..“ ist bei Besitzern von neueren ICOM- oder Kenwood-Geräten schon installiert. Doch damit ging es nicht. Windows behauptet: dieser Treiber ist der neueste. Das mag wohl sein, aber es hilft nicht.
Abhilfe: Gerätemanager öffnen, Anschlüsse COM und LPT und unter „Ansicht“ → „Geräte nach Treiber“ einstellen. Auf den Port des Prozessors gehen und mit der rechten Maustaste „Gerät deinstallieren“. Jetzt ist der installiere „CP120x“-Treiber tatsächlich für alle Geräte weg. Nun durchstarten. Dabei nur den ESP32-Prozessor einstecken. Dann wird ein neuer Treiber geladen. Mit diesem lässt sich der Prozessor programmieren. Die Transceiver kommen mit diesem Treiber ebenfalls zurecht. Nur muss man, bevor die Arduino IDE vom Übersetzen zum Flashen übergeht, evtl. noch die Boot-Taste am Prozessor halten, bis der Flash beginnt. - Ein brauchbarer Treiber ist installiert, der USB-Port erscheint im Gerätemanager. Dennoch: In der Arduino-Auswahlliste fehlt er oder kann nicht benutzt werden.
Hier klärt man erstmal die Frage, ob der Prozessor überhaupt erkannt wird und welche Eigenschaften er hat.
Das kann man mit der „esptool.exe“ tun. Das Programm ist mit der Arduino IDE bereits installiert. Man findet es unter c:\users\\AppData\Local\Arduino…\packages
Vorher muss man schauen, welcher COM-Port beim Anstecken der ESP32 via USB-C-Kabel im Gerätemanager hinzukommt. Hier ist es z.B. „COM14“.
Ein Aufruf per Kommandozeile sieht dann z.B. so aus:
esptool_py\4.5.1\esptool.exe –chip esp32 –port „COM14“ –baud 11520 chip_id
Als Ergebnis erscheint:
esptool.py v4.5.1
Serial port COM14
Connecting….…
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
WARNING: Detected crystal freq 32.16MHz is quite different to normalized freq 26MHz. Unsupported crystal in use?
Crystal is 26MHz
Der „Normtakt“ des Quarzes sollte wohl 40 MHz sein. Stellt man in der Arduino IDE unter “Werkzeuge“, „CPU Frequency“ 26 MHz ein, kann der Prozessor problemlos geflasht werden. (Dieser Takt ist nicht die CPU-Geschwindigkeit. Die verschiedenen Subsysteme des ESP32 sind unterschiedlich getaktet. Hier geht es um den Takt beim Flashen.) - Das Programm ist in den Flashspeicher geladen, startet aber nicht ?
Der ESP32 führt zum Starten des Programms ein RESET durch. Dabei wird der EN-Pin heruntergezogen. Dieser Vorgang benötigt ein gewisses Zeitverhalten. Man kann hier helfen, indem man einen Elko zwischen EN und GND schaltet. Die Kapazität des Elkos muss ausprobiert werden. Bei mir half ein 2,2 µF Elko für einen störungsfreien sicheren Anlauf. Höhere Werte funktionierten nicht. Nach Einbau des Elkos kann meist auch das Drücken der Boot-Taste vor Beginn des Flash-Vorgangs entfallen. - Das Booten klemmt, nachdem man an RX2/TX2 ein UART-Modul angeschlossen hat?
Man muss sich mit der Stromversorgung des ESP32 vertraut machen. Es gibt drei Wege: per USB-Anschluss, über „Vin“ und über „3,3 V“. Nur ein Weg sollte jeweils benutzt werden. Für die Programmierung kann man den USB-Anschluss verwenden. Der kann in Grenzen die übrigen am Prozessor angeschlossenen Verbraucher mit versorgen. An „Vin“ kann man bis zu 12 V anschließen, der interne Regler regelt die Spannung auf die benötigten 3,3 V oder 2,2 V herunter. Bequem sind 5 V an Vin, dann können Teile wie Portenhancer-Relais und vieles andere damit ebenfalls versorgt werden.
Braucht man einen eigenen USB-UART Konverter sollte man man ihn über eine Schottky Diode (z.B. BS140) an „3,3 V“ anschließen.Der Konverter erhält dann vom Prozessor nur noch 3.1 V, aber das genügt für eine prozessorseitige Versorgung. Ist der Konverter an einen USB-Anschluss angeschlossen, wird er von diesem versorgt. Er würde dann ohne trennende Diode auch den ESP32 mit versorgen. Dies führt zu Problemen. - Am I2C-Bus sollen auch 5-V-Bausteine betrieben werden? Der ESP32 ist ein 3,3-V-Gerät. Wenn ein 5-V-Board mit 5 V Spannungsversorgung direkt an den I2C-Bus angeschlossen wird, werden auch die Pins der Ports 21 und 22 (I2C, SDA und SCL) auf 5 V gezogen. Das kann zu Problemen und Defekten führen oder gerade noch gut gehen. Am besten ist in solchen Fällen, von Anfang an einen Pegelumsetzer (Level Shifter) einzubauen.
Wenn es dann funktioniert…
Hat man es geschafft, das erste Beispielprogramm in den Speicher zu bekommen, wird man schnell Spaß am Arbeiten mit ESP32 und der Arduino IDE finden. Man sollte sich nun etwas Zeit lassen, um:
- die Arduino IDE und ihre Möglichkeiten kennenzulernen. Z.B. kann man den Punkt „Hilfe“ der Arduino IDE einmal gründlich in allen Unterpunkten durchforsten, um sich einen Überblick über die Möglichkeiten, die Grundfunktionen der IDE usf. zu verschaffen
- die für das eigene Projekt geeigneten Bibliotheken und Beispiele in Ruhe zu studieren, Der Bibliotheksverwalter listet die installierten und die verfügbaren Bibliotheken auf. Über den Link „Mehr Information“ kommt man an detailliertere Informationen über die jeweilige Bibliothek und ihre Funktion. Man kann auch in den Code der Bibliotheken schauen. Quelltexte dazu findet man z.B. unter
c:\Users<Username>\AppData\Local\Temp\arduino\sketches… - sich eine gut strukturierte Aufteilung seines Programms und seiner Bestandteile (Code, Initialisierungen, Konstanten usf. ) zu überlegen.
Eine gute Vorbereitung spart mehr Zeit als sie kostet! Viel Spaß und wenig Frust bei der Realisierung eurer Projekte!
/1/ https://funkamateure-dresden-ov-s06.de/zentralsteuerung-fuer-die-funkstation/