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.
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")
Ein Beitrag, hier oder in einer neuen Auflage des Buches, wie die gemessenen Werte (Temperatur, Luftfeuchtigkeit und Luftdruck) mit InfluxDB und Grafana aufgezeichnet und grafisch aufbereitet werden können.
Es gibt zwar eine Anleitung hierzu (https://www.circuits.dk/datalogger-example-using-sense-hat-influxdb-grafana/), diese ist meiner Meinung nach aber fehleranfällig