Erste Schritte mit GPIO-Ansteuerung und LED
Der Raspberry Pi Zero, und auch alle anderen neueren Raspberry-Modelle, verfügen über eine 40 polige Anschlussleiste , auch Header genannt. Auf der Platine ist dieser Headerleiste mit GPIO beschriftet. GPIO steht dabei für general purpose input/output, also zu deutsch etwa: Ein-/Ausgabe zur generellen Verwendung.Das Besondere an den GPIO-Pins ist nämlich, dass sie sowohl lesend als auch schreibend verwendet werden können. Alle Ein-/Ausgänge beim Raspberry Pi sind digital (z. B. im Gegensatz zum Arduino, der auch analoge Eingänge hat - aber der kommt erst später dran). Das heißt, sie sind entweder LOW (es fließt kein Strom) oder HIGH (es fließen +3.3V Strom). Dazwischen gibt es nichts.
Man kann mit dem Raspi nicht etwa die Spannung an einem Eingang hinter einem Potentiometer (kurz Poti, ein Drehwiderstand) messen, entweder liegt die Spannung über der Schwelle von ca. einem Volt oder darunter. Wobei die Schwelle nicht ein Fixpunkt ist. Sicher kann man sich nur bei Spannungen unter 0.8 Volt (=LOW) und über 1.3 Volt (=HIGH) sein. Dazwischen ist der Zustand nicht klar und kann zwischen beiden Zuständen springen. Denn in der digitalen Welt gibt es halt nur an und aus, Eins oder Null.
Wird ein Ausgang auf HIGH gesetzt, so setzt der Raspi ihn immer auf 3.3 Volt. Das ist wichtig zu wissen, wenn man z. B. elektronische Bauelemente schalten will, diese gibt es oft als 5V oder eben als 3.3V Version. Auch bei der Berechnung des Vorwiderstandes für eine LED ist die Spannung wichtig, fließt sie doch in die Berechnung mit ein.
Dem Raspi muss jeweils vor dem Gebrauch eines Pins mitgeteilt werden, ob dieser Input (Eingang) oder Output (Ausgang) sein soll. Danach kann man Output-Pins schreiben und Input-Pins lesen. So einfach ist das...
GPIO und Pin-Nummern
Wenn da nicht diese Nummerierungen wären. Davon gibt es nämlich mehrere, wie das Diagramm rechts zeigt. Zum einen werden nämlich die Pins einfach von links nach recht und dann von oben nach unten durchgezählt (Nr.), diese Nr. werden aber normalerweise nicht verwendet.Sondern für WiringPi (das direkt auf der Shell ausführbar ist) die Pin-Nummern unter WPI und unter Python (für Programme) die Pin-Nummer unter BCM. Man muss also die jeweils richtige Nummer aus dem Diagramm ablesen.
Außer Masse (GND), und den Stromversorgungsleitungen +3.3V und +5V sind die anderen Pins prinzipiell frei verwendbar. Wenn man aber Libraries (Programmbibliotheken mit fertigen Programmteilen z. B. für spezielle elektronische Bauteile oder Protokolle) einbindet, dann werden bestimmte Pins häufig für bestimmte Anwendungen verwendet. Deshalb sollte man möglichst auch die entsprechenden Pins benutzen, Z. B. Pin Nr. 3 und 5 für den I2C-Bus, es spricht ja auch nichts dagegen.
Manche Pins sind mehrfach "belegt". Wenn SPI in einem Projekt nicht benutzt wird und man die zusätzlichen Pins CTS und RTS zur Flußkontrolle der seriellen Schnittstelle (UART) benötigt, benutzt man dazu Pin Nr. 36 und Pin Nr. 11. Genaueres sollte aber immer in der Dokumentation zu einer Library stehen.
Um elektronische Schaltungen einfach aufzubauen, empfiehlt es sich, sich ein sogenanntes Breadboard anzuschaffen, dass ist ein kleines Steckbrett mit vielen, vielen Löcher, in das man die Pins von Bauteilen stecken kann, um diese zu verbinden. Dabei sind die beiden jeweils äußeren Bahnen für die Stromversorgung und Masse über die ganze Länge (0 bis 60) horizontal miteinander verbunden. Ansonsten verlaufen die Kontaktierungen jeweils vertikal (von A bis E), fünf Kontakte sind jeweils miteinander verbunden. Auf der anderen Häfte des Breadboard spiegelt sich dies noch einmal.
Verbunden werden die Kontakten dann mit so genannten Dupont-Kabeln, das sind kurze, bunte Kabel, die es in den Ausführung male-male (zwei Stecker) female-female (zwei Buchsen) und male-female (1x Stecker, 1x Buchse) gibt. Da ich den Raspberry Pi schon hatte und Breadboard und Co als Satz günstig in einem Starter-Kit zu haben sind, habe ich ein Starter Kit mit einem Arduino R3 gekauft. Da waren elektronische Bauteile, Breadboard und Kabel gleich mit dabei. Was ich nicht berdacht habe, ist, dass die Anschlussleisten beim Arduino allesamt weiblich sind, man muss also immer nur weibliche Kontakte miteinander verbinden. Dementsprechend lagen nur männliche Kabel bei. Und bis die weiblichen aus China kommen, das kann noch ein wenig dauern. Aber ich wollte jetzt schon bastelt.
Darum habe ich in meinem Alt-Elektronik-Fundus gekramt und siehe da: alte IDE-Kabel haben genau 2x20 Kontakte und passen schön auf den Raspi-Header. Auf den anderen Seite kommen dann wieder weibliche Anschlüsse heraus - Problem gelöst. Einfacher tut man sich natürlich mit einem sogenannten Cobbler - der wird auch über ein Flachband-Kabel angeschlossen und dann auf das Breadboard gesteckt. Da hat man dann alle Kontakte zum Abgreifen parat und zwar gleich beschriftet. So ein Teil ist natürlich auch bestellt - und dauert noch, bis es ankommt.
So ganz sicher, wie jetzt die Pin-Belegung an anderen Ende des Flachbandkabels aussieht war ich mir dann nicht - besser einmal nachmessen. Sobald der Raspi eingeschaltet ist, liegen zwischen Pin Nr. 2 (+5V) und Pin Nr. 6 (GND) fünf Volt an (wer hätte es gedacht). Der Versuch brachte die Erkenntnis, dass am Kabel die Anschlüssel spiegelverkehrt sind. Das solltet ihr beachten, wenn ihr die Schaltungen nachbaut.
Unsere erste Schaltung
Zeit für unsere erste einfache Schaltung: den Klassiker: eine LED ein- und wieder ausschalten.Dazu brauchen wir:
- 1x Breadboard
- 1x gelbe Leuchtdiode, 5 mm
- 1x Widerstand 68 bis 220 Ohm
- Verbindungskabel
1. Die LED kann nur in einer Strom-Richtung betrieben werden und
2. die LED benötigt einen Vorwiderstand, damit sie nicht kaputt geht.
Wenn ein Bauelement Strom nur in eine Richtung durchlässt, dann man man es Diode. So steht LED auch für Light Emitting Diode, also licht-abgebende Diode. Wenn man die LED nun in einer Richtung im Stromkreis betreiben kann, wie erkennt man dann, wie richtig rum ist? Ganz einfach: Ein Bein der zweibeinigen LED ist länger, das ist unser Pluspol.
Wenn eine LED mit zuviel Strom betrieben wird, geht sie kaputt. Je nach Stromstärke blitzt sie dabei nur einmal kurz vor dem Verenden auf oder sie sieht eigentlich ganz normal aus, wird aber warm und stirbt einen langsamen Tod. Durch einen Vorwiderstand kann man den Strom einstellen, der bei der LED ankommt. Beim optimale Wert strahlt die LED hell und hält so gut wie ewig. Manchmal kann man sich Vorwiderstände auch sparen, wenn man mehrere LEDs in Reihe schaltet, denn diese haben selbst auch einen Widerstand. Oder wenn man eine spezielle LED hat, in der der Vorwiderstand schon verbaut ist.
Um den richtigen Vorwiderstand zu berechnen, braucht man mehrere Werte:
- 1. Die Stromstärle in mA (Milliampere), mit der die LED betrieben werden soll, meist 20 mA, vorsichtshalber 18 mA
- 2. Die LED-Durchlass-Spannung. Diese hängt von der LED ab, von der Farbe und vom Durchmesser. Sie beträgt ca. - genauere Angaben findet ihr in der LED-Spezifikation z. B. im Katalog oder Onlineshop, wo ihr bestellt.
- infrarot: 1.3 V
- rot: 1.6 V
- gelb: 2.2 V
- orange: 2.2 V
- grün: 2.5 V
- blau: 3.3 V
- weiß: 3.5 V
- UV: 3.6 V
- 3. Der Betriebsspannung, beim Raspi also 3.3 V (oder ggf. nicht schaltbare 5V and der 5V-Leitung)
In unserer Schaltung benutzen wir eine gelbe LED mit 18 mA und 2.2 V Durchlassspannung. Das Spannungsdelta, das der Vorwiderstand "vernichten" soll, ist demnach 3.3 V (vom Raspi-Pin) minus 2.2 V = 1.1 V. Nach dem alten Lehrsatz "Widerstand (in Ohm) ist gleich Spannung (in Volt) durch Stromstärke (in Ampere)" bzw. R ist gleich U durch I rechnen wir R = 1.1V / 0.018A = 61.1 Ohm. Wir wählen den nächst höheren verfügbaren Widerstand, also 68 Ohm. Aber mit 220 Ohm leuchtet die LED auch noch hell genug - der Widerstand war im Set vorhanden und ich hatte herade keine Lust in den Altbeständen zu kramen.
Widerstandsrechner
Damit ihr euch die Rechnerei sparen könnt, gibt es hier einen LED-Vorwiderstandsrechner. LED-Farbe anklicken, auf berechnen klicken, fertig. Für LEDs mit anderen Werten können diese auch direkt eingetragen werden.Stecken wir unsere Schaltung auf dem Breadboard zusammen:
+ C2 Widerstand 68-220 Ohm
(siehe Vorwiderstandsrechner)
- C3 Kabel
E2 E3 LED gelb, 5mm, mit +
(dem langen Beinchen) links (in E2)
Danach muss das Breadboard noch an den Raspi angeschlossen werden. Ich habe mir dafür die Masse (GND) auf Pin Nr. 6 und den Pin Nr. 8 als Schaltpin für Plus ausgesucht. Bitte beachten: da ich hier das Kabel benutze, sind die Pins spiegelverkehrt.
Wenn ich also Pin Nr. 8 auf High schalte, sollte die LED solange leuchten, wie der Pin auf High ist.
Der Strom fließt dann von Pin Nr. 8 ins Breadboard (+), durch den Vorwiderstand, der den überflüssigen Strom in Wärme umwandelt, so das die richtige Menge an der LED ankommt, durch die der Strom von links nach recht fließt und die dann leuchtet, danach geht es zum Minus-Pol des Breadboards am Raspi. Und der steuert mit seiner Elektronik, ob der Stromkreis geschlossen (High) werden soll oder eben nicht (Low).
WiringPi
Die nächste Frage ist natürlich, wie bringen wir den Raspi dazu, Pin Nr. 8 auf High zu schalten. Am einfachsten geht das mit dem Paket WiringPI-Tool GPIO. Damit können wir direkt in der Raspi-Shell Befehle ausführen, um die GPIO zu steuern. Mitsudo apt-get install wiringpi
wird es installiert und danach können wir mit gpio-Kommandos in der Shell die GPIO steuern. Wir müssen allerdings beachten hier die WPI-Nummerierung aus obiger Tabelle zu benutzen. Unser Pin Nr. 8 ist WPI 15.
Zuerst sagen wir der GPIO-Schnittstelle, dass der Pin 15 als Output benutzt werden soll: gpio mode 15 out
Danach können wir den Pin auf High (1) oder Low (0) schalten, indem wir gpio write PIN 0|1 auf der Kommandozeile absetzen. Schalten wir unsere LED einmal an: gpio write 15 1
Der Pin bleibt solange auf High, bis wir ihn wieder abschalten, also auf Low setzen. Unsere LED geht dann wieder aus. Diese GPIO-Befehle sind klasse, wenn wir mal kurz etwas testen wollen. Wir können sie auch in Shell-Scripts einbauen. Versuchen wir doch noch gpio blink 15
Unsere LED blinkt solange bis wir STRG+C drücken.GPIO kennt natürlich noch mehr Optionen, die alle über
man gpio
oder auf der Herstellerseite nachzulesen sind. Ein paar wichtige seien hier erwähnt:
- -g: benutzt statt der WPI-Nummerierung die BCM-Nummerierung wie in Python. Wir könnten unseren Pin Nr. 8 also auch mit gpio -g write 14 1 ansrepchen
- -1: benutzt statt der WPI-Nummerierung die Pin-Nummerierung wie unter Nr. oben in der Tabelle. Wir könnten unseren Pin Nr. 8 also auch mit gpio -1 write 8 1 ansprechen
- read: das Gegenteil von write, liest also den angegebenen Pin aus
- readall: liest alle Pins aus und zeigt deren aktuellen Verwendung und Zustand in einer Tabelle
Python
Aber wir wollen uns an einem ersten Python-Programm versuchen. Da das "Pi" in "Raspberry Pi" für Python steht, ist das natürlich schon in unserer Distribution vorinstalliert. Wir können also gleich loslegen. Legen wir mittouch led.py
eine eine neue Datei an, die wir dann mit dem nano oder unserem Windows-Editor (siehe den Teil mit der Einrichtung von Samba) editieren und speichern:
import RPi.GPIO as GPIO # Funktionen fuer die GPIO-Ansteuerung laden
import time # fuer sleep() (Pause) noetig
GPIO.setmode(GPIO.BCM) # die GPIO-Pins im BCM-Modus ansprechen
led=14 # unsere LED haengt an BCM-Pin 14
GPIO.setup(led, GPIO.OUT) # in den LED-Pin wird "geschrieben"
GPIO.output(led, GPIO.HIGH) # LED-Pin auf High (+3.3V) setzen = einschalten
time.sleep (1) # 1 Sekunde warten
GPIO.output(led, GPIO.LOW) # LED-Pin auf Low (0V) setzen = ausschalten
GPIO.cleanup() # Programm sauber verlassen und Resourcen wieder freigeben
Der Code sollte soweit selbsterklärend sein, alles was einem # folgt, gilt in Python übrigens als Kommentar. Zu beachten ist allerdings, dass hier wieder eine andere Pin-Nummerierung gilt. Unser Pin Nr. 8 ist hier 14 (BCM) und nicht wie vorher 15 (WPI). Das Programm macht nichts weiter, als die LED für eine Sekunde anzuschalten und danach wieder abzuschalten. Mit python led.py
in der Shell können wir das Programm laufen lassen. Sollte sich irgendwo ein Fehler in das Programm eingeschlichen haben, sie würde hier jetzt eine Fehlermeldung ausgegeben werden, mit der wir auf Fehlersuche gehen können.Wenn beim ersten Start ein led.py:7: RuntimeWarning: This channel is already in use, continuing anyway. kommt, dann liegt das daran, dass wir die GPIO-Kommandos in der Shell benutzt, aber danach nicht "aufgeräumt" haben. Ein Aufräum-Kommando für das GPIO-Tool wäre mir nicht bekannt. Falls jemand es kennt, möge er sich bei mir melden.
Erweiterung mit Buzzer
Parallel zur LED wollen wir einen Buzzer (Summer, oder vielleicht besser gesagt Pieper) schalten, der piept, wenn Pin Nr. 8 auf High geht. So haben wir auch ein akustisches Feedback. Es ist allerdings wichtig, dass es sich um einen aktiven Buzzer handelt, die selbstständig piept, sobald Spannung anliegt. Ein passiver Buzzer muss durch eine Frequenz stimuliert werden (schnelles Ein-Ausschalten) und der würde nur leise zweimal klicken - einmal beim Wechlse von Low auf High und einmal beim Wechsel von High auf Low. Beim aktiven Buzzer ist auch die Stromrichtung wichtig. Er sollte ein kleines + aufgedruckt haben.Ergänzen wir unsere Schaltung auf dem Breadboard :
+ A20 Kabel
- A23 Kabel
E20 E23 Buzzer (links mit dem + in E20)
Wenn wir unser Python-Programm jetzt ausführen, leuchtet die LED und der Buzzer piept für eine Sekunde. Beim nächsten Mal wollen wir tiefer in Python einsteigen und das Programm noch ausbauen. Es soll dann einen übergebenen Text morsen.