Allgemeine Prinzipien der Arbeit mit Python
Für die Weiterentwicklung des Satprowler-Steuerungsprogramms habe ich mich entschieden, auf die Programmiersprache Python umzusteigen. Die Gründe für diese Änderung sind folgende:
- In Python können separate Threads programmiert werden, sodass eine parallele Programmierung möglich ist.
- Enigma Linux-Satellitenempfänger-Plugins sind in Python geschrieben. Wenn ich in Zukunft möchte, dass mein Stellungsregler mit dem Empfänger kommuniziert, muss ein solches Plugin geschrieben werden. Daher würde ich ohnehin nicht darauf verzichten, in Python zu programmieren.
- Python durchläuft eine stürmische Entwicklung. Es wurde zu einer sehr modischen Sprache, die in das Bewusstsein der breiten Öffentlichkeit gelangte. Es ist daher davon auszugehen, dass ein möglicher zukünftiger Nutzer meines Designs die Grundlagen von Python beherrschen wird.
Ich kenne auch einige Gründe, warum ein Umstieg auf Python keine gute Idee ist. Als Anhänger der klassischen Programmiersprachen Pascal oder C++ kann ich einige „Vereinfachungen“ von Python nicht akzeptieren, die meiner Meinung nach das Schreiben von Programmen recht kompliziert machen. Hauptsächlich im Bereich der Fehlersuche und -behebung. Der zweite Grund ist, dass die häufige Veröffentlichung neuer Python-Versionen die Abwärtskompatibilität geschriebener Programme erschwert. Es ist schwer zu sagen, wie Python in ein paar Jahren aussehen wird. Doch der Fortschritt lässt sich nicht aufhalten.
Für die Verwendung von Python ist es nicht erforderlich, den Raspberry Pi-Computer auszuwählen. Ein 40-poliger GPIO-Anschluss ist weiterhin wichtig, um über genügend Leitungen für die Kommunikation mit dem Stellungsregler zu verfügen. Es ist also möglich, einen Raspberry Pi 3 oder etwas neueres zu verwenden. Aber die Inbetriebnahme des Raspberry Pi hat sich seit meinen ersten Artikeln leicht verändert.
Als Betriebssystem verwende ich immer noch Linux Raspbian, das heute einfach Raspberry Pi OS heißt. Die aktuelle Version kann hier heruntergeladen werden. Heutzutage ist es praktisch, die 64-Bit-Version zu verwenden, insbesondere in Verbindung mit dem neueren Raspberry Pi 4 oder 5. Für unseren Einsatz der Stellungsreglersteuerung reicht die Lite-Version aus. Für ältere Versionen des Raspberry Pi 3 wäre es sinnvoll, auch die 32-Bit-Lite-Version „Legacy“ zu verwenden, aber das habe ich noch nicht ausprobiert.
Zum Hochladen des Betriebssystems auf die SD-Karte verwende ich das Programm Raspberry Pi Imager, aktuell Version 1.8.5. Sie können es hier herunterladen. Hier mache ich auf eine sehr grundlegende Änderung gegenüber älteren Versionen des Betriebssystems aufmerksam. Die Autoren haben die Sicherheitsmaßnahmen erheblich verschärft. Daher funktionieren die verschiedenen Verfahren, um das SSH-Terminal nach dem ersten Booten des Raspberry Pi zum Laufen zu bringen, nicht mehr. Dafür gibt es im Imager Menüs, in denen Sie auswählen, was Sie mit welchem Benutzerpasswort aktivieren möchten. Wenn Sie keine Kopie des Betriebssystems auf Ihrem Computer benötigen, kann Imager diese aus dem Internet herunterladen. Ich habe derzeit die Raspios-bullseye-arm64-lite.img-Version vom 05.12.2023 (die „Legacy“-Version) verwendet.
Ich verwende immer noch das PUTTY-Terminal für die SSH-Verbindung zum Raspberry Pi. Sie können es hier herunterladen. Auch dieses Programm wurde weiterentwickelt, daher empfehle ich die Verwendung der neuesten Version. Ältere haben ein Problem mit moderner Verschlüsselung. Ich verwende derzeit Version 0.76. Wenn Sie die IP-Adresse des Raspberry Pi in Ihrem Heimnetzwerk nicht kennen, können Sie diese mit dem Programm IP-Scanner ermitteln. Sie können es hier herunterladen. Ich habe Version 2.4.30 verwendet. Sie müssen es nicht installieren, sondern nur ausführen. Einen Raspberry Pi 3 erkennen Sie an der MAC-Adresse beginnend mit den Zahlen B8:27:EB... Nach erfolgreicher Verbindung wird das erste Betriebssystem-Setup durchgeführt.
sudo raspi-config
Hier richte ich mich normalerweise ein:
- 1 System Option, S5 Boot, B1 Console
- 5 Localization: L2 Change Timezone, Europe, Prague
- 5 Localization: L4 Change Wi-fi Country, CZ Czech Republic
- 6 Advanced Options, A1 Expand Filesystem
- und schlussendlich <Finish>, reboot now? Yes
Die folgenden Updates sind Standard-Linux. Ich habe sie zuletzt am 4. März 2024 installiert.
sudo apt-get update
sudo apt-get upgrade -y
sudo reboot
Python ist bereits Teil des Betriebssystems. Daher können wir einfach nicht auswählen, welche Version wir verwenden möchten. Wenn wir an der aktuellen Version interessiert sind, geben Sie den Befehl ein:
python3
Dadurch wird ein Python-Interpreter gestartet, der die aktuellen Versionsinformationen ausgibt. Es endet mit der Tastenkombination Strg+D. Meine aktuelle Python-Version ist 3.9.2.
Python kann die heutige umfangreiche Basis an vorgefertigten Bibliotheken nutzen. Die Verwaltung dieser Bibliotheken (Installationspakete und Abhängigkeiten zu anderen notwendigen Paketen und Updates) erfolgt durch das PIP-Programm. Normalerweise beginnt es also mit der Installation. Da wir in unserem Projekt nur wenige Kernbibliotheken verwenden, müssen wir PIP nicht verwenden und die Pakete nicht manuell installieren.
Als Webserver nutzen wir das fertige Flask Framework. Die Homepage des Projekts finden Sie hier und Die Bedienungsanleitung finden Sie hier. Um es zu installieren und die unterstützenden Bibliotheken zu installieren, geben Sie die folgenden Befehle ein:
sudo apt-get install python3-flask -y
sudo apt-get install python3-flask-socketio
Wir werden die Pigpio-Bibliothek verwenden, um mit den GPIO-Ports zu kommunizieren. Hier werden wir es mit dem Befehl installieren
sudo apt-get install python3-pigpio
Die Dokumentation zu dieser Bibliothek finden Sie hier. Durch die Installation des Pakets wird ein Daemon gestartet, ein separates Programm, das im Hintergrund als Dienst ausgeführt wird. Dieser Daemon heißt pigpiod. Bei jedem Neustart des Raspberry Pi muss dieser neu gestartet werden. Dies kann durch Bearbeiten der Konfigurationsdatei /etc/rc.local erreicht werden, beispielsweise mit dem Nano-Texteditor.
sudo nano /etc/rc.local
Am Ende, vor dem Befehl „exit 0“, fügen wir den Namen des Daemons hinzu, also pigpiod.
Abb. 2 - Den Pigpiod-Daemon dauerhaft ausführen
Speichern Sie die Datei mit der Tastenkombination Strg+O und schließen Sie den Nano-Editor mit der Tastenkombination Strg+X. Zur Sicherheit starten wir den Raspberry Pi ein letztes Mal neu.
sudo reboot
Dadurch ist der Raspberry Pi bereit, ein Python-Programm auszuführen.
Wir werden über den Flask-Webserver mit dem Raspberry Pi kommunizieren. Dieses Programm hat seine eigenen Regeln, die wir befolgen müssen. Der erste ist die Verzeichnisstruktur. Ich verwende den Filezilla-FTP-Client, um mit Verzeichnissen und Dateien zu arbeiten. Sie können es hier herunterladen. Ich verwende derzeit Version 3.66.5. Nach dem Herstellen der Verbindung erstellen wir im Verzeichnis /home/pi/ ein Unterverzeichnis mit dem Namen unseres Projekts, also satprowler. Dieses Verzeichnis muss die folgenden Unterverzeichnisse enthalten:
- static für statische Objekte
- static/css für Stile
- static/img für Bilder
- static/js für Javascript-Unterstützung
- template für HTML-Seiten
Wenn wir die Quelltexte für ein bestimmtes Projekt durchgehen, werden sie einschließlich aller unterstützenden Dateien in dieser Verzeichnisstruktur bereitgestellt. Das Hauptprogramm satprowler.py befindet sich im Hauptverzeichnis satprowler. Es handelt sich eigentlich um eine exemplarische Vorgehensweise für den Betrieb eines Flask-Webservers, komplett mit Positioniererroutinen.
Abb. 3 – Verzeichnisstruktur des Projekts
Zu diesem Zeitpunkt konnten wir die Verzeichnisstruktur bereits mit den Dateien des aktuellen Projekts füllen.
Das Programm kann auf zwei Arten ausgeführt werden.
1) Temporärer Start für Tests:
- Wenn Sie ein Putty-Terminal anschließen, wird das Terminal automatisch auf das Home-Verzeichnis des Pi-Benutzers /home/pi/ eingestellt.
- Wechseln Sie mit dem Befehl in das Unterverzeichnis des Projekts
cd satprowler
- Starten Sie einen Webserver mit einem Befehl
python3 satprowler.py
Ein so gestartetes Programm läuft nur so lange, bis die Putty-Terminalverbindung beendet wird oder bis das Satprowler-Programm mit der Tastenkombination Strg+C beendet wird. Das Programm schreibt alle Meldungen, auch Fehlermeldungen, auf das Terminal. Daher wird diese Methode zum Testen und Debuggen des Programms verwendet.
2) Permanenter Programmstart
Um das Programm dauerhaft am Laufen zu halten und jederzeit mit ihm kommunizieren zu können, müssen Sie wie folgt vorgehen. Wir öffnen die Konfigurationsdatei /etc/rc.local mit dem Nano-Texteditor
sudo nano /etc/rc.local
und schreibe zwischen die Zeilen pigpiod und Exit 0
cd /home/pi/satprowler/
python3 satprowler.py &
Wir speichern die Datei mit der Tastenkombination Strg+O und schließen den Nano-Editor mit der Tastenkombination Strg+X. Nach dem Neustart des Raspberry Pi wird das Programm automatisch ausgeführt, ohne dass ein Terminal erforderlich ist.
sudo reboot
Abb. 4 – Permanenter Betrieb des Webservers
Heutzutage wird die Datei rc.local in einigen Linux-Distributionen nach und nach durch andere Mechanismen ersetzt. Daher kann es in Zukunft erforderlich sein, den beschriebenen Prozess des automatischen Programmstarts durch die Einrichtung von Diensten über systemd zu ersetzen.
Der Positionierer wird verwendet, indem Sie die IP-Adresse Ihres Raspberry Pi mit dem Port, den der Server überwacht, in den Webbrowser eines beliebigen Computers eingeben.
http://192.168.xxx.xxx:8080
Sie sollten die Hauptseite mit allen Steuerelementen sehen.
Abb. 5 – Beispiel einer möglichen Weboberfläche des Stellungsreglers
Probleme, die noch nicht gelöst sind:
Asynchrone Javascript-Funktionen werden verwendet, um zwischen dem Webbrowser und dem Flask-Server hin und her zu kommunizieren. Die Quelltexte einiger Funktionen befinden sich auf den Websites der Autoren. Es ist mir noch nicht gelungen, sie vor Ort zum Laufen zu bringen. Das bedeutet, dass zum Ausführen des Programms eine aktive Internetverbindung erforderlich ist. Ohne sie funktionieren diese Skripte nicht.