Zum Inhalt springen
BetaEN
Lektion 6 von 8Robotik mit LEGO SPIKE

Robotik mit LEGO SPIKE · Lektion 6 · 25 Minuten

Anzeige und Töne

Das lernst du

  • Ein eigenes Bild als Liste von Listen bauen
  • Einzelne Lichtpunkte mit Helligkeit steuern
  • Eine Statusanzeige aus Messwerten berechnen
  • Töne und Melodien abspielen

Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 2.3, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗

Die Anzeige als Liste von Listen

Die 5×5-Anzeige des Hubs kann mehr als fertige Icons. Ein eigenes Bild ist einfach eine Liste aus 5 Zeilen, und jede Zeile ist eine Liste aus 5 Helligkeiten von 0 (aus) bis 100 (ganz hell). Dieses Beispiel aus dem Buch malt ein X:

from pybricks.hubs import PrimeHub

hub = PrimeHub()

# Eigenes Muster: ein simples "X" auf der Matrix
muster_x = [
    [100, 0, 0, 0, 100],
    [0, 100, 0, 100, 0],
    [0, 0, 100, 0, 0],
    [0, 100, 0, 100, 0],
    [100, 0, 0, 0, 100],
]

hub.display.icon(muster_x)

Schau dir die Zahlen an: Die 100er bilden zwei Diagonalen – genau wie das X auf dem Hub.

Einzelne Punkte und Helligkeit

Mit hub.display.pixel(zeile, spalte, helligkeit) schaltest du einen einzelnen Punkt. Zeilen und Spalten zählen ab 0. Zusammen mit einer Schleife wird daraus eine kleine Animation:

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

hub = PrimeHub()

for spalte in range(5):
    hub.display.pixel(2, spalte, 100)
    wait(200)

for helligkeit in [80, 60, 40, 20, 0]:
    for spalte in range(5):
        hub.display.pixel(2, spalte, helligkeit)
    wait(150)

Muster ausrechnen statt abtippen

Statt jedes Bild von Hand zu schreiben, kann dein Programm es berechnen. Hier entsteht eine Treppe:

from pybricks.hubs import PrimeHub

hub = PrimeHub()

treppe = []
for zeile in range(5):
    reihe = []
    for spalte in range(5):
        if spalte <= zeile:
            reihe.append(100)
        else:
            reihe.append(0)
    treppe.append(reihe)

print(treppe)
hub.display.icon(treppe)

So baust du Statusanzeigen, die sich nach Messwerten richten – etwa wie nah ein Hindernis ist oder wie voll der Akku noch ist. Das ist deine Aufgabe.

Töne und Melodien

Der Hub hat einen kleinen Lautsprecher. hub.speaker.beep(frequenz, dauer) spielt einen Ton – die Frequenz in Hertz (je höher, desto heller), die Dauer in Millisekunden. Mit play_notes() spielst du ganze Melodien: "C4/4" ist ein C in der 4. Oktave als Viertelnote, "R/8" eine Achtelpause.

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

hub = PrimeHub()

# Drei Pieptöne, immer höher
for frequenz in [440, 660, 880]:
    hub.speaker.beep(frequenz, 150)
    wait(100)

# Eine kleine Fanfare
hub.speaker.play_notes(["C4/8", "E4/8", "G4/8", "C5/4", "R/8", "G4/8", "C5/2"], tempo=120)

Im Simulator hörst du die Töne über deinen Lautsprecher. Mit dem Knopf 🔊 Ton an am virtuellen Hub schaltest du sie aus. Ein Ton ist ein super Signal: „Ziel erreicht“, „Hindernis!“ oder „Batterie fast leer“.

Tipp aus dem Buch: Eigene Muster sind super für kleine Statusanzeigen: ein Häkchen bei Erfolg, ein Ausrufezeichen bei einem Fehler oder ein Pfeil für die Fahrtrichtung.

Deine Aufgabe

Jetzt bist du dran

Bau eine Füllstandsanzeige für den Akku. Schreib eine Funktion fuellstand(prozent), die ein 5×5-Muster zurückgibt: Pro angefangene 20 % leuchtet eine Zeile mehr, von unten nach oben (Helligkeit 100). Bei 0 % ist alles aus, bei 1 bis 20 % leuchtet nur die unterste Zeile, bei 100 % alles. Zeig am Ende fuellstand(60) auf dem Hub an.

from pybricks.hubs import PrimeHub

hub = PrimeHub()


def fuellstand(prozent):
    muster = []
    # baue 5 Zeilen mit je 5 Werten
    return muster


hub.display.icon(fuellstand(60))

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

from pybricks.hubs import PrimeHub

hub = PrimeHub()


def fuellstand(prozent):
    zeilen_an = (prozent + 19) // 20
    muster = []
    for zeile in range(5):
        if zeile >= 5 - zeilen_an:
            muster.append([100, 100, 100, 100, 100])
        else:
            muster.append([0, 0, 0, 0, 0])
    return muster


hub.display.icon(fuellstand(60))