Sense HAT mit Python steuern

Das [Sense HAT](https://amzn.to/2NTbySV ist ein Erweiterungsboard für den Raspberry Pi. Es stellt die folgenden Funktionen zur
Verfügung:

  • eine Matrix von 8×8 RGB-Leuchtdioden, die in verschiedenen Farben leuchten können
  • einen Mini-Joystick
  • diverse Sensoren für Beschleunigung, Rotation, Magnetismus, Temperatur,
    Luftfeuchtigkeit und Luftdruck

Das Board kostet beinahe so viel wie ein Raspberry Pi — aber es eröffnet auch faszinierende neue Möglichkeiten, anschauliche Beispiele mit schönem visuellen Feedback zu realisieren.

Raspberry Pi 3 B+ mit aufgestecktem Sense HAT

Die Abkürzung HAT steht für Hardware Attached on Top. Das bedeutet, dass das Board direkt auf die Steckerleiste des Raspberry Pi gesteckt werden kann. Die zur Ansteuerung des Sense HATs erforderlichen Bibliotheken inklusive des sense_hat-Moduls sind bei aktuellen Raspbian-Versionen standardmäßig installiert. (Bei älteren Raspbian-Installationen führen Sie gegebenenfalls sudo apt install sense-hat aus und starten den Minicomputer dann neu.)

Hello World!

Das Modul sense_hat für Python 3 macht erste Tests des Boards denkbar einfach. Sie erzeugen ein Objekt der SenseHat-Klasse und können dann mit show_message eine Laufschrift anzeigen. Je nachdem, in welcher Lage sich der Raspberry Pi Ihnen gegenüber befindet, können Sie das Display durch die Veränderung der rotation-Eigenschaft in 90-Grad-Schritten rotieren.

#!/usr/bin/env python3
from sense_hat import SenseHat
sense = SenseHat()
sense.rotation = 180  # Display-Rotation
sense.show_message("Hello, Sense HAT!")

Display Pixel für Pixel steuern

Mit clear können Sie das gesamte Display in einer Farbe zum Leuchten bringen. Die Farbe übergeben Sie als Tupel oder Liste mit drei Werten zwischen 0 und 255 für den Rot-, Grün- und Blau-Farbanteil. Das Display leuchtet nach dem Programmende weiter. Wenn Sie das nicht möchten, führen Sie clear ohne Parameter aus und schalten so alle LEDs aus.

# Beispieldatei sense-pixel.py
from sense_hat import SenseHat
import time

sense = SenseHat()
blue = (0, 0, 255)
sense.clear(blue)   # ganzes Display leuchtet blau
time.sleep(2)
sense.clear()       # Display ausschalten

Mit set_pixel(x, y, farbe) können Sie ein Pixel an einem beliebigen Koordinatenpunkt in der gewünschten Farbe zum Leuchten bringen. Das Koordinatensystem hat seinen Ursprung links oben, die Achsen zeigen nach rechts und nach unten.

# LED links oben rot
red = (255, 0, 0)
sense.set_pixel(0, 0, red)

Wenn Sie alle 64 Pixel auf einmal verändern möchten, verwenden Sie die Methode set_pixels. Sie erwartet eine Liste mit 64 Farbtupeln. Die ersten 8 Listeneinträge gelten für die erste Zeile, die nächsten 8 für die zweite Zeile usw.

In den folgenden beiden Schleifen wird eine geeignete Liste zusammengestellt. Dabei ergibt sich ein Verlauf zwischen den Farben schwarz, rot, grün und weiß.

lst = []
for row in range(8):
    for col in range(8):
        lst += [(row*32, col*32, 0)]
sense.set_pixels(lst)

Einen Pixel über das Display »rollen« lassen

Der Sense HAT enthält ein Gyroskope, um die aktuelle Drehung des Raspberry Pis um seine Achsen festzustellen. Wenn Sie die Methode get_orientation ausführen, erhalten Sie drei Winkel mit einem Wertebereich von jeweils 0 bis 360 Grad. Uns interessieren hier nur zwei Winkel: roll gibt die Drehung um die Längsachse an, pitch die Rotation um die Querachse. Hintergrundinformationen zu diesen Winkeln finden Sie hier:

https://projects.raspberrypi.org/en/projects/sense-hat-marble-maze/7
https://de.wikipedia.org/wiki/Roll-Nick-Gier-Winkel

roll und pitch verraten uns also, ob der Raspberry Pi samt dem aufgesteckte Sense HAT eben liegt (dann sind beide Winkel nahe 0 bzw. 360) oder um seine Achsen gekippt wurde.

Zur anschaulichen Interpretation dieser Daten bringt das folgende Beispielprogramm in der Mitte des Displays einen Pixel zum Leuchten. Wenn Sie den Raspberry Pi samt Sense HAT nun in die entsprechende Richtung verdrehen (kippen), »rollt« die leuchtende LED wie eine Kugel in diese Richtung, bis das Ende des Displays erreicht ist. Das funktioniert auch diagonal, wenn der Minicomputer in beiden Achsen verdreht ist.

Kurz einige Erläuterungen zum Code. Die Funktion sedLET ist dafür zuständig, die Leuchtdiode an der gerade aktuellen Position rot leuchten zu lassen, die an der bisherigen Position aber auszuschalten.

Im Setup-Teil des Programms wird die Startposition für die leuchtende LED festgelegt und setLED einmal aufgerufen.

Es folgt eine Endlosschleife, wo ca. dreimal pro Sekunde die Winkel pitch und roll ausgewertet werden. Je nach Drehung wird die LED-Position verändert.

Das Programm endet, sobald der Benutzer Strg+C drückt.

#!/usr/bin/env python3
from sense_hat import SenseHat
from time import sleep

# LED an aktueller Position einschalten, an der
# bisherigen ausschalten
def setLED(x, y):
    global oldX, oldY
    # LED an alter Position ausschalten ...
    sense.set_pixel(oldX, oldY, (0, 0, 0))
    # und an neuer Position einschalten (rot) und
    # diese Position merken
    sense.set_pixel(x, y, (255, 0, 0))
    (oldX, oldY) = (x, y)

# Setup
sense = SenseHat()
sense.clear()
(x, y)       = (4, 4)  # Startposition
(oldX, oldY) = (0, 0)  # vorige Position
setLED(x, y)

# Event-Loop
print("Programmende mit Strg+C")
try:
    while True:
        o = sense.get_orientation()
        print(o)
        if 20 < o['pitch'] < 90 and x>0:
            x -= 1
        if 270 < o['pitch'] < 340 and x<7:
            x += 1
        if 270 < o['roll'] < 340 and y>0:
            y -= 1
        if 20 < o['roll'] < 90 and y<7:
            y += 1
        # LED an neuer Position einschalten
        setLED(x, y)    
        sleep(0.3)

except KeyboardInterrupt:
    sense.clear()
    print("Programmende")

Quellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Wenn Sie hier einen Kommentar absenden, erklären Sie sich mit der folgenden Datenschutzerklärung einverstanden.