MicroPython für den ESP32 und Co - Teil 2 - Matrix-Displays einfach ansteuern Produkte Code einbetten Login Passwort vergessen? Zur Registrierung Vielen Dank für Ihre Bewertung! Vielen Dank für Ihre Bewertung!

MicroPython für den ESP32 und Co - Teil 2 - Matrix-Displays einfach ansteuern Produkte Code einbetten Login Passwort vergessen? Zur Registrierung Vielen Dank für Ihre Bewertung! Vielen Dank für Ihre Bewertung!

Das Mini-Display aus dem ersten Artikel war eher für kleinere Geräte geeignet. In diesem Beitrag soll gezeigt werden, wie man mit Python-Kenntnissen auch eine großflächige Anzeige realisieren kann. Das Mittel der Wahl sind in diesem Fall LED-Matrixelemente mit jeweils 8 x 8 = 64 einzelnen LEDs. Durch Aneinanderreihen mehrerer Einheiten können so nahezu unbegrenzt große Displays aufgebaut werden. Diese eigenen sich beispielsweise als „Live-Ticker“ für Börsenkurse oder auch als Anzeigen für Spielstände auf dem heimischen Sportplatz. Mit wenigen Python-Anweisungen entstehen so großflächige Zeit- oder Temperaturanzeigen, die bei vielen Gelegenheiten sehr werbewirksam zum Einsatz kommen können.

Punktmatrix-Displays

Punktmatrix-Anzeigen erlauben neben der Darstellung von Ziffern und Buchstaben auch die Ausgabe von beliebigen Symbolen und einfachen Grafiken. Damit sind sie den klassischen Sieben-Segment-Displays überlegen, die nur die Ausgabe der Ziffern von 0 bis 9 erlauben. Zudem sind Sieben-Segment-Anzeigen auf die einmal festgelegten Größen beschränkt, Punktmatrizen dagegen beliebig skalierbar.Darüber hinaus sind im Vergleich zu OLED-Displays wesentlich größere Helligkeiten erzielbar. Mit LED-Matrizen können Anzeigenflächen mit mehreren Metern Länge und Breite erreicht werden. Diese Display-Variante wird daher häufig auch für großflächige Anzeige- oder Werbetafeln an belebten Plätzen, Bahnhöfen oder Flughäfen, in öffentlichen Bussen und Zügen und so weiter eingesetzt. In den Börsensälen der Welt zeigen sie als sogenannte „Live-Ticker“ die aktuellen Wertpapierkurse an.Im asiatischen Raum sind Dot-Matrizen übrigens besonders beliebt, da sich damit auch fernöstliche Schriftzeichen problemlos darstellen lassen, wie Bild 1 zeigt.

Ansteuerung

LED-Matrizen mit 5 x 7 = 35 LEDs sind weit verbreitet. Aber auch die verschiedensten anderen Bauformen sind erhältlich. Häufig sind Elemente mit 8 x 8 LEDs anzutreffen. Die direkte Ansteuerung von 8 x 8 Punkten würde 65 Leitungen erfordern, da 64 Anodenanschlüsse und eine gemeinsame Kathode anzuschließen wären. Bei einer Matrix kommt man mit wesentlich weniger Verbindungen aus. Hier sind jeweils 8 LEDs in einer Spalte und einer Zeile zusammengeschaltet. So sind nur noch 8 + 8 = 16 Verbindungen erforderlich. Bild 2 zeigt das Prinzip für eine 3 x 4-Matrix. Statt 13 Anschlüssen für eine Einzelansteuerung der LEDs sind hier nur 7 Verbindungen notwendig.

Um zum Beispiel die 2. LED in der 2. Zeile in einer Matrix zu aktivieren, müssen bis auf den zweiten alle Zeilenanschlüsse auf HIGH gelegt werden. Der zweite Anschluss dagegen muss GND-Potential führen. Bei den Spalten darf ausschließlich in der zweiten Spalte High-Potential anliegen.Die direkte Ansteuerung von Punktmatrizen bindet einen großen Teil der Ressourcen des Controllers. Sollen zusätzlich noch Sensorwerte erfasst oder Aktoren angesteuert werden, stößt selbst ein leistungsfähiger ESP32-Controller rasch an seine Grenzen. Die Ansteuerung von größeren Displays mit hundert oder mehr LEDs würde ebenfalls schnell zum Problem werden, einerseits wegen der erforderlichen Rechenleistung, andererseits aufgrund der beschränkten Anzahl der verfügbaren Pins an einem Controller. Zudem würde sich hier auch die relativ geringe Ausführungsgeschwindigkeit von Python-Code negativ auswirken.Es ist daher ratsam, kostengünstige Displaytreiber einzusetzen, wie etwa den MAX7219. Diese Bausteine verfügen über eine SPI-kompatible Schnittstelle und können so mit lediglich drei digitalen Pins Displays mit bis zu 8 x 8 = 64 Matrixelementen ansteuern. Das SPI-Interface (Serial Peripheral Interface) hat weite Verbreitung gefunden und kommt insbesondere in der Unterhaltungselektronik häufig zum Einsatz. Das Bussystem und insbesondere seine Verwendung unter MicroPython sind in einem Elektor-Buch des Autors detailliert beschrieben.Die Treiber sind zusammen mit dem eigentlichen Matrix-Element als komplette Module verfügbar. Bild 3 zeigt ein Beispiel.

Der Anschluss der Treiberbausteine an den ESP32 ist sehr einfach. Lediglich die drei SPI-Pins sind mit dem Controllerboard zu verbinden:

MAX7219_data (DIN) Port D02

MAX7219_load (CS) Port D05

MAX7219_clock (CLK) Port D04

MAX7219_GND ESP32 GND

Aufgrund des relativ hohen Stromverbrauchs empfiehlt es sich, die Spannungsversorgung extern zur Verfügung zu stellen. Dabei ist darauf zu achten, dass die Versorgungsspannung der Module bei etwa 3,3 V bis 4 V liegen sollte, um die Kompatibilität mit dem ESP32 zu gewährleisten. Auf diese Weise erhalten die Module einerseits noch die laut Datenblatt minimal zulässige Versorgungsspannung. Andererseits wird eine Überlastung der Controller-Eingänge vermieden. Alternativ kann auch ein bidirektionaler 3,3/5-V-Pegelwandler eingesetzt werden.Zudem sind ausreichend Abblockkondensatoren vorzusehen. Unerlässlich sind auch niederohmige VCC- und Masseleitungen. Werden diese Hinweise berücksichtigt, können nahezu beliebig große Displays aufgebaut werden. Der Controller wird kaum mehr belastet, da nur noch einzelne Kommandos über den SPI-Bus gesendet werden müssen. Zudem bleiben noch ausreichend Pins frei, um externe Sensoren oder andere Peripherie zu betreiben. Der Realisierung von großflächigen Anzeigen zu Werbezwecken oder bei Sportveranstaltungen steht damit nichts mehr im Weg.Bild 4 zeigt das vollständige Schaltbild zum Aufbau eines 6-stelligen Matrix-Displays mit einem ESP32-Controller-Modul.

Mit der passenden Library zum Erfolg

Ein Link für eine geeignete Python-Library zur Ansteuerung der Maxim-ICs findet sich im Downloadpaket. Nachdem die Treiber-Datei Max7219.py auf den Controller geladen wurde, stehen die folgenden Anweisungen zur Verfügung:

spi = SPI(1, baudrate=10000000, polarity=1, phase=0, sck=Pin(CLK), mosi=Pin(DIN))

ss = Pin(CS, Pin.OUT)

Für die oben angegebene Pinbelegung ist:

CLK = 4

DIN = 2

CS = 5

zu setzen. Dann kann ein Display-Objekt erzeugt werden:

display = max7219.Matrix8x8(spi, ss, MN)

wobei für MN die Anzahl der verwendeten Matrixelemente einzusetzen ist. Anschließend können mit den Befehlen in Listing 1 Texte und Grafiken entworfen werden.Damit lassen sich werbewirksame Anzeigen erstellen, die auch noch aus mehreren Metern Entfernung gut lesbar sind.

LED-Matrix in Aktion

TDer folgende Code zeigt ein Anwendungsbeispiel für ein Display mit sechs 8x8-Matrixelementen:

# LED_matrix_test.py

import max7219

from machine import Pin, SPI

spi = SPI(1, baudrate=10000000, polarity=1, phase=0, sck=pin(4), mosi=pin(2))

ss = Pin(5, Pin.OUT)

display = max7219.Matrix8x8(spi, ss, 6)

display.text('Python',0,0,1)

display.show()

Nach dem Laden des Programms auf den ESP-Controller wird der Text auf dem Display ausgegeben (Bild 5).

Die Anzeige kann durch weitere Matrixmodule problemlos erweitert werden. Bild 6 zeigt ein Array mit 12 Elementen. Es sind jedoch nicht nur statische Anzeigen und Texte darstellbar. Auch bewegte Grafiken sind in Python problemlos umzusetzen. Der nächste Abschnitt zeigt ein entsprechendes Beispiel.

Laufschriften und Börsenticker

Über die Scroll-Funktion können Laufschriften und Ähnliches erzeugt werden. Damit lassen sich auch auf kleinen beziehungsweise kurzen Displays längere Texte ausgeben. Das Programm in Listing 2 lässt den Schriftzug „Python“ von rechts nach links über ein Dot-Matrix-Display laufen.

Die einzelnen Buchstaben werden dabei über

display.text('...',40,0,1)

am rechten Rand der Anzeige erzeugt. Dann werden diese über die Funktion moveLeft um den Wert pixelDistance nach links verschoben:

for i in range(8):

MicroPython für den ESP32 und Co - Teil 2 - Matrix-Displays einfach ansteuern Produkte Code einbetten Login Passwort vergessen? Zur Registrierung Vielen Dank für Ihre Bewertung! Vielen Dank für Ihre Bewertung!

display.scroll(-1,0)

sleep(speedFactor)

Die Ablaufgeschwindigkeit kann über den Wert speedFactor verändert werden. In einem YouTube-Video ist das Display live in Aktion zu sehen..

Temperaturanzeige im Großformat

Viele Apotheken, Banken oder Einzelhändler versuchen die Aufmerksamkeit potentieller Kunden auf sich zu lenken, indem sie mit großflächigen Temperatur- oder Zeitanzeigen werben. Aber auch bei Sportveranstaltungen, Messen, Ausstellungen oder für FabLabs sind derartige Displays immer ein „Hingucker“. Um etwa eine Temperaturanzeige zu realisieren, muss man den oben vorgestellten Aufbau nur noch um einen entsprechenden Sensor erweitern. Eine besonders geeigneter Variante ist hier der DS18x20 von Maxim Integrated (ehemals Dallas). Mit der passenden Python-Library ist das Auslesen des Sensors problemlos möglich.Diese Sensoren kommunizieren über den One-Wire-Bus und belegen damit nur einen einzigen I/O-Pin des ESP32. Zudem ist für diese Sensorreihe eine fertige Python-Library verfügbar. Zusätzlich zum Sensor selbst ist lediglich ein Pull-up-Widerstand von 4,7 kΩ erforderlich. Bei Verwendung des ESP32-internen Pull-ups kann sogar dieser entfallen. Der Sensor verfügt über die folgenden Leistungsmerkmale:

Versorgungsspannung: 3.0 V to 5.5 V

Temperaturbereich: - 55 °C to +125°C

Messgenauigkeit: ±0.5°C (-10°C to +85°C)

Auflösung: 9-bit, entsprechend ca. 1/10 °C

Messperiodendauer: 750 ms (max.)

Über One-Wire-Bus kann nicht nur ein einzelner Sensor pro Pin ausgewertet werden. Durch das spezielle Protokoll des One-Wire-Bussystems lassen sich nahezu beliebig viele Temperatursensoren parallel über einen einzigen Controller-Pin abfragen. Im Folgenden soll allerdings nur ein einzelner Sensor verwendet werden.

Bild 7 zeigt den Anschluss des DS18x20 an den ESP32.

Ein Auswertungsprogramm für den DS18x20 zeigt die erfassten Temperaturwerte auf der Konsole an:

# DS18x20_TempSens_demo.py

from machine import pin

import onewire

import ds18x20

import time

ow = onewire.OneWire(Pin(25)) # init one wire bus

ow.scan()

ds=ds18x20.DS18X20(ow) # create ds18x20 object while True: units=ds.scan() # scan for ds18x20 units ds.convert_temp() # convert temperature for unit in units: print(ds.read_temp(unit)) #display time.sleep(1) print()

Die Module zum Auslesen des Sensors sind wieder standardmäßig in der MicroPython-Firmware verfügbar.

Die Erweiterung des Programms auf die LED-Matrixanzeige ist mit wenigen Zeilen erledigt, siehe Listing 3.

Bild 8 zeigt das Ergebnis. Weitere Details zum Anschluss verschiedener Sensoren unter anderem für Lichtstärke, Luftfeuchtigkeit oder Magnetfelder sind im Buch zu finden.

Animierte Grafiken

Neben Buchstaben und numerischen Daten lassen sich auf der LED-Matrix auch Grafiken und sogar Animationen präsentieren. Das Programm in Listing 4 zaubert eine beliebige Pixelgrafik auf das Display.

Die Grafik wird dabei über die Bitmap icon erzeugt. Punkte, die später leuchten sollen, sind mit einer „1“ zu markieren. Dunkle Punkte erhalteneine „0“:

[0, 0, 0, 0, 0, 0, 0, 0],

[0, 1, 1, 0, 0, 1, 1, 0],

[0, 1, 1, 0, 0, 1, 1, 0],

[0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 1, 1, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0],

[0, 1, 0, 0, 0, 0, 1, 0],

[0, 0, 1, 1, 1, 1, 0, 0],

Auf diese Weise lassen sich beliebige Icons erzeugen. Die Enumerate-Funktion sorgt für die Umsetzung der Bitmap in eine anzeigefähige Grafik:

for y, row in enumerate(icon):

for x, c in enumerate(row):

display.pixel(x, y, c)

Damit ergibt sich Bild 9 auf der LED-Matrix. Mit der Scroll-Funktion in der Hauptschleife kann das so erzeugte Bild dann über die Anzeigeeinheit hinweg bewegt werden (siehe auch im YouTube-Video).

Zusammenfassung und Ausblick

Nachdem im ersten Artikel der Serie [1] die elementaren Befehle vorgestellt wurden, konnten diese nun im zweiten Teil in verschiedenen Praxisanwendungen eingesetzt werden. Mächtige Libraries machen es möglich, bereits mit einigen wenigen Programmzeilen eindrucksvolle Projekte umzusetzen. Dies bestätigt die bemerkenswerte Leistungsfähigkeit von MicroPython auch für Controller-Anwendungen. Weitere Informationen und viele Praxisprojekte sind im Buch „MicroPython für Mikrocontroller“ zu finden. Dort werden unter anderem auch die Ansteuerung von Servos, die drahtlose Datenübertragung via RFID, das MQTT-Protokoll sowie die Übertragung von Sensorwerten in das Internet ausführlich behandelt.Zudem werden über die Kombination von Python mit dem rasch wachsenden Feld des Maschinellen Lernens und der Künstlichen Intelligenz in naher Zukunft Anwendungen ermöglicht, die bislang undenkbar waren.Neue Controller-Generationen wie etwa der Kendryte K210 erlauben beispielsweise bereits die direkte Auswertung von Audio- und Kamerasignalen. Zusammen mit Python-basierten Bildverarbeitungsalgorithmen stehen dem Entwickler so vielfältige und zukunftsweisende Wege offen. 210179-B-02

Sie haben Fragen oder Kommentare?

Sie haben technische Fragen oder Kommentare zu diesem Artikel? Schreiben Sie uns unter redaktion@elektor.de!