Bei AZ-Delivery finden Sie, neben spannenden Projekten mit unseren MicroControllern, auch einige interessante Themen mit dem Raspberry Pi. Gegebenenfalls haben Sie schon Erfahrung mit dem Raspberry Pi, im folgenden Pi genannt, gesammelt oder sind noch komplett unerfahren mit diesem Thema?! Vllt. kommt auch die Scheu, weil Sie Linux nicht kennen und Angst haben, etwas falsch zu machen?
Diese Blogserie soll den Schlussstrich ziehen und Ihnen den Pi und auch Linux, in diesem Fall Raspbian, näherbringen und auch ein Stück weit erklären. Zu tief soll das Ganze nicht gehen, dafür gibt es entsprechende Fachlektüre, es soll aber der Grundstein gelegt werden, damit Sie mit dem Pi umgehen und auch kleinere Projekte in Python umsetzen können.
Darf ich vorstellen der Raspberry Pi, kurz Pi
Sie werden wahrscheinlich nicht drumherum gekommen sein, schon mal einen Raspberry Pi, kurz Pi, in den Händen gehalten oder zumindest gesehen zu haben, siehe Abbildung 1.
Abbildung 1: Raspberry Pi Model 3B
Das Herzstück vom Pi ist der SoC von Broadcom mit Arm-Chip. SoC ist die Kurzform für System-on-a-chip und beschreibt die Bauweise für einen (Micro-)Chip, der alle nötigen Funktionen in sich vereint. Der erste Pi war mit einer Taktrate von 700MHz nicht gerade der Schnellste, da man mit dem Raspberry Pi 4 Mod. B schon eine Taktrate von 1,5GHz zur Verfügung hat. Jedoch konnte und kann man den Pi immer noch übertakten, was sich aber auf die Lebensdauer vom Pi schlägt. Mit anfänglich 256MB bzw. 512MB RAM, die man sich mit der verbauten GPU auf dem SoC-Chip auch noch teilen muss, waren dem Projekt in Sachen Speicher zunächst starke Grenzen gesetzt. Im Vergleich, der Raspberry Pi 4 hat mittlerweile stolze 8GB RAM in der größten Ausführung! Als Speicherplatz für das Betriebssystem wird eine (Micro-)SD-Karte genutzt, wobei es seit dem Pi 3 auch möglich ist, via USB-Speicher das Betriebssystem zu starten. Je nach Modell stehen 2 oder 4 USB-Anschlüsse zur Verfügung, sowie LAN und ggf. sogar WLAN. Ein herausstechendes Merkmal vom Pi sind die mittlerweile 40 GPIO-Pins, mit denen Sie separate Hardware anschließen können, siehe Abbildung 2.
Abbildung 2: Die GPIOs des Raspberry Pi 3B
Um bei den einzelnen Komponenten kurz zu bleiben, soll neben der GPIO-Leiste noch weitere Hardware beschrieben werden siehe Abbildung 3 und Tabelle 1.
Abbildung 3: Zusammenfassung weiterer interessanter Hardware
Hardwarebauteil | Information |
---|---|
SoC-Chip | Je nach Model vom Pi mit mehr oder weniger GHz. Verbaut ist in dem Chip neben der CPU auch die GPU |
RAM | Je nach Modell und Ausführung sieht der RAM anders aus und hat eine andere Größe. Der aktuelle Pi 4 kann bis zu 8 GB RAM vorweisen |
USB-Ports | Beim Pi3B schon mit 2xUSB3.0 und 2xUSB 2.0 Bei den neueren Pis ebenfalls in dieser Konfiguration, darunter nur USB2.0 |
Ethernet-Anschluss | Beim Pi 3 B maximal 300MB/s da über USB2.0 geführt |
Klinkenanschluss | Für den Sound |
Camera-Port | Zum Anschluss einer kompatiblen Raspberry Pi Camera |
HDMI-Anschluss | Je nach Pi-Modell mit einem oder mehreren HDMI-Anschlüssen, hier geprüft werden muss, ob es ein HDMI, Midi-HDMI oder Mini-HMID-Anschluss ist |
Power-In | Via USB-Mini oder USB-C, variiert je nach Pi-Modell |
Display-Port | Zum Anschluss eines kompatiblen Displays |
Tabelle 1: Hardwarebeschreibung
Aber warum ist das nun genau wichtig? Je nach Ihrer Aufgabenstellung braucht es einen anderen Pi, um das Projekt umzusetzen. So ist die NAS-Lösung openmediavault gerade so mit einem Raspberry P 3 Model B, besser wäre ein Raspberry Pi 4 mit 4GB, oder ein einfacher Webserver mit einem alten Raspberry Pi 2 umsetzbar. Mein privater MagicMirror brauchte schon einen Raspberry Pi 3 Model B+, da der Umfang der Daten einen älteren Raspberry Pi überfordern würde. Sie sehen also, es ist für Ihr Projekt schon im Vorfeld wichtig zu wissen, welche Mindestanforderungen benötigt werden.
Das passende Zuhause für den Raspberry Pi
Bei AZ-Delivery gibt es aktuell, Stand 10.2021, den Raspberry Pi 3 Modell B. Ein Gehäuse, Stromzufuhr oder SD-Karte, ist im Lieferumfang nicht enthalten. Elektronik, wozu auch der Pi zählt, einfach rumliegen zu lassen, ist keine gute Idee. Daher sollte der Pi immer in ein passendes Gehäuse gepackt werden, was natürlich von der Art des Projektes abhängt. Als richtiger Maker kann man sich auch einfach ein Gehäuse selbst drucken, aber es gibt eine große Auswahl von verschiedenen Händlern. Da ich viel mit dem Pi im Bereich NAS, Webserver, DNS-Filter oder 3D-Druckerserver arbeite, möchte ich natürlich ein nützliches und hochwertiges Gehäuse für meine Pis haben. Ohne hier jetzt Werbung machen zu wollen, nutze ich in den meisten Fällen Gehäuse von geekworm.com und verbaue auch die entsprechenden Zusatzmodule dafür. Aktuell habe ich 3 Cases von geekworm und eins der Firma DeskPi. Letzteres hat den Vorteil, dass ich auf alle GPIOs zugreifen kann, was bei den Gehäusen von geekworm teilweise nicht der Fall ist. Modifikationen, in Form von unschönen Bearbeitungen am Gehäuse, würde die Optik zerstören. Daher achten Sie immer auf das richtige Gehäuse, für das passende Projekt.
Kommen wir noch einmal auf die GPIOs zurück
Die GPIOs habe ich schon zuvor angesprochen, siehe Abbildung 2. Anders als bei einem normalen PC, hat der Einplatinenrechner 40 Steckverbindungen, die sogenannten GPIOs, um Sensoren, Displays oder Aktoren anzusteuern. Damit sind Sie in der Lage, Programme zu entwickeln, die mit der Außenwelt interagieren. In früheren Versionen standen dem Pi 28 GPIOs zur Verfügung, was auch einige Projekte stark einschränkte. Wichtig zu wissen ist, dass Sie zwar 5V vom Pi abgreifen können, die GPIOs jedoch maximal 3,3V vertragen. Sensoren oder Aktoren, die 5V am Ausgang zurückgeben, brauchen zwingend einen zwischengeschalteten Konverter, andernfalls zerstören Sie die GPIOs oder sogar schlimmer, den Pi. Vom Prinzip können Sie sich die GPIOs genauso vorstellen, wie die Pins von einem ESP32 NodeMCU Module WLAN WiFi Development Board mit CP2102. Der Unterschied ist, dass Sie keinen MicroController programmieren, sondern Programme auf Basis eines Betriebssystems. Je nach Version vom Pi sollten Sie genau prüfen, welcher Pin für was zuständig ist, siehe Abbildung 4.
Abbildung 4: GPIO-Belegung für Raspberry Pi 3 und 4, https://www.raspberrypi.com/documentation/computers/os.html#gpio-and-the-40-pin-header
Darf ich vorstellen Raspbian bzw. Linux
An dieser Stelle kommt nun ein Thema, was der wohl häufigste Grund dafür ist, warum die Leute den Pi meiden. Die Rede ist von dem häufig zum Einsatz kommenden Betriebssystem Raspbian, siehe Abbildung 5, was als Grundlage debain nutzt. Der Name Raspbian setzt sich zusammen aus Raspberry Pi und debian, wobei es mittlerweile mehr als nur dieses eine Betriebssystem gibt.
Abbildung 5: Offizielles Raspbian Logo
Debian ist eine sogenannte Linux-Distribution und gerade bei dem Wort Linux kriegen viele Leute Panik oder Angstschweiß auf der Stirn. Grund ist, dass Linux in seinen Anfängen schwer zu installieren und zu benutzen war. Dieses Bild wird und wurde auch dadurch geprägt, dass in vielen Actionfilmen Hacker mit vielen Monitoren und vielen offenen Terminals gezeigt werden, auf denen für „Normalsterbliche“ unlesbare Kommandos eingegeben und unverständliche Ausgaben zurückgeliefert werden. Meist wurde dann behauptet, dass es sich hierbei um ein kompliziertes Betriebssystem, meist Linux, handeln würde. So extrem, wie Hollywood uns das weiß machen will, ist es dann doch nicht, aber Linux ist eben kein Windows, welches, Stand 22.09.2021, knapp 75% Marktanteil weltweit ausmacht. Linux hat neben dem reinen Terminal auch eine grafische Oberfläche. Das großartige ist, die grafische Oberfläche und das Terminal können parallel verwendet werden, ähnlich wie Sie die Kommandozeile unter Windows parallel verwenden können.
Aber warum nutzt die Raspberry Pi Foundation denn bitte Linux, wenn es doch so kompliziert zu seinen scheint und mit einem Marktanteil von knapp 2,3% weltweit recht wenig zum Einsatz kommt. Das Stichwort ist OpenSource und das Linux als Betriebssystem, mit einigen Ausnahmen, kostenlos zur Verfügung steht! Für eine Lizenz für Windows oder MacOS müssen Sie entsprechend Geld bezahlen, was bei Linux eben nicht der Fall ist. Zudem ist, in diesem Fall auf Raspbian bezogen, die Hardwareanforderung minimal und kann auch für die sogenannten Arm-Chips verwendet werden. Als Blick über den Tellerrand sei auch angemerkt, dass die Supercomputer und viele große Server von Namenhaften Anbietern, alle mit Linux laufen. Problem bei den gängigsten Betriebssystemen ist die Hardwarevoraussetzung, die gerade bei der CPU mittlerweile eine 64bit-Architektur verlangt. Andere Chips, wie z.B. der SoC-Chip vom Raspberry Pi, werden nicht oder nur teilweise unterstützt.
Interessant gerade für Anfänger ist ein Raspbian in der aktuellen Version, das auch schon alle gängigen Programme mitbringt. Hier müssen Sie bei der Installation auf die SD-Karte bzw. beim Runterladen des Images darauf achten, ob Sie die Lite- oder Full-Version ausgewählt haben. Ersteres ist ein Raspbian ohne Desktop und es fehlen viele Programme, letzteres ist quasi für Anfänger das Rundumsorglospaket. Wie Sie Raspbian auf ihren Pi installieren, finden Sie in dem passenden eBook von AZ-Delivery. Mittlerweile gibt es aber von der Raspberry Pi Foundation ein simpleres Tool, den Raspberry Pi Imager, welches es für alle gängigen Betriebssysteme gibt, siehe Abbildung 6.
Abbildung 6: Der Raspberry Pi Imager
Sofern Sie wie ich den Pi größtenteils nur via SSH nutzen, bietet das Tool über die Tastenkombination Strg + Shift + X ein spezielles Menü, siehe Abbildung 7, indem Sie schon im Vorfeld z.B. den Hostname ändern oder direkt das SSH aktivieren können.
Abbildung 7: OS-Modifizierung
Die Raspberry Pi Foundation hat auch ein entsprechendes Video dazu veröffentlicht.
Damit ersparen Sie sich schon während der Installation des Betriebssystems eine Menge Nacharbeit für die Konfiguration. Auch andere Betriebssysteme wie OctoPrint oder RetroPi können bequem über den Raspberry Pi Imager ausgewählt werden. Tatsächlich können Sie auch ein Image aus dem Internet runterladen, wie z.B. Kali-Linux für den Raspberry Pi. Probieren Sie es einfach selbst aus, dann werden Sie die Vorzüge schon erkennen.
Das Rechtesystem in Linux
Jetzt wird es etwas sehr theoretisch und am Anfang wahrscheinlich auch ein verwirrendes Thema. Linux verwendet, ähnlich wie MacOS oder Windows, ein Rechtesystem, wobei das Rechtesystem von MacOS dem vom Linux bzw. UNIX-Systemen am ähnlichsten ist. Wie in jedem gängigen Betriebssystem, gibt es Nutzer und Gruppen, wobei Linux bei dem Benutzer unterscheidet zwischen Eigentümer und sonstigen Benutzern. Jeder Benutzer kann einer oder mehreren Gruppen hinzugefügt werden, oder für ihn Sonderrechte eingeräumt werden.
An diesem Punkt wird es bei Linux aber deutlich komplexer, da Linux die Rechteverwaltung auf die Spitze treibt. In der Regel darf der einfache Benutzer nur in seinem Arbeitsverzeichnis, dem sogenannten Home-Verzeichnis, tun und lassen was er will. Daten können angelegt, bearbeitet oder gelöscht werden, wie es beliebt. Anders sieht es da mit den Home-Verzeichnissen anderer Benutzer aus und sogar anderen Verzeichnissen in Linux. Damit Sie darauf zugreifen können, müssen entsprechende Rechte vergeben werden. Dabei unterscheidet Linux, wie schon oben geschrieben, zwischen Eigentümer, Gruppe und sonstige Benutzer.
Grundlegend kann jeder dieser oben genannten Rechtegruppen die Attribute lesen, schreiben und ausführen vergeben. Bei Ordnern und Dateien können diese „Rechte“ eingeräumt werden. Sind Sie nicht der Eigentümer oder nicht in der Gruppe und dürfen als sonstiger Benutzer nicht auf Dateien oder Ordner zugreifen, dann wird ihnen der Zugriff auf Ordner oder Dateien verweigert. An dieser Stelle möchte ich nicht zu tief ins Detail gehen, da allein schon dieses Thema Bücher füllen könnte. Ich verweise da gerne auf Wikipedia, die das Thema sehr einfach und anschaulich dokumentiert haben. Die Anhänger von Windows dürfte ich wahrscheinlich nur erbost haben, da ja Windows ein erweitertes Rechtesystem hat, aber um ehrlich zu sein, mehr als die UNIX-Dateirechte braucht es in der Regel nicht.
Die Raspbian Oberfläche und ein kleines Projekt
Nun soll der Desktop näher betrachtet werden, siehe Abbildung 8. Legen Sie die MicroSD-Karte in den Pi, stecken Stromzufuhr, Monitor, sowie Maus und Tastatur an und warten Sie, bis der Pi hochgefahren ist. Die Taskleiste ist, wie bei vielen Linux-Distributionen, am oberen Bildschirmrand. Sie haben ein Startmenü auf der linken Seite und auf der rechten Seite wichtige Informationen, wie Uhrzeit, Lautstärke, Ethernet und weitere frei konfigurierbare Widgets, die Sie auswählen können.
Abbildung 8: Die Raspbian Oberfläche
Auf dem Screenshot sehen Sie, dass ich mir zusätzlich die Prozessortemperatur und Prozessorauslastung anzeigen lasse. Das gibt mir persönlich einen Überblick, wie stark der Raspberry Pi gerade ausgelastet ist.
Das Startmenü wird Ihnen, anders als bei Windows, vllt. auch merkwürdig vorkommen, siehe Abbildung 9.
Abbildung 9: Startmenü von Raspbian
Hier wird unterteilt, für welchen Zweck das Programm gedacht ist. Unter Büro finden Sie z.B. LibreOffice und unter Entwicklung die beiden begehrten Entwickleroberflächen Geany und Thonny Python IDE. Letzteres ist eine Entwicklungsumgebung für Python, womit nun auch schon geklärt ist, dass auf dem Raspbian standardmäßig Python 2 und 3 installiert ist. Diese Programmieroberfläche ist auch super geeignet, um den Raspberry Pi Pico zu programmieren. Wie genau Sie ermitteln, welche Programme installiert sind und wie Programme oder Bibliotheken installiert oder gelöscht werden, soll Teil des nächsten Beitrags sein.
Im letzten Abschnitt, soll ein 0,96“-OLED-Display Informationen über den Pi anzeigen. Gerade wenn man z.B. nicht weiß, welche IP-Adresse der Pi hat, könnte zwar ein Netzwerkscanner genutzt werden, interessanter wäre es doch aber, wenn auf dem Display genau diese Informationen angezeigt werden. Das ist ein super Projekt, um sich mit dem Betriebssystem und der GPIO-Steckleiste auseinanderzusetzen.
Zunächst muss, sofern nicht schon geschehen, bei dem Pi die i2c-Schnittstelle aktiviert werden, siehe Abbildung 10. Dazu navigieren Sie im Startmenü zu Einstellungen und dann auf Raspberry Pi Konfiguration.
Abbildung 10: i2c-Schnittstelle aktivieren
Im Reiter Schnittstelle aktivieren Sie I2C und starten den Raspberry Pi neu. Danach steht die Schnittstelle zur Verfügung. Im Anschluss installieren Sie noch benötigte Bibliotheken und Tools, siehe Abbildung 11 und Code 1.
Abbildung 11: Installieren benötigter Programme
sudo apt-get install python-smbus i2c-tools
Code 1: Installation von benötigten Bibliotheken
Theoretisch sollten schon diese Pakete vorhanden sein, aber besser noch einmal überprüfen, je nach alter von Raspbian könnten die Pakete auch fehlen oder ein Update vertragen. Damit das 0,96“-OLED-Display auch angesteuert werden kann, braucht es noch eine entsprechende Programmierbibliothek und auch Beispiele. Für Beispielskripte klonen Sie über das Terminal von Git ein entsprechendes Repository von adafruit, siehe Code 2.
git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306.git
Code 2: Benötigtes Git-Repository clonen
Im Anschluss führen Sie Code 3 aus, um die benötigte Bibliothek adafruit-circuitpython-ssd1306 mit allen Abhängigkeiten runterzuladen und auch zu installieren.
sudo pip3 install adafruit-circuitpython-ssd1306
Code 3: Installieren der benötigten Python-Bibliothek
Jetzt wird das OLED-Display noch mit dem Pi verbunden, was bei vier Kabeln noch überschaubar ist, siehe Abbildung 12. Achten Sie darauf, dass das Display 3,3V benötigt und Sie die Pins für SDA und SCL richtig auf dem Raspberry Pi anschließen. Auch hier hilft ein Blick in die Spezifikation, falls Sie unsicher sein sollten.
Abbildung 12: Display an den Pi anschließen
Um zu testen, ob das Display und die Bibliothek nun auch funktionieren, wechseln Sie in das Verzeichnis „examples“ vom vorher geklonten Repository Adafruit_CircuitPython_SSD1306 und führen das Beispiel shapes.py aus. Dies geht am einfachsten, wenn Sie Code 4 benutzen.
cd Adafruit_CircuitPython_SSD1306
cd examples
python3 ssd1306_pillow_demo.py
Code 4: Das Codebeispiel ssd1306_pillow_demo.py nutzen
Sie sollten auf dem Display nun eine Hallo Welt – Nachricht lesen, siehe Abbildung 13.
Abbildung 13: Hello world vom Demoskript
Da die Vorbereitungen nun abgeschlossen sind, möchte ich für meine Anzeige eine modifizierte Version vom Beispiel „stats.py“ nutzen. Modifiziert in dem Sinne, da ich zum einen für meinen Pi eine 750GB-HDD als Bootmedium nutze und ich teilweise andere Informationen, wie CPU-Temperatur und richtig angezeigte Einheiten für RAM und Speicher haben möchte.
Öffnen Sie dazu den Dateimanager und erstellen Sie einen neuen Ordner Namens RaspyStat, siehe Abbildung 14.
Abbildung 14: Neuen Ordner RaspyStat erzeugen
In diesem neuen Ordner erstellen Sie nun eine neue Datei mit dem Namen stats.py, siehe Abbildung 15.
Abbildung 15: Neue Datei stats.py erstellen
Öffnen Sie diese Datei, mit z.B. Thonny Python IDE und fügen Sie den modifizierten Quellcode aus Code 5 ein:
# SPDX-FileCopyrightText: 2017 Tony DiCola for Adafruit Industries
# SPDX-FileCopyrightText: 2017 James DeVito for Adafruit Industries
# SPDX-License-Identifier: MIT
# This example is for use on (Linux) computers that are using CPython with
# Adafruit Blinka to support CircuitPython libraries. CircuitPython does
# not support PIL/pillow (python imaging library)!
# Mod by: Joern Weise
# Mod date: 20.10.2021
# Some modifications to show wanted information on display
import time
import subprocess
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
# Create the I2C interface.
i2c = busio.I2C(SCL, SDA)
# Create the SSD1306 OLED class.
# The first two parameters are the pixel width and pixel height. Change these
# to the right size for your display!
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
# Clear display.
disp.fill(0)
disp.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a black filled box to clear the image.
draw.rectangle((0, 0, width, height), outline=0, fill=0)
# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height - padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0
# Load default font.
font = ImageFont.load_default()
# Alternatively load a TTF font. Make sure the .ttf font file is in the
# same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 9)
while True:
# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
cmd = "hostname -I | cut -d\' \' -f1"
# cmd = "hostname -I |cut -f 2 -d ' '"
IP = subprocess.check_output(cmd, shell = True )
# cmd = "top -bn1 | grep load | awk '{printf \"CPU: %.2f\", $(NF-2)}'"
# CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m -h| awk 'NR==2{printf \"Mem: %s / %s\", $3,$2}'"
MemUsage = subprocess.check_output(cmd, shell = True )
MemUsage = str(MemUsage,'utf-8')
MemUsage = MemUsage.replace("Mi","MB")
MemUsage = MemUsage.replace("Gi","GB")
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
Disk = subprocess.check_output(cmd, shell = True )
cmd = "vcgencmd measure_temp |cut -f 2 -d '='"
temp = subprocess.check_output(cmd, shell = True )
# Write two lines of text.
draw.text((x, top + 0), "IP: " + str(IP,'utf-8'), font=font, fill=255)
draw.text((x, top + 8), "Temp: " + str(temp,'utf-8'), font=font, fill=255)
draw.text((x, top + 16), MemUsage, font=font, fill=255)
draw.text((x, top + 25), str(Disk,'utf-8'), font=font, fill=255)
# Display image.
disp.image(image)
disp.show()
time.sleep(2)
Nach dem Ausführen über den grün hinterlegten Start-Button, sollte das Display wie in Abbildung 16 aussehen.
Abbildung 16: Statusanzeige auf OLED-Display
Da mir die Schrift nicht zugesagt hatte, habe ich mir die PixelOperator.ttf über http://www.dafont.com runtergeladen und im selben Verzeichnis wie meinen Quellcode abgelegt. Im gleichen Zuge habe ich die folgenden Modifikationen im Code vorgenommen, siehe Code 6, da sonst der Text nicht lesbar gewesen wäre.
# SPDX-FileCopyrightText: 2017 Tony DiCola for Adafruit Industries
# SPDX-FileCopyrightText: 2017 James DeVito for Adafruit Industries
# SPDX-License-Identifier: MIT
# This example is for use on (Linux) computers that are using CPython with
# Adafruit Blinka to support CircuitPython libraries. CircuitPython does
# not support PIL/pillow (python imaging library)!
# Mod by: Joern Weise
# Mod date: 20.10.2021
# Some modifications to show wanted information on display
# Use font ‚PixelOperator.ttf‘ for better reading
import time
import subprocess
from board import SCL, SDA
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
# Create the I2C interface.
i2c = busio.I2C(SCL, SDA)
# Create the SSD1306 OLED class.
# The first two parameters are the pixel width and pixel height. Change these
# to the right size for your display!
disp = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
# Clear display.
disp.fill(0)
disp.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a black filled box to clear the image.
draw.rectangle((0, 0, width, height), outline=0, fill=0)
# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height - padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0
# Load default font.
# font = ImageFont.load_default()
# Alternatively load a TTF font. Make sure the .ttf font file is in the
# same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
font = ImageFont.truetype('PixelOperator.ttf',16)
while True:
# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
cmd = "hostname -I | cut -d\' \' -f1"
# cmd = "hostname -I |cut -f 2 -d ' '"
IP = subprocess.check_output(cmd, shell = True )
# cmd = "top -bn1 | grep load | awk '{printf \"CPU: %.2f\", $(NF-2)}'"
# CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m -h| awk 'NR==2{printf \"Mem: %s / %s\", $3,$2}'"
MemUsage = subprocess.check_output(cmd, shell = True )
MemUsage = str(MemUsage,'utf-8')
MemUsage = MemUsage.replace("Mi","MB")
MemUsage = MemUsage.replace("Gi","GB")
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
Disk = subprocess.check_output(cmd, shell = True )
cmd = "vcgencmd measure_temp |cut -f 2 -d '='"
temp = subprocess.check_output(cmd, shell = True )
# Write two lines of text.
draw.text((x, top + 2), "IP: " + str(IP,'utf-8'), font=font, fill=255)
draw.text((x, top + 18), "Temp: " + str(temp,'utf-8'), font=font, fill=255)
draw.text((x, top + 34), MemUsage, font=font, fill=255)
draw.text((x, top + 50), str(Disk,'utf-8'), font=font, fill=255)
# Display image.
disp.image(image)
disp.show()
time.sleep(2)
Abbildung 17: Neues Font im Verzeichnis vom Skript
Zuletzt soll dieses Skript noch ausgeführt werden, sobald der Pi eingeschaltet und Raspbian hochgefahren ist. Damit das funktioniert, öffne ich ein Terminal und gebe Code 7 ein.
sudo nano /etc/rc.local
Code 7: rc.local öffnen
Anschließend füge ich am Ende, jedoch vor exit 0, Code 8 hinzu und schließe den Editor mittels Tastenkombination Strg + X.
cd /home/pi/RaspyStat
sudo python3 stats.py &
Code 8: stats.py beim Start ausführen
Eine Abfrage ob „Geänderter Puffer speichern“ bestätigen Sie mit J oder Y, je nach Spracheinstellung, siehe Abbildung 18.
Abbildung 18: Anpassung rc.local speichern
Um nun zu testen, ob das Skript auch funktioniert, starten Sie den Raspberry Pi über das Startmenü einmal neu. Bedenken Sie bitte, dass die Pfade von meinen Angaben abweichen könnten, daher passen Sie die Kommandos gemäß ihrem Pfad und Dateinamen an. Dass alles korrekt funktioniert sehen Sie, wenn ihr Display ähnlich Abbildung 19 aussieht.
Abbildung 19: Systeminfos auf dem Display nach Neustart
Zusammenfassung
Damit haben Sie zusammen mit mir schon viel über den Raspberry Pi gelernt. Sie kennen nun den Hintergrund vom Raspberry Pi, welches Betriebssystem normalerweise genutzt wird und wie dieses auf die MicroSD-Karte kommt. Zudem kennen Sie die grafische Oberfläche von Raspbian nun ein bisschen und haben ein einfaches Projekt mittels Python3 umgesetzt. Bis hierhin war es viel Input und die Lernkurve war wahrscheinlich sehr steil. Es bleibt an der Stelle nun einmal nicht aus, wie auch bei der MicroController-Programmierung, sich über weitere Lektüre oder Internetbeiträge mit dem Thema auseinanderzusetzen. Im nächsten Teil soll noch einmal erklärt werden, wie das (Datei-)System aufgebaut ist, was es mit dem Wort „sudo“ auf sich hat, wie sie die Kommandozeile mit wichtigen Befehlen nutzen und wie Sie ihren Raspberry Pi ein Stück weit absichern können. Gleichzeitig möchte ich abschließend noch spannende Projekte vorstellen, die mit den entsprechenden Anleitungen und der nötigen Zeit, von Ihnen realisiert werden könnten.
Quellcodes und weitere Projekte für AZ-Delivery von mir, finden Sie unter https://github.com/M3taKn1ght/Blog-Repo.
1 commento
Allerauer Wilhelm
Super und einfach beschrieben nur als Laie muss ich das erst zusammenbauen.
Besten Dank