Eine Besonderheit dieses Buches ist, dass das Titelbild mit einem Python-Programm erstellt wurde. Mit diesem Programm wurde ein Foto des Raspberry Pi im PPM-Format geladen und dann bearbeitet. In den Feldern am oberen Rand der Benutzungsoberfläche kann man die Farben durch Anklicken ändern. Es wird dann eine neue Zufallsfarbe ausgewählt. Man klickt so lange, bis man mit den Farben zufrieden ist. Wenn die Schaltfläche Bild bearbeiten angeklickt wird, passiert Folgendes: Alle Pixel werden einer von vier Helligkeitsstufen zugeordnet und dann mit einer der vier Farben eingefärbt.
Abb. D.1: Programm zur Bildbearbeitung, mit dem das Titelbild erstellt worden ist
from tkinter import * from random import * def newColor(event): # Zufallsfarbe global colors nr = int(event.widget["text"]) digits="0123456789ABCDEF" newColor ="#" for i in range(3): newColor += choice(digits) colors[nr] = newColor colorLabels[nr].config(bg=colors[nr]) def process(): # Bildbearbeitung global image image = PhotoImage(file=path) label.config(image=image) for x in range (image.width()): for y in range (image.height()): c = image.get(x, y) brightness = int(c[0])+ int(c[1]) + int(c[2]) if brightness < 150: image.put(colors[0], (x, y)) elif brightness < 300: image.put(colors[1], (x, y)) elif brightness < 450: image.put(colors[2], (x, y)) else: image.put(colors[3], (x, y)) def zoomImage(): global image, label image=image.zoom(2) label.config(image=image) def loadImage(): global image, label, path p = filedialog.askopenfilename() if p: try: image = PhotoImage(file=p) label.config(image=image) path = p except: messagebox.showerror("", "Foto unleserlich") def saveImage(): p = filedialog.asksaveasfilename() if p: image.write(p) # Widgets window = Tk() window.title("Bildbearbeitung") frame = Frame(master=window) label = Label(master=window, font = ("Arial", 14), text="Bitte ein Bild laden") buttonImage = Button(master=frame, text="Bild bearbeiten", width=12, font = ("Arial", 12), command=process) buttonLoad = Button(master=frame,text="Laden", width=12, font = ("Arial", 12), command=loadImage) buttonSave = Button(master=frame, text="Speichern", width=12, font = ("Arial", 12), command=saveImage) buttonZoom = Button(master=frame,text="Zoom", width=12, font = ("Arial", 12), command=zoomImage) colors =["#106", "#0c7", "#DC5", "#9AF"] colorLabels = [] for i in range(4): colorLabels.append(Label(master=frame, font=("Arial", 12), text=str(i), width=5, bg=colors[i])) colorLabels[i].bind("<1>", newColor) # Layout frame.pack() buttonImage.pack(side=LEFT, padx=2, pady=2) buttonLoad.pack(side=LEFT, padx=2, pady=2) buttonSave.pack(side=LEFT, padx=2, pady=2) buttonZoom.pack(side=LEFT, padx=2, pady=2) for cl in colorLabels: cl.pack(side=LEFT, padx=2, pady=2) label.pack() window.mainloop()
Ein Raspberry Pi wird gelegentlich für eine Maschine verwendet, auf der immer nur ein bestimmtes Python-Programm laufen soll, z.B. ein Server oder ein permanenter Dienst wie eine Uhr. Man möchte dann, dass beim Einschalten des Gerätes dieses Programm automatisch gestartet wird. Dazu müssen Sie auf Ihrem RPi ein Autostart-Skript einrichten.
Nehmen wir an, das Python-Programm, das gestartet werden soll, ist eine Uhr (siehe Kapitel 7) und hat den Pfad /home/pi/digitaluhr.pyw
.
Öffnen Sie (als root) den Datei-Manager:
sudo pcmanfm
Geben Sie in das Adressfeld /home/pi/.config
ein.
Falls Sie keinen Ordner namens autostart
sehen, richten Sie einen neuen Ordner autostart
ein.
Erstellen Sie nun mit einem Texteditor ein Skript, das vom Betriebssystem Linux interpretiert wird und das Ihr Python-Programm aufruft. Dieses Skript wird im Ordner autostart
unter einem Namen mit der Extension .desktop
gespeichert (z.B. digitaluhr.desktop).
Öffnen Sie (als root) den Texteditor Mousepad.
sudo mousepad
Geben Sie folgenden Text ein:
[Desktop Entry] Encoding=UTF-8 Type=Application Name=Digitaluhr Exec=sudo python3 /home/pi/digitaluhr.pyw StartupNotify=false Terminal=false Hidden=false
Bitte beachten Sie, dass dies kein Python-Text ist!
Speichern Sie den Text im Verzeichnis /home/pi/.config/autostart
unter dem Namen digitaluhr.desktop
ab. Beachten Sie dabei, dass das Verzeichnis .config
versteckt ist. Um es sichtbar zu machen, klicken Sie im Fenster Speichern unter das Navigationsfeld mit der rechten Maustaste an. Setzen Sie einen Haken vor die Option Verborgene Dateien anzeigen.
Zum Testen starten Sie den RPi neu:
sudo reboot
Nach dem Booten müsste das Python-Programm automatisch gestartet werden.
Um das laufende Programm anzuhalten, müssen Sie den zugehörigen Prozess löschen. Das geht in zwei Schritten:
Geben Sie in der Kommandozeile das Linux-Kommando
ps -e
ein.
Sie erhalten eine Liste aller laufenden Prozesse. Suchen Sie die eine Zeile, die mit Python 3 endet. Das ist der Prozess des laufenden Python-Programms. Merken Sie sich die Nummer n
, die am Beginn dieser Zeile steht. Das ist die Prozess-ID (PID).
Beenden Sie diesen Prozess mit dem Linux-Befehl
sudo kill n
Der GPIO (General Purpose Input Output) ist eine Schnittstelle, an die Sie Sensoren wie z.B. Temperaturfühler (Input) oder Ausgabegeräte wie LEDs (Output) anschließen können.
Der GPIO des Raspberry Pi 3 besteht aus 40 vergoldeten Metallstiften (Pins). Sie sind in zwei Reihen angeordnet und befinden sich an einer Kante der RPi-Platine (siehe Abbildung B.1).
Abb. B.1: Der GPIO auf der Platine des RPi (weißer Kasten). Im Kreis ist Pin 1.
Es gibt unterschiedliche Bezeichnungen für die 40 Pins des GPIO. Wenn Sie das Python-Modul RPi.GPIO
verwenden, das in der Raspbian-Distribution mitgeliefert wird, können Sie den Modus der Pin-Bezeichnung einstellen. Im Modus BOARD entspricht die Nummer eines Ein-/Ausgabebits der Position des Pins. Fast alle Skripte in diesem Buch verwenden den Modus BOARD. Er hat den Vorteil, dass man die Nummern der Pins, die man in den Python-Befehlen verwendet, einfach durch Abzählen findet.
Ausnahme sind Projekte mit dem AD-Wandler MCP3008 in Kapitel 9. Hier verwenden wir symbolische Namen, die in Abbildung B.2 angegeben sind.
Drei Pins haben einen konstanten Spannungspegel: Pin 1 (links oben) ist auf der Platine durch P1 markiert (Kreis in Abbildung B.1). An ihm und an Pin 17 liegt eine Spannung von +3,3 Volt an. An Pin 2 und Pin 4 ist eine Spannung von +5,0 Volt. Achtung! Passen Sie auf, dass Sie niemals Pin 2 oder Pin 4 mit anderen Pins des GPIO verbinden. Das könnte Ihren RPi zerstören. Manche Leute schieben zur Sicherheit ein Stück Isolierung von einem Klingeldraht auf diese beiden Pins. Dann sind versehentliche Kurzschlüsse weitgehend ausgeschlossen. An acht Pins (6, 9, 20, 25, 30, 34, 39) ist die Masse (ground, GND).
Die übrigen Pins sind frei programmierbar und können als Ein- oder Ausgang verwendet werden. An ihnen liegt entweder die Spannung 0 Volt oder +3,3 Volt an. Diese beiden Levels repräsentieren die Wahrheitswerte False
und True
. Der maximale Stromfluss ist insgesamt 50 mA. Das reicht z.B. aus, um LEDs mit niedrigem Energieverbrauch zu betreiben.
Abb. B.2: Belegung der Pins des GPIO und symbolische Namen der programmierbaren Pins
Starten Sie Idle und probieren Sie im interaktiven Modus die GPIO-Funktionen aus.
Import des Moduls RPi.GPIO
(RPi
mit kleinem i
):
>>> from RPi import GPIO
Einstellung des Modus für die Pinbelegung:
>>> GPIO.setmode(GPIO.BOARD)
Für Pin 8 und Pin 10 des GPIO den Modus Ausgabe setzen.
>>> GPIO.setup(8, GPIO.OUT) >>> GPIO.setup(10, GPIO.OUT)
Logische Werte ausgeben:
>>> GPIO.output(8, False) >>> GPIO.output(10, True)
Mit einem Universalmessgerät (Multimeter) können Sie die Spannungen an Pin 8 und Pin 10 des GPIO prüfen. An Pin 8 liegen gegenüber der Masse (Pin 6) 0 Volt und an Pin 10 etwa 3,3 Volt an.
Wenn Sie einen Pin als Eingabekanal geschaltet haben, können Sie ihn von außen auf einen Spannungspegel bringen. Verbinden Sie den Pin mit der Masse (z.B. Pin 6), befindet er sich im Zustand False
. Verbinden Sie ihn mit +3,3 Volt (z.B. Pin 1), dann ist er im Zustand True
. Was aber, wenn der Eingangs-Pin mit nichts verbunden ist? Sie können für Pins, die als Eingabekanal genutzt werden, einen Grundzustand definieren. Beispiel:
GPIO.setup(12, GPIO.INPUT, pull_up_down=GPIO.PUD_DOWN)
Hier wird der Wahrheitswert False
als Grundzustand festgelegt. Über einen internen Pull-down-Widerstand ist der Eingang mit der Masse verbunden und hat somit den Spannungspegel 0 Volt.
Wenn Sie den Parameter pull_up_down
auf die Konstante GPIO.PUD_UP
setzen, ist True
der Grundzustand.
Die Eingänge des RPi sind durch Widerstände abgesichert. Das heißt, wenn Sie einen Eingangs-Pin mit Pin 1 (3,3 Volt) oder Pin 6 (0 Volt) verbinden, fließt nur ein ganz geringer Strom. Messen Sie es nach!
Schalten Sie Pin 12 als Eingang mit Grundzustand False
und messen Sie die Spannung gegenüber Pin 6. Es sind 0 Volt. Stellen Sie das Multimeter auf Stromstärkemessung (DCA, 2 Milliampere). Verbinden Sie den Pluspol (rot) mit Pin 1 und den Minuspol mit Pin 12. Sie messen eine Stromstärke von etwa 0,08 Milliampere.
Projekte mit dem GPIO finden Sie in den meisten Kapiteln.
Tabelle B.1 gibt einen Überblick über die wichtigsten Befehle des Moduls GPIO.
Kommando |
Erklärung |
---|---|
|
Alle Einstellungen, die in dem Programm vorgenommen worden sind, werden zurückgesetzt. |
|
Zurückgegeben wird ein Wahrheitswert ( |
|
Der GPIO-Pin mit der Nummer |
|
Setzt den Modus, in dem die Pins des GPIO nummeriert sind. Wenn der Modus |
|
Wenn |
Tabelle B.1: Übersicht über die wichtigsten Funktionen des Moduls GPIO
Um an den GPIO etwas anzuschließen, kann man einfache Jumperkabel (female-male) verwenden. Man verbindet dann einzelne Pins des RPi mit einer Steckplatine (Breadboard), auf der eine Schaltung aufgebaut ist. Manchmal ist ein Flachbandkabel mit einem Pfostenverbinder (Pfostenstecker) ganz nützlich. Für wenig mehr als einen Euro erhalten Sie die Einzelteile:
Flachbandkabel mit 40 Leitern. (Sie können auch ein breiteres Kabel nehmen und dann die überflüssigen Leiterbahnen abtrennen.)
40-poliger Pfostenverbinder
Zugentlastung
Als Hilfsmittel brauchen Sie noch einen Schraubstock. Abbildung B.3 illustriert, wie Sie vorgehen:
Setzen Sie zunächst den Bügel mit der geriffelten Innenoberfläche (nicht die Zugentlastung!) ein Stück weit auf das Hauptteil des Pfostenverbinders (Bild 1 von Abbildung B.3).
Schauen Sie sich den Pfostenverbinder genau an. An einer Stelle sehen Sie ein kleines Dreieck. (Es ist nicht leicht zu finden.) Dieses Dreieck markiert Pin 1.
Schieben Sie das Flachbandkabel durch den Spalt, sodass das rote Kabel an der Seite mit Pin 1 ist (Dreieck). Drücken Sie dann den Bügel nach unten in den weichen Kunststoff der Kabelisolierung. Spannen Sie den Stecker in einen Schraubstock und pressen Sie die Teile fest zusammen. Das Kabel sieht dann aus wie in Bild 2 von Abbildung B.3.
Setzen Sie den Zugentlastungsbügel auf wie in Bild 3 von Abbildung B.3.
Schieben Sie das andere Ende des Kabels in einer Schlaufe durch den neuen Spalt, drücken Sie den Zugentlastungsbügel ganz herunter und ziehen Sie das Kabel stramm. Es sieht dann aus wie in Bild 4 von Abbildung B.3.
Abb. B.3: Einen Pfostenstecker an ein Flachbandkabel montieren
Was machen Sie mit dem anderen Ende des Flachbandkabels? Da gibt es mehrere Möglichkeiten.
Sie lösen die Einzelkabel ab und verbinden Sie dann später einzeln mit kleinen Steckern oder Bauteilen.
Wenn Sie die Leitungen an eine Steckplatine anschließen wollen, empfiehlt es, sich Stifte anzulöten (Abbildung B.4). Sie können natürlich auch ein flexibles Leitungsende in ein Loch der Steckplatine stecken und dann mit einem Dupontkabel (Jumperkabel) fixieren.
Abb. B.4: Aufgeteiltes Ende eines Flachbandkabels mit einigen angelöteten Stiften
Der Raspberry Pi ist kein »Plug-and-play«-Gerät. In diesem Anhang finden Sie einige Hinweise, wie Sie Ihren Raspberry Pi (RPi) zu einem funktionstüchtigen Computersystem ausbauen und konfigurieren. Seit 2019 ist der Raspberry Pi 4 auf dem Markt.
Neben dem RPi benötigen Sie mindestens folgende Hardware-Komponenten:
Speicherkarte. Der Peripheriespeicher ist eine kleine Mikro-SDHC-Karte. Es werden mittlerweile mindestens 8 GB benötigt.
USB-Tastatur. Sehr komfortabel ist eine Funktastatur, weil weniger Kabel benötigt werden.
Energieversorgung. Sie können den RPi mit Batterien oder einem Netzteil betreiben. Auf der Platine des RPi gibt es einen Mikro-USB-Eingang, den Sie für die Stromversorgung verwenden können.
Monitor mit HDMI-Eingang und HDMI-Kabel (Mikro-HDMI für den Ausgang am RPi)
USB-Maus
Betriebssysteme für den RPi können Sie von der Raspberry-Pi-Website herunterladen: https://www.raspberrypi.org/software/. Das offizielle Standard-Betriebssystem ist Raspberry Pi OS (früher hieß es Raspbian), eine Debian-Variante (Linux), die speziell an den RPi angepasst ist.
Das Betriebssystem muss auf der SD-Karte installiert werden. Am einfachsten geht das mit dem Programm Raspberry Pi Imager. Verwenden Sie irgendeinen Computer mit Internetzugang und SD-Kartenleser (oder USB-Eingang und passendem Adapter) und legen Sie eine Mikro-SDHC-Karte ein. Besuchen Sie die Webseite https://www.raspberrypi.org/software/ und laden Sie das Installationsprogramm für Ihren Computer herunter. Für Windows-Systeme lautet der Name so ähnlich wie imager_1.6.1.exe. Starten Sie das Installationsprogramm und installieren Sie den Raspberry Pi Imager auf Ihrem System.
Abb. A.1: Der Raspberry Pi Imager
Starten Sie den Raspberry Pi Imager. Wählen Sie das Betriebssystem für Ihren RPi (Raspberry Pi OS) und wählen Sie die SD-Karte. Klicken Sie dann auf die Schaltfläche Schreiben.
Setzen Sie die Hardware Ihres Systems zusammen (RPi, Tastatur, Maus, Display, SD-Karte mit dem frisch erstellten Image) und schließen Sie dann die Stromversorgung an. Auf diese Weise starten Sie Ihren RPi. Er hat keinen Schalter.
Sie sehen den Desktop der grafischen Benutzungsoberfläche des Betriebssystems (Buster). Beim ersten Start erscheint in der Mitte das Anwendungsfenster eines Assistenzprogramms, das Sie durch die wichtigsten Schritte der Grundkonfiguration führt (Ländereinstellungen, Passwort, Verbindung zum WLAN etc.).
Alle Einstellungen können Sie bei Bedarf später wieder ändern.
Dazu klicken Sie oben links in der Ecke auf den Startbutton mit der Himbeere und starten Sie im Menü Einstellungen (Preferences) das Programm Raspberry Pi Konfiguration.
Abb. A.2: Das Konfigurationsprogramm des RPi mit typischen Grundeinstellungen
Eine Alternative für Freunde der Kommandozeile ist das Konfigurationsprogramm raspi-config. Sie starten es in einem LXTerminal-Fenster mit dem Kommando
sudo raspi-config
Die Oberfläche des Raspberry Pi wird gelegentlich geändert. Dieser Abschnitt beschreibt, wie sie im April 2021 aussah. Die entscheidenden Programme wird man aber auch dann finden können, wenn das Layout wieder verändert worden ist.
Abb. A.3: Die linke obere Ecke des Desktops
Am oberen Rand sehen Sie einen Streifen (Application Launch Bar) mit einigen Funktionen, die besonders häufig gebraucht werden. Die vier wichtigsten Icons sind (von links nach rechts):
das Startmenü, das den schnellen Zugang zu Standardsoftware ermöglicht;
der Webbrowser Chromium;
der Dateimanager (PCManFM);
das LXTerminal, eine Konsole zur Eingabe von Linux-Kommandos.
Wenn Sie auf die Schaltfläche mit der Himbeere (Startbutton) in der linken oberen Ecke klicken, erscheint ein Pulldown-Menü mit mehreren Untermenüs, unter anderem folgende:
Entwicklung. Hier finden Sie zwei Entwicklungsumgebungen für die Programmierung mit Python: Geany und Thonny. In diesem Buch verwenden wir aber nur die Standard-Python-Entwicklungsumgebung Idle (Integrated Development and Learning Environment). In Kapitel 1 wird erklärt, wie man sie installiert.
Internet. Hier ist es der Chromium-Webbrowser.
Unterhaltungsmedien. VLC-Mediaplayer.
Grafik. Bildbetrachter.
Zubehör. Hier gibt es das übliche Zubehör wie Taschenrechner, Bildbetrachter, Texteditor (MousePad) usw.
Help. Hilfe zum Raspberry Pi und zu Linux.
Einstellungen. Unter dieser Rubrik finden Sie Applikationen zur Konfiguration des Raspberry Pi. Mit dem Programm Recommended Software können Sie Software installieren, die vom RPi-Team empfohlen wird, z.B. LibreOffice, Mathematica oder eine Sammlung von Spielen, die mit Python programmiert worden sind.
Shutdown. Mit diesem Befehl können Sie den Raspberry Pi herunterfahren oder neu starten.
Ein wichtiges Programm ist das LXTerminal. Es ist eine Konsole, die Sie zum Eingeben von Linux-Kommandos benötigen.
Abb. A.4: Das LXTerminal-Fenster
Zu Beginn Ihrer Arbeit mit dem RPi sollten Sie die Konsole nutzen, um Ihr System auf den neuesten Stand zu bringen. Starten Sie also durch einen Doppelklick LXTerminal. Sorgen Sie dafür, dass Ihr RPi mit dem Internet verbunden ist, und aktualisieren Sie Ihr Betriebssystem mit den Kommandos
sudo apt-get update sudo apt-get dist-upgrade
Das erste Wort sudo
(do as superuser) bewirkt, dass Sie das nachfolgende Kommando in der Rolle des Systemadministrators (Superuser) starten. Beim Update und Upgrade werden Dateien geändert, für die nur der Systemadministrator (und nicht z.B. der User pi
) die erforderlichen Zugriffsrechte hat. Mit dist-upgrade
erhalten Sie die neueste Raspberry-Pi-OS-Distribution und die neuesten Versionen aller installierten Pakete.
Beachten Sie, dass das Upgrade sehr lange dauern kann. Warten Sie also geduldig, bis wieder der Prompt
pi@raspberrypi ~ $
zu sehen ist.