Das Thema Elektronik und die diversen Basteleien empfinde ich seit jeher als faszinierend. Besonders LEDs konnten mich schon immer begeistern, nicht zuletzt seit K.i.t.t. in Knight-Rider-Zeiten. Allerdings sind meine Kenntnisse diesbezüglich auch eher – sagen wir ausbaufähig…
Zwar sind einige Grundlagen hängen geblieben, aber in den letzten Jahren habe ich mich doch eher mit Software als mit Hardware beschäftigt. Ich will auch gar nicht den Kanon des „Internet of Things“ anstimmen, oder die Möglichkeiten des „Smart Home“ skizzieren, denn insbesondere zu Letzterem fehlt es meiner Ansicht nach noch an allen Ecken und Enden, das fängt bei erschwinglicher Hardware an, setzt sich über die aktuell eher suboptimale Benutzbarkeit fort und hört bei der aktuell schwachen bis nicht vorhandenen Integration in die Endgeräte noch lange nicht auf.
Jedoch bieten sich für Bastler in der letzten Zeit fantastische Möglichkeiten, etwa in Form des Arduino oder aber auch des zunächst als Lerncomputers konzipierten Raspberry Pi. Letzterer ist nicht nur ein vollständiger Computer im Scheckkarten-Format, sondern bietet auch diverse Schnittstellen nach außen, etwa in Form der GPIO-Verbindungen (General Purpose Input/Output). Dazu existiert mittlerweile mehr als genug Literatur, ob in Buchform oder auch auf Myriaden von Webseiten, es gibt Shops, die sich auf den Verkauf des kleinen Rechners und Zubehör spezialisiert haben usw.. Wie immer hilft die Suchmaschine der Wahl…
Einfacher kann der Einstieg in die Welt der Mikrocontroller somit fast nicht mehr sein, und so habe ich mein Arsenal aus Widerständen, LEDs, Kabeln und sogar Sensoren und Aktoren in der letzten Zeit ein wenig ausgebaut, um vielleicht den einen oder anderen Winter- bzw. Sommerabend für ein paar Hardware-Basteleien zu nutzen.
Das „Hello-World“-Projekt ist natürlich die LED, die sich per Software gesteuert schalten lässt. Das sollte doch einfach machbar sein… Ich hatte mir bereits ein GPIO-Shield besorgt, womit sich die Pins der Raspberry Pi auf ein Steckbrett (Breadboard) weiter leiten lassen. Das sollte einfacher sein als direkt per Kabel am Raspberry Pi herum zu fummeln. LED und Kabel waren ebenfalls vorhanden, dazu noch ein Widerstand, wobei hier je nach Quelle der empfohlene Widerstandswert durchaus schwankt – manche Quellen geben 220 Ohm an, andere 620 Ohm usw.. Ob es an meinen Augen fortgeschrittenen Alters lag oder die Dinger inzwischen immer kleiner geworden sind, mittlerweile kann ich die Farbcodes nicht besonders gut erkennen, das Durchmessen per Multimeter hat somit mehr geholfen bei der Wahl eines 220 Ohm-Widerstandes. (Dass das Multimeter nach mehr als 20 Jahren ohne Batteriewechsel noch immer funktioniert, ist ein anderes Wunder, aber es wurde zugegebenermaßen auch nicht besonders viel benutzt.)
Bei der Verkabelung habe ich mich an dem Artikel „Einfaches Schalten der GPIO Ein- und Ausgänge am Raspberry Pi“ orientiert. Darüber hinaus fand ich die Anleitung von Sunfounder hilfreich. Sunfounder verkauft neben diverser kompatibler Hardware auch Bastel-Kits, die ein Komplettpaket für den leichten Einstieg bieten. Selbst wenn man keines der Kits besitzt oder die Hardware lieber selbst zusammen stellt, lassen sich die Anleitungen als PDF herunter laden, ich habe mir dafür das PDF-Dokument des „Super Kit for Raspberry Pi B+“ ausgesucht.
Noch ein Hinweis zum GPIO-Shield – das war für mich bislang ein kleiner Fehlkauf. Die Hinweise in den Bewertungen bei Amazon sind Gold wert. Grundsätzlich ist ein GPIO-Shield eine sehr gute Idee, jedoch existieren viele Varianten davon. Manche orientieren sich dabei an der WiringPi-Belegung, die sich leider von der üblichen Notation des Raspberry Pi unterscheidet. Für den Einstieg wirft dies unnötige Hürden auf, noch dazu ist die Schrift auf der Platine so dermaßen klein, dass sich die Belegung kaum entziffern lässt. Darüber hinaus sind auf den neueren Raspberry Pi, d.h. B+ und 2, mehr GPIO-Pins vorhanden, so dass die schmaleren GPIO-Shields zwar passen (die Belegung der ersten Pins von alten und neuen Raspberry Pi ist identisch), aber nicht alle Möglichkeiten ausgeschöpft werden. Die breiteren Shields passen wiederum nicht auf die älteren Raspberrys…
Die ersten Versuche mit GPIO-Shield waren somit eher ernüchternd, daher habe ich die Verkabelung letztlich direkt vorgenommen. In Worten – Pin 1 (3,3V) ist über einen Widerstand (220 Ohm) mit der Anode (Pluspol) der LED verbunden, die Kathode der LED anschließend am Pin 11 (GPIO 17). Zur Funktionsweise und Aufbau von LEDs empfehle ich diesen Artikel.
Die Schaltung sieht live wie folgt aus:
Nachdem die Hardware aufgebaut war, ging es an die Software. Die einfachste Art und Weise ist die Steuerung per Shell-Kommandos, dazu bedarf es keiner besonderen Software oder Libraries, daher bietet sich dies für den Einstieg an.
Auch bei der Ansteuerung habe ich mich wieder mehreren Quellen bedienen müssen. Die anfangs zitierte Raspberry-Tutorial-Seite ist bereits ein wenig älter, so fehlte dort ein entscheidender Hinweis.
Die Ansteuerung findet grundsätzlich im Verzeichnis /sys/class/gpio statt. Da der Zugriff nur per Superuser root erfolgen kann, da anderen Usern zunächst die Rechte fehlen, sollte man zum User root wechseln:
su root
Hinweis: Die Nutzung ist auch ohne root-Rechte möglich, das bedarf jedoch weiterer Konfiguration, und für erste Experimente wollte ich nicht, dass es daran scheitert.
Im ersten Schritt muss der zu verwendende GPIO-Pin „exportiert“ werden:
echo "17" > /sys/class/gpio/export
Damit wird der GPIO initialisiert, dabei wird ein Verzeichnis /sys/class/gpio/gpio17 angelegt. Der Erfolg ist leicht zu überprüfen, denn während zuvor das Verzeichnis nicht existierte, befinden sich darin nun weitere Dateien und Verzeichnisse.
Danach muss der GPIO dahingehend konfiguriert werden, ob er für den Lese- („in“) oder Schreibzugriff („out“) verwendet werden soll. Die erste Prüfung nach dem Initialisieren ergab, dass der GPIO fürs Lesen eingestellt war (cat /sys/class/gpio/gpio17/direction), daher wird dieser nun auf den Schreibzugriff eingestellt:
echo "out" > /sys/class/gpio/gpio17/direction
Auf dem GPIO können zwei Zustände anliegen, und zwar 0 für „es fließt kein Strom) und 1 – „Strom fließt“. Der Zustand wird definiert durch die Datei „value“, daher:
echo "1" > /sys/class/gpio/gpio17/value
Nun sollte die LED leuchten. Eigentlich…
Bei meiner Verkabelung hingegen tat sich zunächst nichts. Ein paar Iterationsschleifen inkl. Durchmessen per Multimeter und Durchforsten weiterer Quellen führte dazu, der Einstellung – und damit Datei „active_low“ Bedeutung beizumessen. Ein „cat /sys/class/gpio/gpio17/active_low“ zeigte den Wert 0 an. Diese Einstellung kann zum Invertieren der Pin-Logik verwendet werden. Das klang vielversprechend, insofern:
echo "1" > /sys/class/gpio/gpio17/active_low
Damit konnte ich eine Spannung feststellen, insofern ließ sich die LED nun auch ein- und ausschalten:
# LED ein: echo "1" > /sys/class/gpio/gpio17/value # LED aus: echo "0" > /sys/class/gpio/gpio17/value
Insofern: Und sie leuchtete doch! Der erste Schritt war damit getan, noch ein wenig holprig, aber immerhin. Als Beweis noch das folgende Foto der eingeschalteten LED:
Nun handelt es sich dabei um eine mögliche Verkabelung, die sich an dem Sunfounder-Beispiel orientiert. Wenn die LED umgedreht und statt des Pin 1 der Pin 6 (GND) genutzt wird, sollte die Schaltung auch ohne Invertieren der Pin-Logik möglich sein… Genau so ist es. Leider sind die Anleitungen für Elektronik-Newbies auch nicht immer ganz verständlich, weil eine gewisse Einheitlichkeit in der Benennung fehlt, so hätte auch anstatt „Masseleiste“ der Pin bzw. die Bezeichnung angegeben werden können… Aber mit der Zeit folgt vielleicht auch bei mir mehr Verständnis für die Details, spassig war es auf jeden Fall. Und bislang haben weder die Bauteile, noch der Raspberry Pi Schaden genommen.
Die nächsten Schritte werden folgen, zu entdecken gibt es definitiv mehr als genug!
Zum Schluss noch ein paar Quellen, die mir bei der genannten Schaltung geholfen haben:
- Raspberry-Tutorials
- Raspberry Pi GPIO How-To
- Raspberry Pi: GPIO
- LED – Leuchtdioden
- Tricks zum Programmieren der GPIO-Schnittstelle
- Raspberry Pi: GPIO Ein- und Ausgänge schalten
- GPIO beim Raspberry Pi per Shell-Kommando ansteuern