ft-Explore - Mein fischertechnik-Interface mit RaspberryPi
2019
fischertechnik-Modelle mit dem RaspberryPi über grafische Benutzeroberfläche und Python-Skripte steuern
Motivation
In den 90er Jahren des vorigen Jahrhunderts hatte ich ein Fischertechnik-Interface für den Atari ST, das über den Parallelport angeschlossen wurde. Die Möglichkeit, meine selbstgebauten Modell über den Computer zu steuern, hat mich begeistert und vielleicht sogar meinen Werdegang beeinflusst. Heute möchte ich mit einem RaspberryPi Fischertechnik-Modelle steuern können und auch meinen Kindern einen leichten Einstieg ermöglichen.
Beschreibung
Der RaspberryPi soll in die Lage versetzt werden, vier Motoren oder Lampen anzusteuern und acht Digitaleingänge einzulesen. Weitere Anschlussmöglichkeiten wie etwa Analogeingänge sind weniger wichtig, da für die meisten Modelle nicht erforderlich. Allzu viele Hardwarebasteileien sollen dazu nicht erforderlich sein und außerdem der RaspberryPi vor fehlerhaft angeschlossenen Modellen oder Störungen durch die Motoren geschützt sein. Die notwendigen Teile sollen leicht zu beschaffen sein und ein gutes Preis-Leistungsverhältnis haben.
Folgende Anforderungen stelle ich softwareseitig an eine Lösung:
- über eine grafische Benutzeroberfläche sollen die Motoren bzw. Lampen intuitiv steuerbar sein und der aktuelle Status der Eingänge angezeigt werden.
- Die grafische Benutzeroberfläche soll plattformunabhängig funktionieren und keine allzu aufwändige Installation erfordern.
- Die Steuerung der Motoren bzw. Lampen und das Auslesen der Eingänge soll auch auf einfache Weise mittels Python-Skripten möglich sein.
- Grafische Benutzeroberfläche und Python-Skripte sollen gleichzeitig funktionieren, d.h. in der grafischen Benutzeroberfläche soll die Skriptausführung nachvollziehbar sein.
- Die Ausführung der Skripte soll über die Benutzeroberfläche möglich sein und die Ausgabe der Skripte dort erscheinen.
- Die Skriptausführung soll über die Benutzeroberfläche jederzeit abgebrochen werden können.
- Während der Skriptausführung soll die Benutzeroberfläche weiterhin funktionieren und z.B. Motoren darüber steuerbar bleiben.
- Die Anzeige der Benutzeroberfläche und die Skriptausführung sollen entkoppelt vom RaspberryPi auf einem anderen Rechner (etwa ein Windows-Notebook) erfolgen können, sodass der RaspberryPi auch ohne Bildschirm betrieben werden kann.
Meine Internetrecherche hat nichts auch nur ansatzweise Passendes hervorgebracht, sodass ich selbst etwas entwickelt habe.
Implementierung
Da die Skriptausführung in Python erfolgen soll, ist es naheliegend, auch die Benutzeroberfläche in Python zu implementieren. Dies passt auch gut zur Anforderung eine plattformunabhängigen Lösung. Da Tk in Form von Tkinter mit Python ausgeliefert wird und die Benutzeroberfläche nicht besonders aufwändig sein muss, habe ich mich entschieden, Tk zu nutzen. Alternativen auf der Höhe der Zeit, wie Kivy oder Qt, hätten zu deutlich mehr Abhängigkeiten und einer aufwändigeren Installation geführt. Auf der Grundlage von Tkinter habe ich folgendermaßen aussehende Oberfläche entwickelt:
Die Benutzeroberfläche ist in der Größe anpassbar. Eine Verkleinerung ist möglich, bis nur noch die Steuerungsmöglichkeiten und Anzeigen sichtbar sein, d.h. die Steuerungs- und Ausgabemöglichkeiten für die Benutzerskripte sind komplett ausblendbar. Eine Vergrößerung verlängert die Regler und steigert insbesondere den Platz für die Ausgabe der Benutzerskripte.
Im unteren Teil des Fensters kann der Benutzer ein Python-Skript laden, dieses Starten und jederzeit wieder abbrechen. Die Skriptausgabe erscheint im unteren Ausgabebereich, der einen beschränkten Teil der Ausgabe über Scrollbalken jederzeit zugreifbar behält und aus dem die Ausgabe auch markiert und über ein gewohntes Strg-C herauskopiert werden kann. Ein Anzeigen und Editieren des Benutzerskriptes in der Bedienoberfläche ist nicht vorgesehen, damit jeder seinen Lieblingseditor, unter Windows etwas Notepad++, verwenden kann. Bei jedem Starten des Skriptes wird die aktuelle Codeversion verwendet, ein umständliches erneutes Laden der Datei ist nicht erforderlich.
Für die Hardware habe ich folgende Teile verwendet:
- RaspberryPi 3B mit passender SD-Karte, auf der ich ein Raspbian installiert habe
- Netzteil "Universal- USB Lader QUATPOWER USN42W/USB", bei Pollin für 9,95 Euro erhältlich. Es hat den Vorteil, gleichzeitig über USB-Anschluss 5V/2.1A für den RaspberryPi zu liefern und DC 9V/3A zum Betrieb der Fischertechnik-Bauteile
- ein Adafruit Motor-HAT, der als "Schrittmotor-Shield für Raspberry Pi" für 21,80 Euro bei Reichelt erhältlich ist
- ebenfalls bei Reichelt das Gehäuse "RPI CASE HAT" mit Aussparung für die Motorsteuerplatine und ein Stacking-Header "RPI HEADER 40", um für Erweiterungen weitere Platinen darauf stapeln zu können
- Um die benötigten 9V-Digitaleingänge sauber von der RaspberryPi-Spannung zu trennen, habe ich über AliExpress für gut einen US-Dollar das Stück zwei fertige 4-fach PC817-Optokopplerplatinen bestellt (https://www.aliexpress.com/item/32884089571.html), die eine passende Beschaltung aufweisen.
- Ebenfalls bei AliExpress einen Satz Jumper-Kabel, um die Optokopplerplatinen an die GPIO-PINs des RaspberryPi (bzw. deren Verlängerung über den Motor-Shield) anzuschließen.
- Fehlt nur noch ein schönes, passendes Gehäuse für alles zusammen - 3D-Druck ist allerdings nicht meine Domäne.
Damit ist so gut wie nichts zu löten und die Teile müssen nur noch gemäß des Schaltplans miteinander verbunden werden. Und dann kann es losgehen!