ESP32-2432S028 mit 2.8" Touchscreen (Cheap Yellow Display) Vorstellung
Das ESP32-2432S028-Modul, wie es offiziell heißt, ist ein Modul mit ESP32 Wroom-32 MCU auf der Rückseite und einem 2.8 Zoll Touchscreen auf der Vorderseite. Da der Name "ESP32-2432S028" ein wenig sperrig klingt, hat sich auch die Bezeichnung "Cheap Yellow Display", auf deutsch "billiges, gelbes Display" eingebürgert, kurz CYD. Ich werde es aber auch Touchscreen-ESP32 nennen, weil ich finde, man sollte den ESP32 nicht unterschlagen.
Das ist ein Wroom-32-SoC, wie wir ihn ja bereits kennen. Der ESP32 ist ein Mikrocontroller-Modul des chinesischen Herstellers Espressif, der einiges bietet. Er bringt WLAN, Bluetooth, genügend Speicher und Rechenpower auch für anspruchsvollere Projekte mit und er ist günstig.
Am sinnvollsten für mich ist es, fertige Entwicklungs-Boards zu kaufen, auf denen das SoC-Modul bereits eingelötet ist und das über Spannungswandler, seriellen Adapter und Header-Pins verfügt. Wie zum Beispiel den ESPDuino-32. In dem verlinkten Artikel findet ihr auch grundsätzliche Infos zum ESP-32 und wie man ihn programmiert. Dass geht dann ganz einfach mit einer IDE wie Arduino IDE oder VSCode mit PlatformIO.
Ich benutze ESP32-Boards schon eine ganze Weile und habe die verschiedenen ESP32-Boards hier auch schon mal vorgestellt und verglichen.
Wer noch keine Ahnung von ESP32-Boards hat, sollte sich oben erwähnten Boardvergleich und auch meinen Artikel über die ESP 32 Erst-Einrichtung zu Gemüte führen. Das Wissen daraus setze ich für diesen Artikel voraus.
Die Hardware - ein Komplettpaket für einen super Preis
Aber das ESP32-2432S028-Modul geht hier weiter: Es ist nicht nur ein Entwicklungsboard mit ESP-32, sondern es hat auf der Vorderseite gleichen ein Touchscreen verbaut. Der ist mit 2.8 Zoll, 320 x 200 Pixel und Farbe wirklich nicht schlecht ausgestaltet. Außerdem findet sich auf der Vorderseite noch ein Lichtsensor, ein Fotowiderstand (Mehr zu Foto-Widerständen in diesem Artikel).Der Touchscreen ist übrigens ein alter Bekannter, es ist auch in dem XPT2046 3.5 Zoll RPi Display TFT Touchscreen verbaut, dass ich an meinem Raspberry Pi benutze, dort allerdings in der Auflösung 480x320.
Es ist resistiv, nicht kapazitiv, dass heißt, es reagiert auf Druck und funktioniert nicht mit dem flachen Finger, sondern man muss eher den Fingernagel bemühen.
Auf der Unterseite findet man dann noch einen µSD-Karten-Slot, eine RGB-LED, einen Lautsprecheranschluss, Taster, drei vierpolige Mini-JST-Anschlüsse (mit jeweils 1.25 mm Pin-Abstand, PH_1.25_4P) und je nach Variante eine Micro-USB und eine USB-C-Buchse.
Damit hat man alles kompakt zusammen, was man für viele Projekte braucht:
- eine Eingabemöglichkeit: das Touchpad, auf dem man Buttons anklicken kann oder Dinge mit Dialogelementen einstellen, ja, bei dem man sogar eine kleine Touch-Tastatur zur Eingabe on Text einblenden könnte. Ein kleiner Eingabestift (eigentlich nur ein Stück Plastik) wird mitgeliefert.
- eine Ausgabemöglichkeit: der große Farbbildschirm auf der Vorderseite bietet reichlich Platz zur Anzeige von Informationen
- eine Speichermöglichkeit: auf der µSD-Karte kann man reichlich Daten speichern und wieder laden, etwa Protokolle
- eine Sound-Ausgabe: über einen angeschlossenen Speaker kann man Töne wiedergeben
- Anschlüsse für Peripherie: hier kann man über das mitgelieferte Kabel serielle oder I2C-Geräte anschließen.
Ein toller Preis, für den man sonst vielleicht nur ein Display bekäme. Das man dann über Dupont-Kabel verbinden müsste. Genauso ein SD-Card-Slot, das man zusätzlich kaufen müsste und so weiter.
Hier spart man sich jede Menge Arbeit, alles ist schon auf die Platine gelötet. Und die ist so kompakt es geht und man kann easy ein Gehäuse für den 3D-Drucker dafür designen. Wen das Thema 3D-Druck interessiert: auch dazu habe ich einige Artikel geschrieben.
Für IoT-Projekte ist der Touchscreen-ESP32 ideal, da der ESP32 ja auch über WiFi verfügt. Einfach den gewünschten Sensor anklemmen, das Ganze in ein Gehäuse und vor Ort an der Wand befestigen. Das Display zeigt die aktuellen Werte an, die SD-Karten protokolliert den Langzeitverlauf und über WLAN kann man die Werte auch aus der Ferne abrufen.
Einen kleinen Nachteil hat das Modul aber vielleicht: es ist nicht mehr so offen wie ein Entwicklungsboard ohne Alles. Die meisten GPIO-Pins sind schon vergeben und nur noch wenige frei. Es taugt also nichts für Projekte, bei denen man sehr viele freie Pins braucht. Aber da würde ich sowieso zu einem noch günstigeren Developerboard greifen.
Spezifikationen
- Resistiver 2.8 Zoll TFT-Touchscreen mit 320*240 Pixel und 65'000 Farben
- ILI9341 bzw. ST7789 Treiber
- Anzeigegröße effektiv: 43.2 x 57.6 mm
- Modulgröße: 50 x 86 mm
- Ablesewinkel größer 60 Grad
- Betriebstemperatur: -20 bis 70 °C
- Lagertemperatur: -30 bis 80 °C
- Stromverbrauch ca. 115 mA
- Gewicht ca. 50 g
Pinouts
Es gibt das ESP32-2432S028 in mehreren Revisions: eine ganz alte, bei denen das Board noch richtig satt gelb ist und neuere, bei denen das Board eher ein orange ist. Und es gibt eine neue Revision, die nicht nur einen Micro-USB-Port hat, sondern auch einen USB-C-Port. Beide Ports sind hier aber parallel geschaltet, es ist also egal, welchen Port man benutzt; man sollte nur nicht beide Port gleichzeitg benutzen.Die Boards sind sehr gut beschriftet, so dass man meist direkt auf der Platine sieht, welcher Pin welche Bedeutung hat. Trotzdem ist es schön, davon eine Dokumentation zu haben, ohne immer aufs Board schauen zu müssen.
Wir betrachten das Board von der Rückseite aus und zwar so, dass das ESP32-Modul und die schwarze Antenne nach rechts zeigt.
Dann ist an der Oberkante ein Anschluss namens "SPEAK" . Nicht schwer zu erraten, dass dies der Speaker-Anschluss, also der für einen Lautsprecher ist. Dieser sollte laut macsbug (1) 8 Ω haben und über einen 100 Ω Widerstand an (+) angeschlossen werden. Der Treiber ist ein TC8002D-Chip.
- TC8002D VO1: Audio-Signal
- TC8002D VO2: Audio-Signal
- TC8002D Ground, Masse
- TC8002D 3.3V Versorgungsspannung
- GPIO 26 liefert Signal für TC8002D
Oben links finden wir die serielle Schnittstelle ("Power supply base") mit:
- VIN (Spannungseingang, bitte nicht mehr als 3.3V)
- TX (Transmit, wird mit dem TX der Gegenseite verbunden, entspricht eigentlich RX auf dem Board)
- RX (Receive, wird mit dem RX der Gegenseite verbunden, entspricht eigentlich TX auf dem Board)
- GND (Ground, Masse)
So könnte man sein eigener GPS-Empfänger zur Anzeige der Geokoordinaten oder der sehr genauen GPS-Zeit bauen oder sogar sein eigenes Mobilfunk-Telefon.
Unten rechts findet man einen Anschluss, der auf dem Board als P3 bzw. "Extended IO" bezeichnet wird
- GND (Ground, Masse)
- IO35 (GPI Pin 35) (ja, 35, nicht 33, das sieht nur so aus wegen des Vias dort)
- IO22 (GPIO Pin 22, überschneidet sich mit Connector CN1)
- IO21 (GPIO Pin 21, überschneidet sich mit dem Pin für die Hintergrundbeleuchtung des TFT)
Links daneben findet man einen Anschluss, der auf dem Board als CN1 bzw. "Temperature and humidity interface" bezeichnet wird:
- GND (Ground, Masse)
- IO22 (GPIO Pin 22, überschneidet sich mit Connector P3)
- IO27 (GPIO Pin 27)
- 3.3V (Versorgungsspannung 3.3V, ca. 20 mA)
Direkt über dem Anschluss CN1 findet sich die RGB-LED, die mit "LED1" gekennzeichnet ist. Sie wird angesteuert mit:
- Rot mit GPIO 4
- Grün mit GPIO 16
- Blau mit GPIO 17
Weitere angeschlossene Geräte:
- Der Fotowiderstand auf der Vorderseite ist vom Typ GT36516 und hängt an GPIO Pin 34.
- Der SD-Karten-Slot hängt via SPI an den GPIO Pins 5 (CS), 23 (MOSI), 18 (CLK) und 19 (MISO).
- Der Flash-Speicher ist über GPIO 11 (SCS/CMD), 6 (SCK/CLK), 8 (SDI/SD1), 7 (SDO/SD0), 9 (SHD/SD2) und 10 (SWP/SD3) angebunden.
- Der Positionssensor im Touchscreen (XPT2046) hängt über SPI an GPIO 25 (CLK), 33 (CS), 32 (DIN/MOSI), 39 (OUT/MISO) und 36 (IRQ).
- Der TFT-Bildschirm ist über SPI an GPIO 14 (SCK), 2 (RS), 15 (CS), 13 (SDI/MOSI), 12 (SDO/MISO) angeschlossen. GPIO 21 steuert die LED der Hintergrundbeleuchtung.
Unterschiede in den Board-Versionen
Die Board-Revision 1 und 2, erkennbar daran, dass sie nur einen Micro-USB-Port haben, benutzen als Display ein ILI9341. Die Revision 3, die neben dem Micro-USB-Port auch noch einen USB-C-Port hat, benutzt als Display ein ST7789 (Mode 3). Die Displays sind jeweils über SPI angeschlossen, haben aber eine andere Byte-Reihenfolge und benötigen deshalb den jeweils richtigen Treiber / Library. Der Touch-Digitizer ist bei beiden dergleiche, nämlich der XPT2046.Wird die Revision 1 oder 2 mit einer Firmware für Revision 3 beschrieben, so passt der Treiber nicht und das Bild erscheint horizontal als auch vertikal gespiegelt. Da der Digitizer aber noch der gleiche ist, bleiben die Klickpositionen gleich und man klickt stets daneben.
Je nach Board-Revision muss also eine andere Display-Library eingebunden werden und eine eigene Firmware erstellt werden.
Die Board-Revision 1 ist noch mit einem 8-Pin seriellen Flash-Speicher auf U4 bestückt. Bei Rev. 2 und 3 fehlt dieser. Der U4-Flash benutzt den selben CS-Pin (Client Select) wie der interne Flash-Speicher und es kommt zu Problemen beim Flashen von Firmware auf den ESP32. Abhilfe hilft das Entlöten des Chips auf U4 neben der ESP32-Can.
Probleme mit schlechter Sound-Wiedergabe?
Laut HexeguitarDIY (2) sollen CYD-Exemplare, die vor 2023 verkauft worden sind, eine vereinfachte Schaltung mit nur zwei Widerständen R4 mit 4.7 kΩ (Aufschrift 472) und R9 mit 68 kΩ (Aufschrift 683) haben:statt der eigentlich nach Original Schaltplan zu verbauenden R4 mit 4.7 kΩ, R7 mit 47 kΩ, R8 mit 22 kΩ und R9 mit 68 kΩ:
Bei mir sind bei R7 und R8 Null-Ohm-Widerstände eingelötet, was nicht richtig ist und zu einem sehr unsauberen Sound führen soll, weil die untere Hälfte der Amplitude abgeschnitten wird. HexeguitarDIY schlägt vor (2), die Original-Werte wiederherzustellen und einen 56 kΩ parallel zu R9 einzulöten oder R9 durch einen Widerstand mit 33 kΩ bis 47 kΩ zu ersetzen, um einen sauberen Sound zu bekommen. Die Bauform der Widerstände ist SMD-Größe 0603, das Löten solch kleiner Bauteile ist nicht ganz trivial.
Sichern der Demo-Firmwares für später
Damit der Firmwares mit den Demo-Benutzeroberfläche nicht verloren gehen, bevor wir im nächsten Teil beginnen, diese mit unserer eigenen Software zu programmieren und zu überschreiben, möchte ich die beiden Firmwares, die auf meinen CYDs bereits drauf sind, als Datei sichern.Dazu müssen wir uns ein Tool von der Herstellerseite Espressiv besorgen, und zwar das esptool. Es kann aber auch gut sein, dass ihr das schon auf eurer Platte habt, weil ihr es mit der Arduino IDE oder der Platform IO mitinstalliert habt. Diese beiden IDEs benutzen das esptool ebenfalls zu Upload.
Bitte nicht verwechseln mit den Flash Download Tools von Espressiv. Das suggeriert zwar, man könnte die Firmware damit vom ESP-32 downloaden, in Wirklichkeit macht diese aber ein Upload und lädt Firmwares auf den ESP32 rauf. Einen Download (ESP32 zu Datei) bietet es gar nicht an.
Das esptool finden wir auf Github bei espressig/esptool/releases. Bei mir war gerade Version esptool-v4.7.0-win64.zip aktuell.
Das esptool ist ein Kommandozeilen-Tool und vielleicht nicht so wirklich intuitiv zu bedienen, darum hier eine Anleitung: Zu allererst solltet ihr euer CYD an den PC anstecken und herausfinden, welchen COM-Port er benutzt. Den COM-Port sieht man ggf. im Geräte-Manager in Windows unter "Anschlüsse (COM & LPT). Der ESP32 meldet sich dort als "USB Serial Port (COMxx)" an. Falls es da keinen Eintrag gibt, muss ggf. der serielle Windows-Treiber installiert werden. Dazu siehe auch meinen Artikel ESP32 Erst-Einrichtung. Habt ihr sonst nichts an seriellen Sachen am PC angesteckt, findet das esptool den richtigen vielleicht auch von allein. Ihr könnte das ja erst einmal ohne ausprobieren und dann tiefer forschen, falls es nicht klappt.
Bei mir ist der COM17-Port der richtige. Als nächstes machen wir ein DOS-Fenster (neudeutsch Einganeaufforderung) auf und wechseln in das Verzeichnis, in dem wir das esptool entpackt haben. Dann schauen wir uns einmal an, welches Flash auf unserem CYD sitzt:
d:\ESP32 >> esptool.exe -p COM17 flash_id
esptool.py v4.7.0
Serial port COM17
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting.....
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: e4:65:b8:76:89:7c
Uploading stub...
Running stub...
Stub running...
Manufacturer: 68
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
Denn wir wollen den gesamten Flash auslesen, also alle 4 MiB Bytes. Das wir den Flash von Anfang (0x0 oder einfach nur 0) bis Ende (0x400000, 400 Tausend, nicht 4 Mio.!) auslesen wollen, und wohin wir das Gelesene als Datei schreiben wollen geben wir als weitere Parameter ein.
Bei mir kam es allerdings immer wieder zum Abbruch und er hat es nie wirklich bis zum Ende geschafft. Als ich aber die Baudrate, also die ÜBertragungsgeschwindigkeit auf 460800 festgelegt habe, funktionierte es im ersten oder zweiten Anlauf. Das wird wohl auch die beste Baudrate bei euch sein, solltet ihr Probleme haben. Ansonsten versucht vielleicht auch mal 115200, 57600 oder 38400.
d:\ESP32 >> esptool.exe -p COM17 -b 460800 read_flash 0 0x400000 CYD-demo1.bin
esptool.py v4.7.0
Serial port COM17
Connecting......
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision v3.1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: e4:65:b8:76:89:7c
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
4194304 (100 %)
4194304 (100 %)
Read 4194304 bytes at 0x00000000 in 102.9 seconds (326.1 kbit/s)...
Hard resetting via RTS pin...
Und Flashen des ESP32-2432S028 mit Firmware
Nachdem ich meine Firmwares nun als CYD-demo1.bin bzw. CYD-demo2.bin gesichert habe, mache ich jetzt mal einen Test und schreibe die Firmware des neueren Modells mit USB-C-Port auf das alte CYD, dann sind beide gleich und ich kann die Bildschirme besser vergleichen, so meine Idee. Dies geht mit:d:\ESP32 >> esptool.exe -p COM17 -b 460800 write_flash 0 CYD-demo2.bin
esptool.py v4.7.0
Serial port COM17
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP32
Chip is ESP32-D0WD-V3 (revision v3.0)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 24:d7:eb:15:89:f0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x003fffff...
Compressed 4194304 bytes to 1024210...
Wrote 4194304 bytes (1024210 compressed) at 0x00000000 in 33.2 seconds (effective 1010.2 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Nach dem Flashen des alten CYD mit der neuen Firmware erlebe ich eine Überraschung. Das Display ist nicht nur ein anderes, sondern es wird scheinbar auch anders angesprochen.
Nun steht das Bild auf dem Kopf und ist gespiegelt. Wenn die Bildschirm-Koordinate 0, 0 vorher oben links war, ist sie nun unten links und werden von dort aus geschrieben. Außerdem sind scheinbar die Bytes für die Farben in einer anderen Reihenfolge. Was vorher blau war ist jetzt rot und was rot war ist blau. Das führt zu einem ziemlich unterkühlten Teint bei der Lady.
Witzigerweise funktioniert die Ermittlung der X und Y-Position durch den XT2046-Digitizer genau wie zuvor: hier ist oben oben und links links. Den hat man wohl nicht ausgetaucht, sondern nur das Display. Das führt dazu, dass ich oben links tippe und sich damit unten links die Grafik ändert - strange.
Abgesehen davon funktioniert die Firmware aber einwandfrei. Dennoch beweist das, dass man hier nicht einfach eine Firmware programmieren und dann als .bin-File zur Verfügung stellen kann. Zumindest nicht mit der Erwartung, es würde dann auf allen Revisionen funktionieren.
Man muss dann schon eine Firmwre für jede Version bereitstellen. Diese ließe sich dann für den Benutzer relativ einfach mit dem esptool hochladen. Besser wäre aber vielleicht doch, den Source-Code bereitzustellen und dort zu hinterlegen, welche Version man hat. Die kann der Nutzer dann anpassen, sich die Firmware selbst kompilieren und dann hochladen.
Mit Arduino IDE oder VS Code und PlatformIO kein Hexenwerk, aber halt auch nicht ganz so einfach. Besonders, wenn man bedenkt, dass man ja auch ein paar Batches um das esptool schreiben kann, so dass der Nutzer nur noch einen Doppelklick machen muss und der Rest erledigt ein Script.