GPIO: Relais steuern

Software

GPIO Zero ist die Standard-Software von raspberrypi.org. Wenn Sie mit Rapberry Pi OS arbeiten, muss sie, wie bei Debian, mit apt oder dem grafischen Paketmanager (z. B. Synaptic) installiert werden. In diesem Projekt sollen Relais über den Browser, bzw. das Smartphone gesteuert werden.

Folgende Pakete müssen für diese erweiterte Funktionalität zusätzlich installiert werden:

  • python3-gpiozero
    gpiozero baut auf verschiedenen Pin-Bibliotheken auf und bietet eine Reihe von Klassen, die um die Interaktion mit Geräten zu vereinfachen, die an die GPIO-Pins angeschlossen sind, von einfachen Tasten und LEDs bis hin zu verschiedenen Zusatzplatinen. Die API versucht, sich eng an die Idiome und Namenskonventionen von Python zu halten, und bietet alternative Programmierparadigma-Ansätze.
    Dies ist die Python 3-Version des Pakets.
    .
    python3-flask
    Flask ist ein Web-Rahmenwerk mit einem einfachen, erweiterbaren Kern  auf Grundlage von Werkzeug, Jinja2 und guten Absichten.
    Dieses Paket beinhaltet das Python-3.x-Modul.
    .
    spyder
    Spyder IDE ist eine freie Open-Source Python Entwicklungsumgebung, die MATLAB-ähnliche Funktionen in einer einfachen und leichtgewichtigen Software.
    Dieses Paket bietet die Anwendung für Python 3.
    .
  • gunicorn
    Green Unicorn (gunicorn) ist ein HTTP/WSGI-Server, der für die Bedienung schneller Clients oder langsamer Anwendungen. Gunicorn wird immer hinter einem Proxy Front-End-Server  wie z. B. nginx oder lighttpd installiert. Er wird benötigt, um Flask mit Nginx zu verbinden.
    .
  • nginx-light
    NGINX (»Engine X«) ist ein leistungsstarker Webserver und »reverse proxy server«, entwickelt von Igor Sysoev. Er kann sowohl als eigenständiger Webserver als auch als Proxy eingesetzt werden, um die Last auf Backend-HTTP- oder -Mailservern zu reduzieren. Dieses Paket bietet eine sehr leichtgewichtige Version von Nginx mit nur den minimalen Funktionen und Modulen. HTTP-Standardmodule: Core, Access, Auth Basic, Auto Index, Empty GIF, FastCGI, Map, Proxy, Rewrite, SCGI, uWSGI.
    Optionale HTTP-Module: Auth Request, Charset, Gzip, Gzip Precompression, Headers, HTTP/2, Index, Log, Real IP, Slice, SSI, SSL, Stub Status, Thread Pool, WebDAV, Upstream.
    Drittanbieter-Module: Echo.

Übersicht GPIO Pins

Pin-Nummerierung

Diese Bibliothek verwendet die Broadcom (BCM) Pin-Nummerierung für die GPIO-Pins, im Gegensatz zur physikalischen (BOARD)  Nummerierung. Anders als in der RPi.GPIO-Bibliothek ist dies nicht konfigurierbar. Allerdings kann eine Übersetzung aus anderen Schemata verwendet werden, indem den Pin-Nummern Präfixe vorangestellt werden (siehe unten).

Jeder Pin, der im untenstehenden Diagramm mit „GPIO“ gekennzeichnet ist, kann als Pin-Nummer verwendet werden. Wenn zum Beispiel eine LED an „GPIO17“ angeschlossen ist, würden Sie die Pin-Nummer als 17 und nicht als 11 angeben.

Wenn Sie die physische (BOARD) Nummerierung verwenden möchten, können Sie die Pin-Nummer als „BOARD11“ angeben. Wenn Sie mit den WiringPi-Pin-Nummern vertraut sind (ein anderes physikalisches Layout), können Sie stattdessen „WPI0“ verwenden. Schließlich können Sie die Pins als „header:number“ angeben, z. B. „J8:11“ für den physikalischen Pin 11 am Header J8 (dem GPIO-Header auf modernen Pis). Die folgenden Zeilen sind also alle gleichwertig:

>>> led = LED(17)
>>> led = LED(„GPIO17“)
>>> led = LED(„BCM17“)
>>> led = LED(„BOARD11“)
>>> led = LED(„WPI0“)
>>> led = LED(„J8:11“

Beachten Sie, dass diese alternativen Schemata lediglich Übersetzungen sind. Wenn Sie den Status eines Geräts über die Befehlszeile abfragen, wird die zugehörige Pin-Nummer immer im Broadcom-Schema (BCM) gemeldet:

>>> led = LED(„BOARD11“)
>>> led <gpiozero.LED object on pin GPIO17, active_high=True, is_active=False>

https://gpiozero.readthedocs.io/en/stable/recipes.html#pin-numbering


Pinout!

Der umfassende Leitfaden zur Raspberry Pi GPIO Anschlussbelegung

https://pinout.xyz

Diese GPIO Anschlussbelegung ist nicht zum Ausdrucken gedacht, aber sie ist ein umfassender Leitfaden und eine tolles Nachschlagewerk für die GPIO-Pins Ihres Raspberry Pi’s.


GPIO aktivieren

pigpio ist eine Bibliothek für den Raspberry, die die Steuerung der General Purpose Input Outputs (GPIO) ermöglicht. pigpio funktioniert auf allen Versionen des Pis.

Damit die GPIO-Pins angesteuert werden können, müssen diese erst aktiviert werden.

Das erfolgt im Terminalfenster mit dem Befehl:

sudo systemctl start pigpiod.service

systemctl ist ein Kommandozeilenwerkzeug für systemd. Mit Hilfe von systemctl können Befehle an systemd gesendet werden, z. B. zum Steuern von Units, zum Abfragen des Status, zum Herunterfahren des Systems etc.

Um bei jedem Start des Raspberry Pi pigpiod automatisch zu starten, geben sie Folgendes ein:

sudo systemctl enable pigpiod.service

Rebboot durchführen.

Zum Starten und Stoppen gibt es die Befehle:
sudo systemctl start pigpiod.service und sudo systemctl stop pigpiod.service

Den Status können Sie abfragen:

sudo systemctl status pigpiod.service

Ansteuerung des Waveshare Raspberry Pi Relais Boards

Software-Entwicklung

Die Entwicklung der Software erfolgte auf einem Raspberry Pi CM4 (4 GB) und die fertige Software wurde auf einen Raspberry Pi 4B (2 GB) exportiert.

Als Erstes habe ich mit GPIO Zero und Flask zur Steuerung der Relais eine grafische Oberfläche entwickelt. Wie ich feststellen musste, ist es nicht möglich, mit GPIO Zero ein Programm zu schreiben, dass direkt aufgerufen wird, ein Relais einschaltet und sich dann beendet. Immer, wenn das Programm beendet wird, fällt das Relais wieder ab.

Wegen dieser Einschränkungen habe ich für die direkten Ansteuerungene RPi.GPIO benutzt.

Es gibt noch mehr Möglichkeiten, die GPIO-Pins anzusteuern.

Hier beschreibe ich Ihnen:

  • über Webbrowser mit GPIO Zero, Flask, Gunicorn und NGINX
  • die direkte Ansteuerung mit RPi.GPIO

GPIO Zero

Im Gegensatz zu anderen Python-Bibliotheken für die GPIO-Programmierung folgt GPIO Zero einem anderen Konzept. Statt GPIOs als Eingänge oder Ausgänge zu definieren, definiert man ein Device (Gerät oder Bauelement) als Objekt, dass an einem GPIO hängt. GPIO Zero kümmert sich dann darum, ob es sich um ein Input Device (Eingang) oder ein Output Device (Ausgang) handelt. Wie ich feststellen musste, hat es allerdings auch Einschränkungen, weshalb ich auch RPi.GPIO benutzen musste.
Die Funktionen sind auf der Seite https://gpiozero.readthedocs.org ausführlich beschrieben.

GPIO Zero benutze ich, wenn ich mit einem Browser etwas steuern oder eine Ausgabe haben möchte:

Weiter lesen: GPIO Zero


NGINX

NGINX (ausgeprochen „engine x“) ist ein unter BSD-Lizenz stehender Webserver und Reverse Proxy. Die Software NGINX ist 2004 erschienen und wurde von Igor Sysoev entwickelt. Sie beinhaltet einen Webserver, E-Mail-Proxy und Reverse Proxy und steht unter BSD-Lizenz. Wesentliche Merkmale von NGINX sind der schonende Umgang mit den Serverressourcen und die hohe Performance.

NGNIX muss als Erstes eingerichtet werden.

Weiter lesen: NGINX und Gunicorn


Gunicorn

Gunicorn ‚Green Unicorn‘ ist ein Python WSGI HTTP Server für UNIX. Es ist ein Pre-Fork-Worker-Modell. Der Gunicorn-Server ist weitgehend kompatibel mit verschiedenen Web-Frameworks, einfach implementiert, verbraucht wenig Server-Ressourcen und ist ziemlich schnell.
Da der NGINX-Webserver nicht direkt Python ausführen kann, muss ein Python WSGI HTTP Server dazwischen geschaltet werden.

Weiter lesen: NGINX und Gunicorn


Spyder IDE

Spyder IDE ist eine freie und quelloffene wissenschaftliche Entwicklungsumgebung, die in Python für Python geschrieben und von und für Wissenschaftler, Ingenieure und Datenanalysten entwickelt wurde. Es bietet eine einzigartige Kombination aus fortschrittlichen Bearbeitungs-, Analyse-, Debugging- und Profiling-Funktionen eines umfassenden Entwicklungswerkzeugs.

Ich habe Spyder IDE für die Entwicklung von Flask benutzt und kann es nur empfehlen.
Es hat einen eingebauten Python WSGI HTTP Server zu Testzwecken.

Weiter lesen: Spyder IDE


Flask-Programm

Flask ist ein kleines und schlankes Python-Web-Framework mit nützlichen Tools und Funktionen, die das Erstellen von Webanwendungen in Python erleichtern. Es bietet Entwicklern mehr Flexibilität und ist ein besser zugängliches Framework für neue Entwickler, da Sie Webanwendungen schnell unter Verwendung einer einzigen Python-Datei erstellen können.

Die Steuerung der Webseiten habe ich mit GPIO Zero und Flask realisiert.

Weiter lesen: Flask-Programm


RPi.GPIO

RPi.GPIO ermöglicht die Steuerung von Raspberry Pi GPIO-Kanälen in Python. Die Programmierung ähnelt wiringPi.
Es bietet alle grundlegenden Funktionen, ist aber nicht geeignet für Echtzeit- oder zeitkritische Anwendungen.
RPi.GPIO unterstützt auch nicht SPI, I²C oder Hardware-PWM.

RPi.GPIO benutze ich nur, wenn ein Relais z. B. zeitabhängig automatisch gesteuert werden soll, z. B. über Cron.
Man kann es genau so von einem anderen Programm direkt aufrufen lassen.

Weiter lesen: RPi.GPIO

Weiter: GPIO ZeroUpdate: 23.06.2023