Raspberry Pi: HDMI-Ausgabe mit CircuitPython programmieren

Einer der Hauptvorteile von Bare Metal CircuitPython auf dem Raspberry Pi ist die einfache Verwendung eines angeschlossenen HDMI-Displays. CircuitPython verfügt mit dem integrierten displayio-Modul über eine native Unterstützung für Displays.

Beim Verwenden eines HDMI-Displays muss man nur sicherstellen, dass es vor der Inbetriebnahme des Raspberry Pis angeschlossen ist. Die CircuitPython-Firmware erkennt das angeschlossene Display dann automatisch und startet sofort die Videoausgabe. Es verwendet standardmäßig einen 640x480-Framebuffer und dient als Ausgabe für die Konsole.

Auflösung einstellen (z. B. 1920 x 1080)

Sofern man das Display mit einer anderen Auflösung als 640 x 480 Pixeln nutzen möchte muss der CircuitPython-Framebuffer mit ein paar Zeilen Code neu initialisiert werden. Dieser Code kann in boot.py eingegeben werden, der dann einmal beim Booten ausgeführt wird und dann bei jedem Neustart unabhängig vom Programmcode immer gilt.

Hinweis: Ein zu großer Framebuffer führt dazu, dass eine Aktualisierung des Bildschirms nur stark verzögert erfolgt.

Speichere die folgenden Zeilen in der Datei boot.py, um die Auflösung dauerhaft zu ändern.

import displayio
import framebufferio
import videocore

displayio.release_displays()
fb = videocore.Framebuffer(1920, 1080)
display = framebufferio.FramebufferDisplay(fb)

Diese Zeilen erzeugen bei einem Neustart (von der Stromversorgung trennen und wieder verbinden) eine Auflösung von 1920 x 1080 Pixeln, was im Prinzip jedes HDMI-Display darstellen kann.

Hinweis: Es kann sinnvoll sein, nur mit der Hälfte der Auflösung von 960 x 540 zu arbeiten. Ein zu großer Framebuffer führt zu einer verzögerten Darstellung.

Text darstellen

Damit eine einfache Text-Darstellung auf dem Display funktioniert braucht man das Modul „adafruit_display_text“ aus dem „Adafruit CircuitPython Bundle“.

Der folgende Programmcode ist weitestgehend selbsterklärend.

  • Zuerst muss das Display initialisiert werden.
  • Es folgen die Parameter für den Text (Größe, Schrift, Farben).
  • Dann wird das Textfeld generiert und die Koordinaten gesetzt.
  • Und am Ende wird das Textfeld angezeigt.
# Bibliotheken laden
import board
import displayio
import terminalio
from adafruit_display_text import label

# Display initialisieren
display = board.DISPLAY
display_group = displayio.Group()

# Einstellungen: Schrift
text       = "Hallo Welt"
font       = terminalio.FONT
size       = 2
color      = 0xFFFFFF
bg_color   = 0x000000

# Textfeld (Label) generieren
text_area = label.Label(font, text=text, color=color, background_color=bg_color, scale=size)

# Koordinaten setzen
text_area.x = 200
text_area.y = 100

# Textfeld hinzufügen
display_group.append(text_area)

# Anzeigen
display.root_group = display_group

Bild darstellen

Um ein Bild auf dem Display darzustellen muss es das Bildformat Bitmap (BMP) haben. Ein anderes Format, wie JPG, PNG oder andere werden nicht unterstützt. Der Grund ist, dass CircuitPython für Mikrocontroller gedacht ist und auf deren Hardware mangels Rechenleistung und Speicher oft keine komplizierten und komprimierten Bildformate verarbeitet werde können.

Das folgende Beispiel zeigt, wie eine Bitmap-Datei (.bmp) geladen und auf einem Display angezeigt wird.

Nicht alle BMP-Dateiformate werden unterstützt. Sie müssen sicherstellen, dass Sie eine indizierte BMP-Datei haben. Normalerweise ist das der Fall, wenn man eine beliebige Bilddatei ins Bitmap-Format konvertiert.

# Bibliotheken laden
import board
import displayio

# Display initialisieren
display = board.DISPLAY
display_group = displayio.Group()

# Bild laden
bitmap = displayio.OnDiskBitmap("/demo.bmp")

# Create a TileGrid to hold the bitmap
bitmap_grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader)

# Koordinaten setzen
bitmap_grid.x = 0  # Abstand vom linken Rand
bitmap_grid.y = 0  # Abstand vom oberen Rand

# Bild hinzufügen
display_group.append(bitmap_grid)

# Anzeigen
display.root_group = display_group

Hinweis: Es kann sinnvoll sein, nur mit einer Auflösung von 960 x 540 Pixeln zu arbeiten. Ein zu großer Framebuffer führt zu einer verzögerten Darstellung.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Elektronik-Set Raspberry Pi Edition
Elektronik-Set Raspberry Pi Edition

Elektronik erleben mit dem Raspberry Pi mit Python und GPIO Zero

  • Leichter Einstieg ins Hardware-nahe Programmieren mit Python und GPIO Zero
  • Experimentieren und Programmieren ohne Vorkenntnisse
  • Sofort Loslegen mit All-in-one-Set

Elektronik-Set jetzt bestellen

Elektronik-Fibel

Elektronik einfach und leicht verständlich

Die Elektronik-Fibel ist ein Buch über die Grundlagen der Elektronik, Bauelemente, Schaltungstechnik und Digitaltechnik.

Das will ich haben!