Aus Raspberry Pi Geek 09/2023

I2C-Displays mit dem ESP32 ansteuern

© Olena Yakobchuk / 123RF.com

Wo geht's hin?

Martin Mohr

Beim Bau einer ESP32-basierten Zugzielanzeige für eine Spur-G-Gartenbahn stellen sich viele interessante Herausforderungen.

Eine Zugzielanzeige zu bauen, klingt erst einmal gar nicht so kompliziert. Wie so häufig steckt der Teufel aber im Detail. LGB-Modellbahnen für den Garten sind üblicherweise wetterfest und recht groß. Der Maßstab beträgt für die sogenannte Spur G satte 1:22,5. Hier handelt es sich also um recht geräumige Modelle. Damit der Zielanzeiger realistisch wirkt, verwenden wir kleine I2C-Displays [1].

Bei I2C haben die Geräte am Bus eindeutige Adressen und lassen sich deshalb leicht ansteuern. Die von uns genutzten 0,91 Zoll kleinen Displays bringen allerdings eine unveränderliche feste Adresse mit. Somit ist es unmöglich, zwei dieser Displays an einem I2C-Bus zu betreiben. Die erste Idee zur Lösung des Problems war, einen einfachen I2C-Multiplexer zu verwenden, der aus einem Bus zwei macht. Das hätte aber mehr Platz für die Elektronik erfordert.

Nach einigen Tagen des Grübelns und Probierens kristallisierte sich heraus, dass es am einfachsten ist, mit zwei unabhängigen I2C-Schnittstellen zu arbeiten – eine für jedes Display. Hier stellte sich allerdings heraus, dass sich die C-Bibliotheken aus der Arduino-Welt als reichlich starrsinnig und unflexibel – weil hartkodiert – erweisen. Interessanterweise ist die I2C-Implementierung von MicroPython im Gegensatz dazu recht flexibel, und auch die Bibliothek fürs Display arbeitet ohne Probleme mit unterschiedlichen Schnittstellen.

In der Zielkonfiguration steckt die Elektronik im Inneren einer Lokomotive, sodass sich am Programm nichts mehr ändern lässt. Daher ist es wichtig, eine Möglichkeit zu schaffen, die Anzeigen von außen zu konfigurieren. Hier kommt der ESP32 ins Spiel: Er bringt alle Komponenten mit, um einen Access Point mit Webserver bereitzustellen, über den Sie die Daten für die Displays eingeben.

Wir verwenden in diesem Projekt ein ESP32 NodeMCU Development Board [2], das eine einfache Möglichkeit zum Programmieren des ESP32 bereitstellt. Üblicherweise steht in der Gartenbahn auch genug Platz zur Verfügung, um etwas größere Hardware unterzubringen. Falls Platz für Sie ein Thema ist, können Sie auch einen ESP32 ohne das Drumherum verwenden und über eine externe Programmierschnittstelle mit der nötigen Software versorgen.

Abbildung 1 zeigt unseren Aufbau. Um Platz zu sparen, verzichtet das ESP32-Dev-Board auf die sonst übliche Stiftleiste. Um einen gewissen Schutz gegen Witterung zu gewährleisten, empfiehlt es sich, die Bauteile vor dem Einbau mit einem Schrumpfschlauch zu umhüllen. Alternativ könnte man die komplette Platine auch mit Sprühplastik behandeln. Das hat allerdings den Nachteil, dass es nach der Behandlung fast unmöglich ist, noch etwas an das Board anzulöten.

Abbildung 1: Das ESP-Dev-Board mit Displays und einem Taster zur Richtungswahl.

Abbildung 1: Das ESP-Dev-Board mit Displays und einem Taster zur Richtungswahl.

Schaltplan

Zum Schaltplan (Abbildung 2) gibt es nur wenig zu sagen. Die beiden Displays sind mit den entsprechenden Pins verbunden, das Dev-Board versorgt sie mit 3,3 Volt Betriebsspannung. Den erforderlichen Strom bezieht der Testaufbau über die USB-Schnittstelle. Wenn man die Schaltung in einem Modell verbaut, gilt es, die 5 Volt Betriebsspannung über den entsprechenden Pin von extern an das Dev-Board zu führen.

Abbildung 2: Der Schaltplan für die Zugzielanzeige.

Abbildung 2: Der Schaltplan für die Zugzielanzeige.

Die I2C-Schnittstelle dient dazu, Mikrocontroller und deren Peripherie innerhalb von Geräten zu verbinden. Daher sollten die Leitungen nicht allzu lang ausfallen. Die Praxis zeigt allerdings, dass I2C auch bei Kabellängen von über einem Meter das Signal noch sauber überträgt.

Programm

Wie eingangs erwähnt, verwenden wir für unser Projekt MicroPython als Programmiersprache. Wie Sie es auf dem ESP32 installieren und verwenden, zeigt der Artikel “Kleine Schlange” [3] aus RPG 06/2022. Alle Dateien, die wir im Folgenden besprechen, finden Sie im Download-Bereich zu diesem Artikel [4].

Das Programm gliedert sich zur besseren Übersicht in mehrere Dateien auf. Zusätzlich gibt es noch das File data.txt (Listing 1), mit den Texten für die Displays. Neben den Programmen sind noch einige zusätzliche Bibliotheken vorhanden, die zum Ansteuern des Displays dienen. Schauen wir uns diese als Erstes ein wenig genauer an.

Listing 1

data.txt

Frankfurt
Hamburg

Die Bibliothek ssd1306.py [5] benötigen wir, um unsere kleinen Displays anzusteuern. Allerdings stellt sie von Haus aus nur sehr kleine Texte auf den Displays dar. Dieses Problem lässt sich leicht mit der Bibliothek writer.py [6] lösen. Sie erlaubt es, Texte in einem beliebigen Font in variabler Schriftgröße darzustellen. Die Fonts müssen Sie dabei in einem speziellen Format auf dem MicroPython-Gerät ablegen, in unserem Fall in der Datei freesans31.py. Möchten Sie einen anderen Font verwenden, finden Sie eine Anleitung dazu auf Github [7]. Hier muss man etwas tüfteln, um ans Ziel zu gelangen. Beachten Sie, dass Sie die Bibliotheken manuell auf das MicroPython-Gerät kopieren müssen.

Als Nächstes sehen wir uns die Datei config.py (Listing 2) genauer an. Wie der Name vermuten lässt, enthält sie die Einstellungen für die Zugzielanzeige. Sie umfassen neben der Display-Auflösung die verwendeten Pins für die zwei I2C-Schnittstellen. Sollten Sie ein anderes ESP32-Modul einsetzen, können Sie diese Pins also zentral ändern und müssen nicht im Code nach den passenden Stellen suchen. Bei den Einstellungen für den WLAN-Access-Point sollten Sie im Hinterkopf behalten, dass sich der Webserver erreichen lässt, sobald der ESP32 Spannung erhält. Das WLAN-Passwort ist also der einzige Zugriffsschutz für die Displays, wählen Sie also ein sicheres.

Listing 2

config.py

OLED_WIDTH = 128
OLED_HEIGHT = 32
I2C_1_SDA = 33
I2C_1_SCL = 32
I2C_2_SDA = 26
I2C_2_SCL = 25
FILENAME = 'data.txt'
INPUT = 14
PASS = 'Train'
SSID = 'Train'

Alle für die Anzeige auf den Displays zuständigen Funktionen fasst die Datei display.py (Listing 3) zusammen. Der Code aktiviert die zwei I2C-Schnittstellen, liest die Texte aus der Datei data.txt und stellt sie auf den beiden Displays dar. Die Variable direction steuert dabei, welche Zeile aus der Datei auf den Displays erscheint.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben