Fahren und bremsen – Motorsteuerung mit dem Raspberry Pi
Egal ob manuell oder autonom – ein Fahrzeug besteht in der Regel aus mindestens einem Motor, der für die Bewegung zuständig ist. Meist sorgt ein zweiter Motor für die Richtungsänderung, und damit lässt sich schon mal experimentell starten. Für das Umsetzen einer ersten Motorschaltung über die GPIO-Schnittstelle des Raspberry Pi ist es empfehlenswert, diese Motoranschlüsse mithilfe eines Steckboards zunächst über einfache LEDs sozusagen zu emulieren, um etwaige Fehler im Schaltungsdesign von vornherein aufzuspüren. Auch ist so eine Motorersatzschaltung verhältnismäßig schnell aufgebaut, um mal schnell das Shell-Skript oder Python-Code mithilfe der GPIO-Schnittstelle zu testen, ohne den teuren Steppermotor zu beschädigen.
2.1Die erste Schaltung – LEDs mit ULN2803A steuern
Zum Einstieg in dieses Projekt wird die erste Schaltung zunächst auf dem Steckboard umgesetzt, was gerade für Einsteiger recht bequem ist, da es erst einmal ohne löten geht. In diesem Schritt wird ein GPIO-Anschluss auf die Plusleitung des Steckboards gelegt, der sich anschließend per Shell-Befehl schalten lässt. Sie haben damit einen einfachen Lichtschalter per Software realisiert.
Welcher GPIO-Anschluss ist der richtige? Grundsätzlich sind sämtliche Anschlüsse schaltbar, doch um beispielsweise das Skript oder das Programm so flexibel wie möglich zu halten, sollten Sie primär GPIO-Pins nutzen, die auf allen Raspberry-Pi-Modellen gleich implementiert sind. Dies gilt umso mehr, wenn Sie daran denken, den Quelltext für Ihre Skripte und Programme im Internet weiterzugeben oder selbst unterschiedliche Raspberry-Pi-Revisionen zu betreiben.
Achtung –Vorwiderstand für LED-Einsatz zwingend notwendig!
LEDs (Licht emittierende Dioden) dürfen nie direkt an die Stromversorgung angeschlossen werden. Bei einem direkten Anschluss sollte immer mindestens ein Vorwiderstand von 200 bis 300 Ω vorgeschaltet werden, damit der Strom auf einen zulässigen Wert begrenzt ist und die LED auch funktionsfähig bleibt.
Da für die Steuerung der Motoren in einem späteren Projekt ein ULN2803A-IC (NPN Darlington-Array) zum Einsatz kommt, weil es intern bereits die nötigen Widerstände in seiner Transistorschaltung integriert hat, wird dieser IC auch in diesem Beispiel für die LED-Lampen verwendet. Liegt bei dem ULN2803A-IC an den einzelnen acht Eingängen ein Signal an, wird der Schaltkreis mit der Masse geschlossen und nach dem entsprechenden Ausgang geschaltet.
Hierbei müssen Sie nur beachten, dass Sie die Masse von Eingang und Ausgang zusammenlegen, falls Eingang und Ausgang mal unterschiedliche Versorgungsspannungen verwenden. In der schematischen Darstellung sind vier LED-Dioden an den ULN2803-NPN angeschlossen, die sich jeweils per GPIO schalten lassen.
Bild 2.1: Schematische Darstellung der Schaltung mit der Steckboard-Emulation Fritzing.
Im nächsten Schritt setzen Sie die Schaltung auf dem Steckboard um. Dabei merken Sie schnell, dass das Steckboard zwar groß wirkt, es aber beim Bestücken der Widerstände und LEDs schnell eng zugeht. Der Grund ist der praktische Umstand, dass jede Leiterbahn schon mit den Nachbarpins verdrahtet ist. Wenn Sie eine Diode oder einen Widerstand mit beiden Beinchen in eine Reihe stecken, passiert erst mal gar nichts, da kein bzw. ein geringer Stromfluss durch die Diode fließt.
Das Ziel ist, auf dem Steckboard einen Stromkreis zu kreieren. Die fertige Schaltung haben wir auf dem Steckboard aus Platzgründen mit zwei LEDs an zwei Eingängen realisiert, was für Demonstrationszwecke völlig ausreicht.
Bild 2.2: Erfolgreich: Die beiden LEDs lassen sich erfolgreich mit dem IC gekoppelt über die beiden GPIO-Anschlüsse steuern.
In dieser Beispielschaltung wird das Steckboard wie folgt mit dem Raspberry Pi verbunden:
Die Ausgänge des ULN2803A werden jeweils mit einem Widerstand verbunden (200 Ω), das zweite Beinchen des Widerstands geht an die Kathode der LED. Wie herum der Widerstand aufgesteckt wird, ist egal, die Polung spielt bei Widerständen keine Rolle.
Die Anode der beiden LEDs wird mit der 5-V-Stromversorgung sowie mit Pin 15 des ULN2803 verbunden. Nun ist die Schaltung komplett, auf dem Schaltplan stellt sich diese wie folgt dar:
Bild 2.3: Schaltplan: Hier werden nur zwei der verfügbaren acht Eingänge genutzt, um die beiden LEDs unabhängig voneinander schalten zu können.
Im nächsten Schritt können Sie die Schaltung in der Praxis testen. Dafür nehmen Sie per SSH mit dem Raspberry Pi Verbindung auf und prüfen auf der Konsole die beiden GPIO-Anschlüsse, die Sie für die LEDs reserviert haben. In diesem Beispiel wurden dafür GPIO23 und GPIO24 verwendet.
2.2GPIO-Steuerung über die Konsole und Python
Grundsätzlich werden die GPIO-Ausgänge des Raspberry Pi über virtuelle Dateien bzw. über deren Dateimanipulation gesteuert. Vereinfacht bedeutet dies: Steht in einer solchen Steuerdatei der Wert 0
, ist der Schalter geschlossen, und es fließt kein Strom, steht hingegen dort der Wert 1
, ist der Stromkreis geschlossen, und die angeschlossene Schaltung wird aktiviert.
Bild 2.4: Nach dem »Aktivieren« des GPIO-Pins steht im Verzeichnis /sys/class/gpio
die entsprechende Steuerdatei zur Verfügung.
Die virtuellen Dateien für den GPIO-Pfostenstecker finden Sie im Verzeichnis /sys/class/gpio
. Mit dem Kommando
stellen Sie fest, dass sich dort die Dateien export
und unexport
befinden. Der Trick ist hier zunächst, den oder die gewünschten GPIO-Pins auf dem Raspberry Pi zu aktivieren, dies erledigen Sie mit dem Eintragen der entsprechenden GPIO-Nummer in die export
-Datei. Dadurch wird beispielsweise GPIO24 und GPIO23 mitgeteilt, dass sie womöglich bald genutzt werden:
sudo echo "24" > /sys/class/gpio/export
sudo echo "23" > /sys/class/gpio/export
Nun verwenden wir die vorhandene Schaltung mit den beiden LEDs an GPIO23 und GPIO24, die an Pin 17 und Pin 18 auf dem Raspberry Pi gekoppelt sind.
Schalten per Konsole
Grundsätzlich kann ein GPIO-Anschluss auf dem Raspberry als Ausgang, aber auch als Eingang genutzt werden. In diesem Fall ist der Raspberry der Aktor, denn wir wollen etwas einschalten: Um die erste Diode dauerhaft einzuschalten, müssen Sie beide GPIO-Pins zunächst als Ausgang definieren:
sudo echo "out" > /sys/class/gpio/gpio23/direction
sudo echo "out" > /sys/class/gpio/gpio24/direction
Im umgekehrten Fall – beispielsweise wenn an dem GPIO-Anschluss ein Sensor angebracht wäre und Sie den Wert im Raspberry Pi weiterverarbeiten wollten – würden Sie den Anschluss als Eingang definieren und stattdessen
sudo echo "in" > /sys/class/gpio/gpio23/direction
in die Konsole eingeben. Die oben definierten GPIO-Anschlüsse 23 und 24 liegen auf 0 V, der Stromkreis ist also noch nicht geschlossen, und die gekoppelten LEDs leuchten nicht. Um diese zu schalten, nutzen Sie die Befehle:
sudo echo "1" > /sys/class/gpio/gpio23/value
sudo echo "1" > /sys/class/gpio/gpio24/value
Hier tragen Sie jeweils den Wert 1
in die Datei mit der Bezeichnung value
ein. In diesem Fall werden nun sowohl Pin 16 als auch Pin 18 mit Strom versorgt, die beiden LEDs sollten jetzt dauerhaft leuchten. Um die LEDs wieder abzuschalten, setzen Sie den Pegel von HIGH auf LOW. Dies erledigen Sie, indem Sie einfach statt der "1"
den Wert "0"
in die value
-Datei des entsprechenden GPIO-Verzeichnisses schreiben:
sudo echo "0" > /sys/class/gpio/gpio23/value
sudo echo "0" > /sys/class/gpio/gpio24/value
Für das einmalige Experimentieren auf der Kommandozeile macht dies eine Zeit lang Spaß, auf Dauer jedoch sind lange Kommandozeilenbefehle lästig und fehleranfällig.
Bild 2.5: Vier Befehle pro genutztem GPIO-Anschluss sind notwendig, um diesen für die Schaltung ordnungsgemäß zu präparieren.
Deshalb ist es sinnvoll, sämtliche bzw. zumindest die benötigten virtuellen Dateien der entsprechenden GPIOs bereits beim Systemstart des Raspberry Pi automatisch zu starten. Erstellen Sie einfach ein Shell-Skript mit der Bezeichnung gpiostart.sh
mit folgendem Inhalt:
#!/bin/sh
# Roboter mit Raspberry Pi
echo "23" > /sys/class/gpio/export
echo "24" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio23/direction
echo "out" > /sys/class/gpio/gpio24/direction
chmod 666 /sys/class/gpio/gpio23/value
chmod...