Framework Laptop 16: Die LED-Matrix ansteuern

Aus LinuxUser 09/2024

Framework Laptop 16: Die LED-Matrix ansteuern

© antishock / 123RF.com

Tief in der Matrix

In der letzten Ausgabe stellten wir den Framework Laptop 16 vor. Diesmal geht es um die Funktionsweise der LED-Matrix, die es als Zubehör gibt.

Bei der Konfiguration des Framework Laptop 16 bietet der Hersteller die Möglichkeit, statt der normalen Spacer ein oder zwei LED-Matrix-Module zu integrieren. Sie zeigen beim Booten des Rechners kleine Animationen. Sie finden die Komponenten im Framework-Marktplatz in der Kategorie Personalisierung unter der Bezeichnung LED Matrix [1]. Der Kostenpunkt liegt derzeit bei 55 Euro pro Modul.

Die LED-Matrix des Typs IS31FL3741A [2] von Lumissil besteht aus 9 Spalten mit je 34 Dioden (Abbildung 1). Sie erhält ihre Daten über eine I2C-Schnittstelle, die an einem von der Raspberry Pi Foundation entwickelten RP2040-Mikrocontroller hängt. Das macht die Sache besonders für ambitionierte RasPi-Bastler sehr spannend.

Abbildung 1: LED Matrix Modul für den Framework 16 Laptop. Quelle: Framework Computer BV

Abbildung 1: LED Matrix Modul für den Framework 16 Laptop. Quelle: Framework Computer BV

Auf dem Controller läuft eine Firmware [3], die es ermöglicht, die LED-Matrix per USB-Serial-Adapter anzusteuern. Unter Linux finden sich die entsprechenden Geräte unter /dev/ttyACM0 und /dev ttyACM1. Alle relevanten Informationen über das Modul finden Sie im Github-Repository [4] von Framework, dasselbe gilt für den Schaltplan des Moduls [5].

Zugriff

Der Zugriff auf die LED-Matrix gestaltet sich denkbar einfach. Sie benötigen lediglich einen Chrome-Browser und die passende Berechtigung auf dem System. Um auf serielle Schnittstellen zuzugreifen, muss Ihr Benutzerkonto der Gruppe dialout angehören. Tut es das noch nicht, fügen Sie es mit dem Kommando sudo addgroup $USER dialout der Gruppe hinzu. Um die Änderung zu übernehmen, loggen Sie sich aus und wieder ein. Anschließend prüfen Sie mit dem Kommando groups, ob Ihr Konto korrekt der Gruppe zugewiesen wurde.

Passt alles, geben Sie im Webbrowser die URL https://ledmatrix.frame.work ein und gelangen so direkt auf eine Webseite, mit der Sie auf die Matrix zugreifen. Über die Schaltflächen Connect Left und Connect Right stellen Sie die Verbindung zwischen der Webseite und dem oder den Modulen her (Abbildung 2). Alles, was Sie jetzt in das Pixelfeld zeichnen, erscheint direkt auf dem Display.

Abbildung 2: Das optional angebotene Matrix-Modul steuern Sie über einen Webbrowser an.

Abbildung 2: Das optional angebotene Matrix-Modul steuern Sie über einen Webbrowser an.

Ansteuern

Sie steuern die Matrix mit einem Python-Programm an. Für den Zugriff auf die serielle Schnittstelle verwenden Sie die Bibliothek Pyserial, die Sie mit den Kommandos aus Listing 1 einrichten. Mit dem Programm aus Listing 2 lassen Sie einen horizontalen Streifen über das Display sausen. Für die Freunde des bewegten Bilds findet sich ein Video davon auf Youtube [6].

Das Programm dient lediglich als Beispiel, das zeigt, wie der Zugriff prinzipiell funktioniert. Für diesen Anwendungsfall würde eine eigene Matrix-Klasse durchaus Sinn ergeben, die alles schön kapselt. Sie ließe sich auch in einer Bibliothek unterbringen. Das hätte den Vorteil, dass der Code schick aussähe, aber den Nachteil, dass man nicht mehr direkt nachvollziehen könnte, was da passiert.

Listing 1

Vorbereitende Kommandos

$ sudo apt install python3-pip
$ pip3 install pyserial

Listing 2

Programm zur Animation

import serial
import time
width=9
height=34
Matrix = [[0 for x in range(height)] for y in range(width)]
Port = serial.Serial(port="/dev/ttyACM0", baudrate=115200, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE)
def display():
  displayArray=[0 for x in range(42)]
  expo=0
  byteValue=0
  i=3
  displayArray[0]=0x32
  displayArray[1]=0xAC
  displayArray[2]=0x06
  for y in range(height):
    for x in range(width):
#     print(Matrix[x][y],end ='')
      byteValue = byteValue + (2**expo)*Matrix[x][y]
      expo=expo+1
      if (expo==8):
        displayArray[i]=byteValue
        i=i+1
        expo=0
        byteValue=0
#       print()
  displayArray[i]=byteValue
# print(displayArray)
  Port.write(displayArray)
while (True):
  for i in range (33):
    for line in range(9):
      Matrix[line][i+1]=1
      Matrix[line][i]=0
    time.sleep(0.1)
    display()
  for i in range (33):
    for line in range(9):
      Matrix[line][32-i]=1
      Matrix[line][32+1-i]=0
    time.sleep(0.1)
    display()

Kommen wir zurück zu unserem Beispielcode aus Listing 2. Als Erstes baut er ein zweidimensionales binäres Array auf (Zeile 3 bis 5). Diese Matrix dient als Datenstruktur, mit der Sie arbeiten. Das Array hat dieselbe Geometrie wie das reale Display, also 9 Spalten und 34 Zeilen. Sie definieren dabei die Koordinate 0,0 als oben links.

Die Funktion display() ab Zeile 7 dient dazu, den Inhalt der Datenstruktur in der korrekten Reihenfolge zur seriellen Schnittstelle zu übertragen. Das erfordert einige Kniffe, um die Bytes aus den Einzelkoordinaten zusammenzusetzen. Die mathematischen Grundlagen zu Zahlensystemen erweisen sich in diesem Fall als durchaus wichtig.

Die Funktion läuft durch die komplette Matrix und setzt aus den einzelnen Bits die Bytes zusammen (byteValue, Zeile 18). Dabei erhöht sie den Exponenten mit jeder Binärstelle um eins. Hat sie alle acht Bits bearbeitet, schreibt sie sie an die passende Stelle in das displayArray. Die ersten drei Bytes des Arrays steuern die Funktionen des LED-Matrix-Moduls (Zeilen 12 bis 14). Ist die komplette Matrix ausgelesen und stehen alle Werte in displayArray, überträgt das Programm das Array an den Port. Dessen Kommunikationsparameter wurden bereits zu Beginn des Programms festgelegt (Zeile 6).

Der Code innerhalb der While-Schleife ab Zeile 29 zaubert die Animation auf die LED-Matrix. Selbst die mäßige Ausführungsgeschwindigkeit von Python reicht aus, um einfache Animationen auf der Matrix zu starten. Eine alternative Möglichkeit, Bilder für die Anzeige zu erstellen, bietet beispielsweise die Bibliothek Pillow [7]. Sie müssen dann nur die Funktion display() so anpassen, dass sie die Ausgaben der Bibliothek verarbeiten kann.

TIPP

Falls Sie sich die Funktionsweise des Programms aus Listing 2 etwas genauer ansehen möchten, können Sie die print()-Anweisungen innerhalb des Codes (Zeilen 17, 25, 27) wieder einkommentieren.

RP2040-Firmware

Wenn Sie sich jetzt fragen, ob sich die RP2040-MCU mit einer eigenen Firmware ausstatten lässt: Die Antwort lautet ja. Auch die Firmware des Moduls ist quelloffen und steht auf Github zum Download bereit. Im Repository findet sich eine Anleitung, wie Sie die Firmware selbst bauen, um sie danach in ein LED-Matrix-Modul einzuspielen. Im Prinzip können Sie jede Entwicklungsumgebung verwenden, die Dateien im UF2-Format für den RP2040 erstellen kann. Da die existierende Firmware nach Meinung des Autors aber vollkommen ausreicht, um interessante Objekte aufs Display zu zaubern, verzichtete er auf diese Möglichkeit.

Jetzt könnte man auf den Gedanken kommen, eine solche Matrix selbst zu bauen. Joe Schroedl [8] aus Raleigh (North Carolina, USA) ist uns da aber schon einen Schritt voraus. Wie sein Youtube-Video [9] zeigt, funktioniert seine RGB-Matrix bereits. Aktuell kann man sie aber noch nicht bestellen.

Fazit

Es ist faszinierend, was man mit den leeren Bereichen links und rechts neben der Framework-Laptop-Tastatur so alles anstellen kann. Die LED-Matrix zählt definitiv zu den Extras, die man sich leisten sollte, wenn man sich für den modularen Framework Laptop entscheidet. Der Autor jedenfalls hatte viel Spaß damit. (tle/jlu)

Der Autor

Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 09/2024 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben