Mastodon katzenjens' Technik-Blog: Mini-TV Nachlese Mastodon

24.01.2025

Mini-TV Nachlese

Nachdem ich vor einiger Zeit mit einem XIAO SAM21 die erste Version des Mini-TV mit Diashow gebaut habe, wollte ich mehr. Z.B. die Fotos auf SD-Karte und später vielleicht mal Internet hinzufügen.

Nach eher entmutigen Versuchen mit dem Raspberry PI Pico W habe ich wieder zu der ESP32-Serie zurückgefunden. Inzwischen gibt es einige Nachfolger des legendären ESP32. Ich habe mich ausgiebig mit den Teilen befasst. Für diese Aufgabe reicht ein ESP32C3-Zero. Diese sind inzwischen aus China sehr günstig zu haben, teilweise 2€. Zudem ist die Platine sehr klein, sodaß man den ganzen Kram locker in einem kleinen Gehäuse unterbringen kann.


Hier ist mein Testaufbau. Weil bis es lief, hat es etwas gedauert. Ich werde den Beitrag aufteilen in Aufbauanleitung zum Nachbau, Erklärung, was es tut und zum Schluß der dornige Weg, bis es lief. Weil das war gar nicht so einfach aus verschiedenen Gründen.

Hier gibt es Script und Co. für den Nachbau...

Die Hardware ist anhand der Bilder recht simpel zusammenzubauen. Die Micro-SD Kartenslot kann man sich selbst zusammenlöten aus einem SD / Micro SD Adapter. Von denen hat man oft mehr als genug herumliegen. Wenn man die Teile in ein kleines Gehäuse einbauen will, empfehle ich freihändige Verdrahtung ohne Stecker und Buchsen. Schon hat man mehr Platz. Anhand der "Kritzeleien" sollte alles verständlich sein. Im Zweifelsfall im Script und der User_Setup nachschauen. Wichtig ist, die SD-Karte darf nur mit 3,3V versorgt werden.

Benutzte Pins des ESP32C3

Das ist die Rückseite des SD-Kartenadapters von Mikro-SD zu SD. Oben wird die Mikro-SD reingeschoben.

Anschluß des TFT an den ESP32C3

Die Programmierumgebung ist ebenfalls simpel. Zuerst die ESP32 Boards installieren. Anleitungen, wie das geht, gibt es zu Hauf im Netz. Ich nutze die Arduino Version 2 Umgebung. Wichtig als nächstes: Falls schon die TFT_eSPI Bibliothek von Bodmer vorhanden ist, diese löschen! Stattdessen wird die gleichnamige Lib von Cincinnatu als ZIP heruntergeladen und installiert. Keine Angst, alle "alten" Scripte, welche TFT_eSPI nutzen funktionieren weiterhin. Grund ist der, weder der ESP32C3 noch ESP32C6 sind in der Lib von Bodmer richtig drin. Ergebnis ist: schwarzes Display und SD-Karte wird nicht gelesen. Wenn dieses nun vorbereitet ist, mein Script laden. Das ESP32C3 Board auswählen. Anschließen und den passenden COM-Port auswählen. Dort auch die Funktion "USB CDC on Boot" einschalten. Als nächstes kompilieren und übertragen. Danach sollte bereits das Display eine Begrüßung rauswerfen gefolgt von einem Fehler "keine SD-Karte".

Als nächstes greift man sich eine Micro-SD-Karte, formatiert sie mit FAT32 und packt die Beispielbilder, welche ich mitgeliefert habe, in das Hauptverzeichnis. Karte rein, Neustart und schon sollten diverse Testbilder erscheinen. Wenn nicht, Verdrahtung und Programmierumgebung prüfen.

Eigene Bilder kann man natürlich auch auf die SD-Karte packen. Diese müssen allerdings zwingend im PNG Format und der Größe 280x240 Pixel gespeichert werden.

Wenn alles funktioniert, prima. Wenn nicht, im Script die Debugfunktion aktivieren und auf der seriellen Konsole nachschauen, wo es hakt. Die gestrichelte 5V Leitung nimmt man zur Versorgung über einen LiIonen-Akku mit Ladeschaltung bei Bedarf.

Die Funktion des Scripts ist wie folgt: Nachdem SD-Karte und TFT initialisiert wurden, wird das Verzeichnis der Karte ausgelesen. Jedes Bild wird einzeln in den Zwischenspeicher geladen und dann erst zum TFT übertragen. Der Grund ist der, den Bildwechsel so flüssig wie möglich darzustellen. Das Vorladen von SD in den Speicher sieht man nicht.

Warum war das gar nicht so trivial?

Eine verdammt gute Frage, weil ich hatte das Script vorher ohne Probleme auf einem ESP32C6 zum Laufen bekommen. Allerdings auch erst, als ich die Problematik mit der TFT_eSPI von Bodmer im Netz gefunden hatte. Von daher dachte ich, das sollte also mit dem ESP32C3 exakt genauso funktionieren. Tat es aber nicht, häh? Es gab mehrere Gründe.

Der ESP32C3 hat nur einen SPI-Port! Das ist in dem Datenblatt etwas verklausuliert. Ok, also mussten dann SD und Display an den gleichen Port. Sollte eigentlich problemlos sein, wenn man verschiedene CS nimmt. Wichtig dabei, der CS für die SD ist fest vorgegeben (GPIO7). Für das Display hatte ich dann GPIO3 genommen. Display funktionierte, SD aber nicht. WTF?! Grund: Da irgendwas in der TFT_eSPI vermurkst ist, muss man zwingend erst die SD ansprechen, bevor man das Display initialisiert. Arrrrgh! Gesagt, getan. Fehler blieb. In meiner Verzweiflung habe ich dann mein Speicheroszi angesaftet aber auch damit nix gefunden. In meiner Verzweiflung hatte ich dann den Bildpuffer im Script testweise von 200000 auf 190000 verringert, auch wenn das gar nix damit zu tun haben kann. Aber danach lief es direkt. Ergo entsteht ein Speicherüberlauf, ohne daß der Compiler meckert. Das RAM im ESP32C3 ist nicht in einem Stück sondern verteilt sich über den Adressraum. In die Falle bin ich halt getappt. Bei anderen ESP32-Versionen gab es wenigstens Fehlermeldungen, dort habe ich dann den Bilderpuffer ausgeschaltet damit es lief. Allerdings langsamer.

Keine Kommentare:

Kommentar veröffentlichen