Eine der Besonderheiten des Raspberry Pi’s sind die programmierbaren Input-Output Pins. Diese sog. GPIOs können einfach über ein Programm geschaltet werden, was wir in diesem Tutorial durchgehen. Dafür schreiben wir ein Python Programm, womit wir einerseits Eingaben erfassen und andererseits die Raspberry Pi GPIO Pins schalten, um so andere Module und Sensoren schalten zu können. Darüber hinaus erkläre ich in diesem Tutorial die Funktionsweise eines Breadboards / Steckbrett.
Falls du den ersten Teil noch nicht gelesen und evtl. noch Probleme mit den Basics hast, würde ich raten das zunächst durchzugehen. Für alle, die bereits Programmiererfahrung haben, aber noch nicht mit den GPIOs gearbeitet haben, können auch direkt hiermit starten.
Übrigens: Für die weiteren Teile wäre es super, falls ihr Anregungen habt bzw. was euch vor allem interessiert. Ich werde versuchen, das mit einzubauen.
Zubehör
In diesem Tutorial werden wir ein paar Hardware Bausteine brauchen. Diese sind unter anderem:
- Breadboard, dessen Funktionsweise anschließend erklärt wird.
- Male-Female Jumper Kabel für die Verbindung zwischen Raspberry Pi und Breadboard.
- LED Set
- Taster / Schalter
- Set an Widerständen
Diese Bauteile werden übrigens immer wieder benötigt. Wenn du noch weitere Hardware-Projekte nachbauen willst, wirst du dieses Zubehör definitiv weiter benötigen.
Funktionsweise eines Breadboards / Steckbretts
Ein Breadboard (deutsch: Steckbrett) ist eine Hilfe um Schaltungen schnell aufbauen zu können, ohne diese jedes mal Löten zu müssen. Es bietet vor allem beim Testen und Konzipieren große Vorteile. Dabei gibt es Breadboard in verschiedenen Größen, wobei der Aufbau jedoch meist wie folgt ist:
In der schematischen Zeichnung sind unten die Verbindungen markiert. Die Linien zeigen dabei auf, welche der Löcher miteinander verbunden sind. Unten und oben sind zwei horizonale Leisten zu sehen, an die man normalerweise den Plus- und Minuspol eines Geräts hängt.
Bei den mittleren Pins sind die Verbindungen vertikal. Dabei kann z.B. eine LED in zwei Spalten nebeneinander gesteckt werden. Doch dazu gleich mehr.
Raspberry Pi GPIO Übersicht
Seit dem Model B+ haben die Raspberry Pi’s eine 40 Köpfige Pinleiste. Davon sind nicht alle auslesbar bzw. beschaltbar, da es auch einige Spannungs- und Masseanschlüsse gibt. In der folgenden Grafik sind die kompletten Pins inkl. Funktionen und Nummerierung aufgelistet. Die linke (grüne) Seite soll dabei die Platine des Raspberry Pi’s symbolisieren.
Alle Pins, welche „GPIO“ im Namen haben, können programmiert werden. Darüber hinaus gibt es noch „Ground“ (=Masseanschluss) und die Spannungspins (3.3V und 5V).
Wie du siehst, gibt es zwei Pin Belegungen: Einmal die aufsteigende Pin Belegung (oben links bei 1 beginnend) und dann noch die recht zufällig gewählte Nummerierung der GPIOs. Dies ist wichtig, da man über beide Nummern einen GPIO ansprechen kann.
So entspricht bspw. Pin 15 = GPIO 22. Achte immer darauf, ob von Pin oder GPIO gesprochen wird. In den meisten Tutorials wird jedoch nicht die Pin-Nummerierung, sondern die GPIO Nummer genutzt.
Vorbereitung
Wie zuvor auch öffnen wir die Python Konsole über das Startmenu > Programming.
In der geöffneten Python Konsole geben wir nun zunächst folgendes ein:
import RPi.GPIO as GPIO
Wir importieren damit eine Bibliothek, womit wir die Raspberry Pi GPIO Pins programmieren können. Diese Bibliothek hat alle benöigten Funktionen bereits enthalten, sodass wir keine zusätzlichen Funktionen dafür schreiben müssen.
Weiterhin importieren wir auch noch ein Bibliothek, mit welcher wir das Skript für kurze Zeit stoppen können. Dies wird im Anschluss noch interessant.
import time
Anschließend geben wir an, ob wir die GPIOs per Boardnummern (1-40) oder über ihre GPIO Nummer ansprechen wollen. Da wir letzteres wollen, lautet der Befehl dazu:
GPIO.setmode(GPIO.BCM)
Raspberry Pi GPIO Pins schalten – Ausgabe
Zunächst möchten wir ein paar einfache LEDs mittels der GPIOs schalten. Dazu bauen wir die LEDs entsprechend der nachfolgenden Grafik auf. Als Verbindung zwischen Raspberry Pi und dem Breadboard kannst du die Jumper Kabel nehmen und für alle anderen Verbindung einfachen Draht. Die Farben spielen keine Rolle und sind nur zur besseren Unterscheidung gedacht.
Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 16). Der gewählte Widerstand ist 330Ω (Ohm).
Nun geht es zurück in die Python Konsole, in der wir unseren Code eingeben. Zunächst einmal müssen wir den Pin als Output definieren:
GPIO.setup(23, GPIO.OUT)
Damit stehen nun die Output-Funktionen für diesen Pin zur Verfügung. Mit den folgenden beiden Befehlen können wir die LED erst an- und anschließend wieder ausschalten:
GPIO.output(23, GPIO.HIGH) GPIO.output(23, GPIO.LOW)
Mit diesem Befehl wird einfach gesagt, ob eine Spannung von 3.3V (HIGH) oder von 0V (LOW) angelegt werden soll.
Ist doch ziemlich einfach, oder? Wer eine kleine Blinkschaltung bauen möchte, kann dies z.B. folgendermaßen:
for i in range(5): GPIO.output(23, GPIO.HIGH) time.sleep(0.5) GPIO.output(23, GPIO.LOW) time.sleep(0.5)
Damit wird die LED 5 Mal an- und wieder ausgeschaltet, wobei dazwischen jeweils eine halbe Sekunde gewartet wird, bevor der Status geändert wird.
Raspberry Pi GPIO Pins auslesen – Eingabe
Mit den GPIOs können aber nicht nur Ströme geschaltet werden, sondern auch ausgelesen werden. Daher erweitern wir nun unsere Schaltung um einen Taster. Der Status soll dazu ausgelesen werden und sobald der Taster gedrückt wird, soll die LED leuchten. Wird der Taster nicht mehr gedrückt, so soll die LED auch aufhören zu leuchten.
Zunächst erweitern wir die Schaltung. Neben dem Taster benötigen wir einen 10.000Ω Widerstand, welcher von einem Ende des Tasters an Ground verbunden wird. Dazwischen geht eine Verbindung zum GPIO 24 (Pin 18). Das andere Ende des Schalters wird an die 3.3 Volt Spannung angeschlossen:
Warum das ganze? Solange der Schalter nicht gedrückt ist, ist die Verbindung zwischen der 3.3V Spannung und dem GPIO offen. Damit aber ein eindeutiger Zustand erkannt wird (entweder 0V oder 3.3V), ist die Verbindung über einen sehr großen Widerstand zum Masseanschluss verbunden.
Sobald der Taster gedrückt wird, schließt sich die Verbindung und am GPIO liegen 3.3V an.
Hinweis: Schließe niemals mehr als 3.3V an die GPIOs an, da sie sonst kaputt gehen können.
Kommen wir zum Code. Auch hier müssen wir zunächst den Status festlegen, jedoch wird diesmal der Pin als Input definiert:
GPIO.setup(24, GPIO.IN)
Nun können wir auch schon den Status abfragen:
GPIO.input(24)
Dies wird entweder 0 (wenn der Taster nicht gedrückt wurde) oder 1 (Taster gedrückt) ausgeben.
Im letzten Schritt erweitern wir das Programm nun noch folgendermaßen, sodass die LED immer dann an ist, wenn der Taster auch gedrückt wird.
# Endlosschleife while True: if GPIO.input(24) == 0: # Ausschalten GPIO.output(23, GPIO.LOW) else: # Einschalten GPIO.output(23, GPIO.HIGH)
Abbrechen kannst du den Vorgang übrigens mit STRG+C.
Zusammenfassung
Zusammenfassend gibt es hier noch den Code des gesamten Skripts, falls jemand diesen in einer Datei speichern und als Ganzes aufrufen möchte.
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.OUT) GPIO.setup(24, GPIO.IN) for i in range(5): GPIO.output(23, GPIO.HIGH) time.sleep(0.5) GPIO.output(23, GPIO.LOW) time.sleep(0.5) # Endlosschleife while True: if GPIO.input(24) == 0: # Ausschalten GPIO.output(23, GPIO.LOW) else: # Einschalten GPIO.output(23, GPIO.HIGH)
Falls dir diese Einleitung Spaß gemacht hat, kann ich dir nur das Mini Projekt einer Ampelschaltung empfehlen. Gegliedert in zwei Teile wird darin ein funktionierendes Ampelsystem, bestehend aus Auto- und Fußgängerampel, gebaut.
Weitere Informationen zu diesem Aufbau findest du z.B. hier.
Mit dem hier vermittelten Wissen kannst du bereits erste kleine Projekte starten. Hier ist ein kleiner Vorgeschmack:
- Raspberry Pi: Relais-Schalter per GPIO steuern
- Raspberry Pi Temperatursensor (1-Wire): Temperatur messen
- Raspberry Pi Ampelschaltung mit GPIO Teil 1
- weiterführend auch: Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 1
Im nächsten Teil schreiben wir unsere erste GUI (Graphisches User Interface), womit wir die GPIOs auch per Oberfläche steuern können.
99 Kommentare
Hallo,
mir dieser Serie verstehe ich es sogar, Danke!!
Muss es hier
„Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 12). Der gewählte Widerstand ist 330Ω (Ohm).“
nicht Pin 16 heissen?
Du hast natürlich Recht. Ich habe es verbessert, danke für den Hinweis.
Super Arbeit! Weiter so!
L.G. G.
ehrenmann
bestens,
auch dieses tut abgearbeitet
nur ist mir dabei aufgefallen wenn er auf tastendrückwartet mit der cpu last auf 100 % ist und die temp ganz schön nach oben schnellt. irgentwo habe ich da was mit interruppt oder event entdeckt was ich mit meinem py kenntnissen noch nicht einarbeiten kann.
mit dir und deiner hp macht es auch echt spass alles umzusetzen und zu lernen
glaube dadurch habe ich so einige pis das leben gerettet ..(habe einen auf dem gewissen dank motorshild, meine py und elktro kentnissen :))
Das ist richtig, aber ich habe es bewusst weggelassen. Die meisten, die das Tutorial lesen, haben kaum / keine Erfahrung mit den GPIOs und Interrupts etc. helfen dabei meiner Meinung nach nicht beim Verständnis. Vielleicht baue ich das in einem der folgenden Teile ein.
ja das wäre klasse wenn du da auch noch bischen drauf eingehst, in deinen späteren tuts wird bestimmt mal ein eckchen frei sein
Es ist aber nie gut, etwas erst falsch zu lernen um es später zu berichtigen. Eine solche schleife sollte man zumindest so bauen, dass sie nur alle 100ms einmal durchlaufen wird, z.B. mit Hilfe eines Schlafbefehls.
Warum verwenden Sie nicht das modernere und weiter entwickelte GPIOzeo
https://media.readthedocs.org/pdf/gpiozero/latest/gpiozero.pdf
Ich fand es wichtiger, dass man erst einmal ein „Aha-Erlebnis“ bekommt und sieht, dass das Ansteuerung doch Einfacher als vielleicht gedacht ist. Die Wahl der Bibliothek ist dabei zweitrangig. Wer ein bißchen Erfahrung gesammelt hat, kann die Bibliothek ja immer noch wechseln.
Hi Felix, du bist der Hammer. Einfach weiter und weiter.
Hallo,
erstmal vielen Dank für die tolle Seite !!! Habe jetzt mal 2 Fragen:
1. (wahrscheinlich ganz dumme Frage) : bei der aller ersten Schaltung versteh ich das rote Jumper-Kabel nicht. Vom Pi aus Pin1 an das Board +, aber dann? Wie schließt sich der Kreislauf?
2. Frage: Wenn ich neue Sachen am Board umstecke, muss ich davor immer den Pi herunterfahren, oder kann ich gleich neue Schaltungen ausprobieren?
Hallo Leo,
richtig, in der ersten Schaltung wird das rote Kabel (noch) nicht gebraucht. Allerdings in der nächsten Schaltung. Außerdem wollte ich schon auf die Verwendung der seitlichen Breadbordleiste hinweisen (für VCC/GND).
2. Solange du dir deiner Schaltung sicher bist, brauchst du ohn nicht auszuschalten / vom Strom trennen. Du solltest aber auf keinen Fall einen Kurzschluss (VCC direkt an GND) verursachen, da das den Pi grillen könnte.
Vielen Dank für die rasche Antwort! Etwas habe ich noch nicht ganz verstanden bei dem Beispiel mit dem Schalter. Könntest du das vielleicht noch etwas genauer erklären bzw. kann ich wo anderst nachlesen?
Habe ich das richtig so verstanden: Die LED hat einen eigenen „Kreislauf“ und der Schalter hat einen eigenen „Kreislauf“. Wenn der Schalter gedrückt wird, dann wird über das Programm mitgeteilt, dass PIN 16 Strom durchlassen soll -> somit leuchtet die LED?
Frage: wenn der Schalter nicht gedrückt ist, dann fließt doch kein Strom, oder? Warum brauche ich dann den 10k-OHM Widerstand? Warum befindet sich der Widerstand erst nach dem gelbem Jumperkabel?
Am besten du ignorierst die VCC Verbindung im ersten Schaltbild komplett. Deine Annahme ist soweit richtig. Der Input Pin mit Schalter dran, erkennt wann er gedrückt wurde (da Strom fließt) und wir sagen daraufhin dem anderen Pin, dass dieser Strom für die LED schalten soll.
Bzgl. der Frage: Es gibt nur zwei Zustände: 0V Spannung oder 3.3V Spannung. Wenn nun keine Spannung anliegt, haben wir keinen eindeutigen Zustand. Daher schließen wir den Pin über einen sehr großen Widerstand (10k) an GND an. Daraus folgt, dass wenn der Schalter nicht gedrückt wird, definitiv 0V anliegen. Wenn der Schalter gedrückt ist, fließt ein winziger Teil der Spannung über den Widerstand (daher grpßer Widerstand), allerdings macht dies nichts aus, denn der größte Teil kommt an unseren Pin an und wir haben wieder einen eindeutigen Zustand (HIGH). Weiterführende Literatur: Pull-Up/Down Widerstand.
Hallo,
jetzt muss ich doch nachfragen.
In dem Teil:
„Die LED hat zwei unterschiedlich lange Enden. Das längere Ende kommt an die positive 3.3 Volt Spannung des GPIO 23 (Pin 16). Der gewählte Widerstand ist 330Ω (Ohm).“
Woher weiss ich denn das GPIO23 positive Spannung hat?
Die Spannung schalten wir per GPIO (HIGH = 3.3V, LOW = 0V).
Hallo,
die LED leuchtet ja nur, wenn der Taster gedrückt ist! Wie könnte man es programmieren, damit der Taster als Ein- und Ausschalter für die LED funktioniert?
Alex
Hallo,
kleiner Nachtrag: Es funktioniert nur dann nicht so wie gewünscht, wenn man die LED in einer Schleife blinken lassen möchte, aber zudem noch mittels GPIO.add_event_detect() triggern möchte.
Alex
Hab da mal eine kleine Verständnisfrage: Bei dem Bild (Aufgabe)
„Raspberry Pi GPIO Pins schalten – Ausgabe“
geht eine Steckverbindung vom Pin 3V3 auf das Board! Aber das war es dann auch schon, oder?
Die Verbindung ist doch Sinn- und Zwecklos. Ich bin kein Elektriker, will aber dabei was lernen, und dieses Kabel erscheint mir unnötig! In der nächsten Aufgabe benutzt man ja dann die auf Reihe „+“ anliegenden 3,3V. Aber bei dem ersten Bild…… klärt mich auf! Cheers Joey
Im ersten Schaubild hast du recht, allerdings erweitern wir die Schaltung ja kurz darauf (wo sie dann benötigt wird).
Eine Sache habe ich hier dann doch zu kritisieren: die Überschrift! 😉
Ich habe eine ganze Weile nach Teil 1 der GPIO Erklärung für Beginner gesucht, bis ich anhand des Inhalts darauf gekommen bin, dass sich das „Teil 2“ nur auf die Programmierung bezieht…
Ich würde vorschlagen, die Überschrift bei Tut-Serien nach einem festen Schema aufzubauen. Dann hieße dieses Kapitel also:
Programmieren lernen am Raspberry Pi – Teil 2: GPIO Erklärung für Beginner
Zwar wird hier auch ein wenig HW erklärt, aber das widerspricht ja nicht dem „Programmieren lernen“.
Servus, ich verstehe nachfolgendes aus dem Blinklicht-Thema gerade nicht:
Wird hier nicht für einen Wert „i“ eine Reichweite/Wiederholung definiert? Bitte um Erläuterung worum es sich bei dem „i“ handelt.
„i“ ist eine Variable, die die Werte 0,1,2,3,4 annimmt. Wir könnten sie auch nutzen, aber brauchen es in diesem Beispiel nur für eine kleine Veranschaulichung.
Noch was:
„Warum das ganze? Solange der Schalter nicht gedrückt ist, ist die Verbindung zwischen der 3.3V Spannung und dem GPIO geschlossen. Damit aber ein eindeutiger Zustand erkannt wird (entweder 0V oder 3.3V) ist die Verbindung über einen sehr großen Widerstand zum Masseanschluss.
Sobald der Taster gedrückt wird, schließt sich die Verbindung und am GPIO liegen 3.3V an.“
Ist das nicht falsch ausgedrückt? Soll das nicht heißen „Solange der Schalter nicht gedrückt ist, ist die Verbindung zwischen der 3,3V Spannung und dem GPIO NICHT geschlossen“?
Ja, sehe ich auch so. Die Formulierung ist falsch.
Stromkreis geschlossen = Strom fließt und LED leuchtet.
Stromkreis nicht geschlossen/offen = Kein Strom fließt und LED leuchtet nicht.
Mal ne Frage zum Programmcode:
wieso wird die Blinksequenz (FOR-Schleife) nicht die WHILE-Schleife eingebetet. Im obigen Code-Beispiel wird der GPIO doppelt angesprochen. Einmal in der For-Schleife und der While-Schleife…!?!?
Ich denke eine Schleifen-Kaskade wäre hierbei sinnvoller. Hierbei würde die Taster-Abfrage über der While-Schleife als eine Art Watchdog fungieren.
Mag jemand dies mal kommentiern, ob damit richtig liege ;-)))
Danke
Das fungiert nur als Beispiel. In der for Schleife ist keine Interaktion auf einen Input (blinkt einfach nur ein paar Mal). ANders bei der endlosen while Schleife (Taster gedrückt = LED an).
Hallo,
ich habe eine Frage: Wenn ich bei dem Blinken der LED im ersten teil des Tutorials das Programm mit enter bestätige, sagt Python zu „time“: „SyntaxError: invalid Syntax“. Woran kann das liegen?
LG
Schmiddi
Nachtrag:
Ich nochmal: als ich dein Script per copy-paste in Python eingefügt habe, hats einwandfrei funktioniert. nur ist meine Frage jetzt: warum ist mein „time“ anders als dein „time“?
Danke im Vorraus
LG
Schmiddi
P.S.: Ich hoffe dich stört´s nicht, dass ich dich dutze 😀
Ich nehme an, dass du etwas weggelassen hast. Kannst du mal deinen gesamten Code posten? PS: Du ist absolut in Ordnung 😉
Hallo Felix,bin totaler Neuling bezüglich programmieren mit Python.Ich habe dein Programm zur Ampelsteuerung abgeschrieben und ausprobiert. Statt LED´s steuere ich eine Relaisplatine an.
Meine Frage: wie kann ich das Programm so steuern,das die Relais auch am Ende wieder alle
ausschalten und ich das Raspi 3 nicht immer neu starten muss?
LG Uli
Meinst du, sobald du das Skript beendest? Dann einfach mit einem try..catch und im catch Block entsprechend auf den Wert setzen, auf dem du es gerne hättest.
Hallo Felix,dank für deine Antwort.Bitte erkläre einem ü55 Jahren was ein
try..catch ist.
Schönes Wochenende. Gruß Uli
Hallo Uli,
ein try-catch Block ist dazu da, um Fehler abzufangen. Zunächst schreibst du den Code der evtl. zu Fehlern führt in den try Block und im catch Block definierst du, was passieren soll, falls es wirklich zum Fehler kam: https://docs.python.org/3/tutorial/errors.html
In deinem Fall würde ein Abbruch per STRG+C einen Fehler erzeugen, daher kannst du darauf im catch Block entsprechend eingehen.
LG, Felix
Hallo,
ich stand vor dem gleichen Problem. Es gibt keine zuverlässige Softwarelösung!
Eine try -Schleife bietet zwar einen gewissen Schutz aber eben nicht zuverlässig.
Wenn sich das Programm aufhängt, in einer Endlosschleife hängen bleibt oder abstürzt, dann verbleiben die GPIO in der letzten Position. Bei einer Spielzeuganwendung mag das gehen. Wenn bei einer Verkehrsampel eine Fahrtrichtung über Stunden rot bekommt ist das nicht mehr lustig. Wenn man einen Motor ansteuert und der ungebremst gegen etwas fährt wirds nicht nur teuer sondern eventuell auch gefährlich.
Abhilfe schafft aber eine Hardwarelösung.
Ein GPIO gibt über eine Scheife Impulse aus, die auf den Eingang eines retrigerbaren Monoflops (74HCT123 ) gelangen. Die Zeit muß so lange den Ausgang halten, bis der nächste Impuls sicher eintrifft.
Sollte jetzt warum auch immer das Programm keine Impulse mehr senden schaltet das Monoflop die Betriebsspannung der Relais ab. Das löst Dein Problem und sicher auch viele andere.
Hallo Felix…
Absolut Top deine Tutorials!!!
Ich versuche grade einen DHT22 mit einer Led zu kombinieren und stehe vor folgendem problem:
kurzes Zenario:
temperatur 25 = langsames blinken
problem:
mit
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
setze ich ja Temperatur und Luftfeuchte
dieser Vorgang dauert so gefühlte 4sekunden
nun würde ich gerne in einer while True schleife die leds ihren dienst tun lassen und aller 2minuten
mit
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
aktualisieren
nur wie stelle ich das an?
ich hänge ja in der while schleife fest die die leds blinken lässt und komme nicht mehr dazu die Temperatur zu aktualisieren. die temperatur kann ich ja in der while schleife nicht mit aktualisieren lassen weil: led blinken 0.5s temperatur aktualiseren 2minuten
Ich habe grade echt null Plan.
wäre für ein codeschnipppsel sehr dankbar
kurzes Zenario:
temperatur kleiner 25 = schnelless blinken
temperatur 25 = leuchten
temperatur größer 25 = langsames blinken
so wollte ich es schreiben… ist wohl beim senden was verloren gegangen
Du hast eine 5 Sekunden Schleife. Davor erstellst du einen Zähler (anfangs auf 0). Jedes mal in deiner 5 Sekunden Schleife erhöhst du den Wert. Ist der Wert = 24 (24*5=120sek) so fragst du die Temperatur ab und setzt den Zähler wieder auf 0.
mh….
Bin Absoluter Neuling bei Raspi und Python und habe mal den Code eingetippt.
Bei mir kommt bei der „Endlosschleife“ bei else: immer ein Syntaxfehler und ich habe keine Ahnung
warum?
Syntaxfehler… und weiter? Bitte mit genauer Fehlerbeschreibung. Am besten inkl. der Zeile, in der der Syntaxfehler sein soll. Könnte von zu wenig/vielen Lerrzeichen bis zu Tippfehlern alles sein.
Hallo ich bin noch relativ neu hier und wollte die LED schaltung mal ausprobieren allerdings habe ich einen Fehler drin wenn ich das programm starten möchte
invalid syntax
und er markiert in der ersten zeile (Python 2.7.13 …. ) die Zahl 7
muss ich da erst ein update machen
Nein, die Syntax ist nur fehlerhaft. Poste bitte den Code, damit ich dir sagen kann, woran es genau liegt.
Hallo,
wird im zweiten Schaltplan bei gedrücktem Taster die Verbindung von 3.3V zum GPIO-Input nicht kurzgeschlossen? Das würde den Pi doch beschädigen, oder wie funktioniert der Input-Pin?
Der Input Pin „misst“ anliegende Spannung – 3.3V=HIGH, 0V/GND=LOW
Ok, vielen Dank für die schnelle Antwort! Das bedeutet, man kann einen Input-Pin bei 3.3V ohne Vorwiderstand betreiben?
Ja aber nicht mehr als 3.3V. Mit Widerstand kann es sogar sein, dass der Status nicht richtig erkannt wird.
Vielen Dank für die Einrichtung dieser Frageseite.
Mein Enkel (13) hat über Wahlfach (Schule) einen raspberry pi3 und Zubehör erworben.
Nun soll gemeinsam mit mir daran gearbeitet werden. Ich bitte um Ihre
Hilfe. Wie erfolgt die Befehlseingabe manuell, habe alte Tastatur mit Schnittstelle PS 2 und
Adapter PS 2 – USB?
Wie werden die Befehle und ihre Auswirkungen sichtbar, habe Flachbildschirm (14″) mit VGA-Schnittstelle und Adapter VGA-USB?
Für Ihren Rat herzlichen Dank, verbleibe mit freundlichem Gruß
Hermann Wilhelm
Ein VGA Display wird hier nicht viel bringen, es müsste schon ein HDMI Display sein (ggf. mit Adapter).
Ansonsten einfach diesem Artikel folgen: Raspberry Pi Einstieg – Was brauche und wie starte ich?
Ich muss jetzt doch kurz mal nachfragen: Der Widerstand muss doch in Stromflussrichtung vor die LED, oder? Wenn der Strom vom PIN16 kommt muss der Widerstand doch anders eingesteckt sein.
Oder bin ich jetzt ganz falsch.
Gruß und danke für eine Antwort
Es ist egal, wohin du den Widerstand setzt.
HI
Thanks for the great guide.
I like to ask regarding the resistor between the ground to the output of the switch, why do we need this resistor (10K) ?
if i am not wrong, the GPIO can receive 3.3V , so theoretically i can connect between pin 1 and pin 18 directly ?
I am asking, because when i try it, the Pi performed reset 🙁 (i tried it only once)
Thanks
Eyal
The problem is, that if there is neither 0V (GND) or 3.3V, the pin does not know know what status it has. With a connection to GND, we force it to have 0V. If there is 3.3V only a small amount of current goes to GND, but e.g. 3.25V go to the GPIO Pin.
Hallo!
Tolles Tutorial, allerdings wird mir ein Fehler angezeigt:
Traceback (most recent call last):
File „blinkled.py“, line 1, in
import RPI.GPIO as GPIO
ImportError: No module named RPI.GPIO
Hiernochmal mein Programm um evtl. einen Fehler zu finden:
import RPI.GPIO as GPIO
import time
GPIO.setmode(GPIO.Board)
GPIO.setup(17,GPIO.OUT)
GPIO.output(17,GPIO.LOW)
dauer = 0.5
for x in range(10):
GPIO.output(17,GPIO.HIGH)
time.sleep(dauer)
GPIO.output(17,GPIO.LOW)
time.sleep(dauer)
GPIO.cleanup()
Ich nutzte den Raspi 3 Modell B, was mache ich falsch?
Dankeschon mal im Vorraus
Das i in RPi.GPIO muss klein geschrieben werden!
Dankeschön, dann ist dieser Fehler schon behoben.
Aber wieso zeigt er mir nun folgendes an:
File „blinkled.py“, line 12
GPIO.output(17,GPIO.HIGH)
^
IndentationError: expected an indented block
Die LED blinkt natürlich nicht 🙁
Danke dir für den schnellen Support!
Dir fehlen Einrückungen. Bitte das erste Tutorial der Reihe beachten, da wird das erklärt 🙂
Ist es möglich alle GPIO als Eingang zu überwachen und in einer Schleife anzuzeigen welche Eingänge sich verändert haben ( Das ganze in Abständen von unter ro MilliSekunden) ; 20mal hintereinander ??
Ja, natürlich.
Ja das geht. Überhaupt kein Problem, aber kaum mit Python. Mit einem compilierten Programm und einem vernünftigen Treiber, erfasst Du den Status aller GPIO´s auf einmal in einer 32 Bit Zahl. Über eine UND -Verknüpfung filterst Du alles raus, was nicht benötigt wird. Dann speichest Du das Ergebnis in Einer Matrix ab. Entweder vergleichst Du sofort mit dem vorherige Ergebnis auf Gleichheit oder Du wartest 20 Schleifen ab und vergleichst dann.
Hallo, ist es möglich einen GPIO aus Ausgang zu definieren und anschließen seinen Zustand als GPIO input abzufragen?
Vielen Dank
Ja entweder ständige Abfrage in einer Schleife oder den GPIO als interruptquelle definieren und dann eine Aktion starten
Hallo Felix
Super dein Tutorial. Ich bin absoluter Neuling und hab mich zur While Schleife vorgearbeitet. Jetzt möchte ich gerne wissen wie ich meinen Code in einem ausführbaren Script speichern kann, so wie ich das in Unbuntu mit dem Editor mache.
lg
Mega Beitrag, hilft mir echt sehr
Hallo Felix,
Danke erstmal dafür, da? Du den Einstieg in RasPi und Python so einfach machst 🙂
Ein Problem habe ich aber mit dem Script. In dem Moment wo die Endlosschleife beginnt geht die CPU-Auslastung meines RasPi2 B+ auf ca. 95% hoch:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
683 pi 20 0 9588 5288 3608 R 95,2 1,2 0:07.52 python
Gibt eine Ressourcen-schonendere Alternative zu der Schleife?
Ich hab’s selbst herausgefunden. Ich füge nach jeder GPIO.out-Zeile eine Zeile time.sleep (0.1) ein.
Damit reduziert sich die CPU-Belastung dramatisch.
Hallo Felix,
ist es möglich eine Temeratur zu messen und einen Port als Eingang zu verwenden? Bei meinen Versuchen konnte ich die Temperetur messen. Wenn ich dann aber einen Port als Eingang verwendet habe, ging die Temperaturmessung nicht mehr.
Wenn es geht, was muss ich tun, um beides zu messen
Grüße Peter
Hallo Felix,
Hab inzwischen herausgefunden, dass „dtoverlay=w1-gpio“ hilft, aber wie formulier ich das Systemkommando für die Schlange?
Grüße Peter
Ich gehöre wahrscheinlich zu den „zukünftigen Anfänger“. D.h. ich möchte mir einen Raspberry Pi zulegen. Nachdem ich ein paar Tutorials angesehen habe, (finde ich sehr sehr gut gemacht) habe ich trotzdem ein paar Anfängerfragen:
1. Es heißt immer, dass man einen Monitor an den HDMI Port anschließen soll. Da der Monitor aber mindestens doppelt so teuer ist, wie der Raspberry, möchte ich zunächst ohne Monitor starten. Kann ich den Raspi auch an einen Fernseher anschließen und dann SSH aktivieren, so dass ich für den normalen Betrieb ohne Monitor auskomme?
2. Wenn ich eine Anwendung geschrieben und gespeichert habe, möchte ich die Anwendung ohne Monitor betreiben. Also einfach den Raspi einschalten? Wie weiß der dann welche Anwendung er starten soll ? Und wie startet überhaupt eine Anwendung. (Ohne angeschlossenen Monitor).
Wäre toll, wenn mir jemand die einfachen Fragen beantworten könnte, bevor ich mir so ein Ding kaufe.
Hallo,
Du kannst ein Composite-Video-Kabel (Koaxkabel) verwenden und einen normalen Fernseher verwenden. Im Netz findest Du dazu genügend Beispiele. Die Qualität wie bei HDMI wird zwar nicht erreicht, aber für den ersten Anfang sollte es langen.
Hallo,
ich finde die Beispiele hier sehr gut erklärt und gut nachvollziehbar. Um Abwandlungen an den Beispielen zu versuchen, frage ich mich, ob es eine Liste der Bibliotheken mit den ganzen Funktionen darin für RPi und Python gibt? Leider konnte ich darüber nichts finden.
Hallo ich habe auch eine frage , bin kompletter neuling, habe den Code 1 zu 1 so abgeschrieben, nur irgendwie geht das mit dem Schalter bei mir nicht so ganz, der leuchtet dauerhaft und geschaltet wird da gar nix wo ist der fehler? Rest bis dahin geht ohne probleme.
Wie würde man am besten ein Programm schreiben, wenn man eine Aufgabe wie die hier vor sich liegen hat?
Kurzer / Langer Tasterdruck:
Schreiben Sie ein Programm, dass bei einem kurzen Druck auf Taster A die LED1 zum
Leuchten bringt. Bei einem langen Druck hingegen LED2. Die Leuchtdauer soll für beide LEDs
1 Sekunde betragen. Ein lang
Wie würde man am besten ein Programm schreiben, wenn man eine Aufgabe wie die hier vor sich liegen hat?
Kurzer / Langer Tasterdruck:
Schreiben Sie ein Programm, dass bei einem kurzen Druck auf Taster A die LED1 zum
Leuchten bringt. Bei einem langen Druck hingegen LED2. Die Leuchtdauer soll für beide LEDs
1 Sekunde betragen. Ein langer Tastendruck liegt vor, wenn die Taste für länger als 2
Sekunden gedrückt bleibt.
Du misst die Zeit beim Begin („on Button down“) und zum Ende („on Button up“) und je nach Länge reagierst du.
Hi,
erstmal danke für das tolle Tutorial. Leider will es noch nicht ganz so.
Vielleicht kannst du mir auf die Sprünge helfen, woran es liegt.
Python 2.7.3 (default, Nov 24 2017, 21:13:24)
[GCC 4.6.3] on linux2
Type „copyright“, „credits“ or „license()“ for more information.
>>> import RPi.GPIO as GPIO
>>> import time
>>> GPIO.setmode (GPIO.BCM)
>>> GPIO.setup (23, GPIO.OUT)
Traceback (most recent call last):
File „“, line 1, in
GPIO.setup (23, GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
hey felix, super anleitung.
hätte allerdings eine frage :
am ende des scriptes ist die led ja an, sobald ich den taster betätige geht sie aus.
wie kann ich das so schreiben, das, wenn der taster 2 sekunden nicht betätigt wird das script beendet wird, also die pins wieder auf standart gehen?
Hallo Felix,
ich bin absoluter Neuling bei Python und den Raspberrys. Mein Code sieht folgendermaßen aus:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.output(23, GPIO.HIGH)
GPIO.output(23, GPIO.LOW)
for i in range(5):
GPIO.output(23, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(23, GPIO.LOW)
time.sleep(0.5)
Ich erhalte folgenden Fehler:
Traceback (most recent call last):
File „/usr/lib/python3.5/ast.py“, line 35, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File „/home/pi/GPIOs.py“, line 1
import RPi.GPIO as GPIO
^
IndentationError: unexpected indent
Ich komm nicht ganz dahinter, was jetzt das Problem ist. Also passt was mit dem Import der GPIOs nicht aufgrund der Rückgabe im ast.py?
Ich bin mir nicht sicher und ich kriege es nicht gelöst.
Schon mal vielen Dank!
Super Blog
weiter so 😉
seid nh nette truppe #EHRENMANN
Moin!
Frage von einem Anfänger:
Wie Programmiere ich einen Zähler? Über einen Eingang soll er rauf, über einen anderen Eingang runter Zählen. Und immer dann, wenn der Zähler ungleich null ist, soll eine Ablaufteuerung aktiv sein.
Vielen Dank im Voraus!
Moin ibims FRED;
ALT+F4 und die Sachen sind vom Tisch
Vielen Dank, schön erklärt.
Ich brauchte nach dem zweiten Durchlauf plötzlich den Befehl:
GPIO.setwarnings(False), um das ganze noch Mal laufen zu lassen.
Sonst kommt immer bei GPIO.setup(23, GPIO.OUT) die Fehlermeldung, der Channel wäre schon „in use“.
Wie kann ich dafür sorgen, dass er nicht mehr „in use“ ist?
I played a bit around with your example, thank you for giving me an easy start. In the end, I made this code and would like to share it:
from gpiozero import LED, Button
from signal import pause
from time import sleep, time
##means comment
#the class Button becomes with the following command
#another attribute called toswitch
#it will be used to give additional parameters to the functions
#that are called when pressed or released
Button.toswitch = LED
#the on-off series is packed in a function/procedure and can be
#called for different LEDs in future
def Functiontest_LED(switchable = LED):
print(‚LED test‘)
for n in range (0,3):
switchable.on()
print(‚LED is on‘)
sleep(0.5)
switchable.off()
print(‚LED is off‘)
sleep(0.5)
return
#this is the function, what shall be done, when the button is pressed
def But_pressed(button):
button.toswitch.on()
print(button,’pressed‘)
print(button.toswitch,’LED is on‘)
return
#and here the function for release
def But_released(button):
button.toswitch.off()
print(button,’released‘)
print(button.toswitch,’LED is off‘)
return
#initialize the LED at GPIO 23
red = LED(23)
Functiontest_LED(red)
#initialize the Button at GPIO24, and define pressed as high (3.3V)
#default would be pull_up=True
button = Button(24,pull_up=False)
#now let the button know, what it has to switch in the functions
#But_press and But_released
button.toswitch = red
#behing But_pressed and But_released should be no brackets with parameters,
#because you want to pass the funtion itself, not the result of the funtion to
#button.when_pressed
button.when_pressed = But_pressed
button.when_released = But_released
pause()
Hi zusammen,
ich habe eine kurze Frage zu den Schaltungen oben.
Vom GPIO-PIN 23 wird hier per Jumber-Wire direkt auf die LED gegangen.
Dann läuft der Strom durch die LED und erst anschließend kommt der Widerstand.
Das bedeutet jedoch, dass die LED in keinerlei Weise geschützt ist.
Bräuchte es nicht aufh noch zwischen dem GPIO-PIN 23 und der LED einen Widerstand?
Hey kurze Frage:
Wie kommst du auf 330Ohm?
Hi Felix, wie kann ich Eingänge sperren wenn ein Eingang in Benutzung ist?
Ich möchte einen Stepper mit 6 Tastern steuern, sobald einer aktiv ist sollen die anderen 5 inaktiv sein.
Hallo, ich habe es mit eurem Tutorial geschafft eine ganze Winterlandschaft mit Häusern, Bahnhof, Karussells usw. zu steuern. Auf meinem RasPi 3b+ lief alles einwandfrei. Da dieser nun den Geist aufgegeben hat, habe ich mir einen RasPi4b+ zugelegt. Die gleichen Scripts auf die Karte kopiert und es tut sich nichts. Müssen hier die GPIO´s anders programmiert werden?
Hallo,
ich bin noch Raspberry Anfänger und interessiere mich für Sensoren bzgl. Gartenbewässerung, RTC, Bewegungsmelder, Oled Display ect.
Ich habe mir auch passende Anleitungen sowie das Einsteigerbuch gelesen. Doch die besten Antworten finde ich immer hier.
Ich habe nun folgendes Problem. Die meisten Sensoren haben GRND, VCC, SDA1 und SS… irgendwas.
Mit einem Breadboard verbunden, alles gut. Aber bei den Pins sind die immer an den gleichen.
Kann ein solcher Pin auch 2 Sensoren abfragen? Laut meiner Theorie nicht. Mein denken sagt, ich müsste einen weiteren Pin einstellen, der mir den 2. Sensor auslesen kann. Hat da vielleicht jemand Hilfe für mich parat? Vielleicht auch mit Foto?
So, ich bedanke mich erstmal, dass man hier so viel lesen und entdecken kann.
MfG P.Stephan
An Pins wie VCC und GND kannst du quasi beliebig viel anschließen, die sind nur für Spannung. Bei reinen Datenpins (GPIOs) sollte nur ein Gerät dran. Aber z.B. SDA, SCL können auch mehrere Geräte gleichzeitig ansprechen, da jedes Gerät eine Adresse bekommt und falls diese nicht stimmt, so wird das Signal vom Gerät ignoriert (ganz einfach ausgedrückt).
Eine gute Informationsquelle
Guten Tag,
ich habe eine Frage. Ich verstehe nicht ganz, warum bei dem Tasterbeispiel der 10k Widerstand benötigt wird. Man könnte ihn doch komplett weglassen, oder? (Wahrscheinlich nicht, sonst hätte man ihn ja weggelassen, aber wofür ist der da?)
Viele Grüße
Ohne diesen Widerstand wäre der GPIO-Pin bei offenem Schalter (nicht betätigt) in einem undefinierten Zustand. Der 10k-Widerstand legt diesen undefinierten Zustand nun quasi als „AUS“ fest.
Taster/ Druckschaltern : Beim PI 3 erzeugt alleine das Anschließen von zwei Kabeln an beliebigen 2 PINs (eines Ground, anderes ein GPIO) ein Feuerwerk an EIN-AUS-Zuständen (=geschlossen / geöffnet), Habe es an mehrern PIN-Paaren testest. Habe verschiedene Kabel genommen, habe sogar die PINs angelötet um dem Verdacht entgegen zu treten, die Steck-Kontakte seien Wackler.
Nochmals, an dem Kabel von 20cm ist NICHTS dran, habe den 10k-Widerstand rausgelötet. Es ist also auch der Taster kein „Wackler“. Wie ist das zu erklären?
Frage ich PIN-Paare ohne gestecktes Kabel ab, dann ist es ok: immer Antwort: nicht gesteckt=Aus=offen. Mein PI 3 hier ist offenbar so empfindlich, dass schon eine Kabel-Verlängerung zu einem Zufallsgenerator für EIN/AUS führt. Ich frage in einer Schleife alle Sekunde ab, dann ist meistens 4 x hintereinander offen/AUS dann einmal geschlossen/EIN, dann wiederholt sich das. Aber alle 20 Sekunden mal wird z.B. 3x hintereinander geschlossen/EIN erkannt. Nochmals: Widerstand herausgelötet, das Kabel mit Taster ist offenes Kabel! An PIN 8, 14 und 24 getestet.
Danach nur einen Stecker mit ca. 5mm abgezwicktem Restkabel daran angesteckt. Damit wird noch dauerhaft „AUS/offen“ ausgelesen.
Dann an den Kabelstumpen von der 24 eine Spule mit 22uH angelötet,. hat noch 4cm lange Anschlussdrähte weil neu. Nur das angelötet, das andere Ende der Spule, ebenfalls 4cm Anschlussdraht, ragt in die Luft. Und schon habe ich wieder die „EIN/geschlossen“-Zustände!! Aber nur einmal 2 Sekunden nach dem Einstecken, 2 Sekunden hintereinander „EIN“. Danach dauerhaft „AUS“, was richtig ist. Also: schon 4 cm Anschlussdraht und es gibt „EIN“-Zuständen.
Heute abend kürze ich den Anschlussdraht, dann teste ich weiter,
S o, Anschlussdraht gekürzt und trotzdem immer noch wildes Ein/Aus-Feuerwerk beim Auslesen des GPIO. Also muss ich mich auf die Suche nach einer anderen Technik machen, einen Tastendruck (über 10kOhm) auszulesen. Wer hat da eine Idee?
Gelöst! Ich hatte den Zustand des nicht geschalteten GPIO als definiert angenommen, sie sind es aber NICHT! Mit pullup-Widerstand 56kOhm und sicherheitshalber einem Querwiderstand von 2,7KOhm habe ich jetzt nach dieser https://www.elektronik-kompendium.de/sites/raspberry-pi/2006051.htm wundervollen Anleitung was ich brauche 🙂 Dank an dieses Tutorial und an das von elektronik-kompendium.
Hi,
ich habe dein Setup ausprobiert und mehrfach überprüft, allerdings leuchtet die LED immer dauerhaft – unabhängig davon ob dich den Knopf drücke oder nicht.
Es scheint so, als würde der GPIO dauerhaft Input geben.
Habe es auch mit verschiedenen GPIOs ausprobiert ohne Veränderung.
Daher die Frage: Ist der Widerstand zu niedrig oder vielleicht sogar kaputt?
Danke für die Hilfe!
wie kann ich das Skript ausführen? bei sudo Python test.py kommt Syntax error…
Hallo,
speichert der Pi die Pin-Belegung irgendwo im Hintergrund?
Ich frage, da ich folgende Fehlermeldung bekomme:
>>> GPIO.setmode(GPIO.BCM)
>>> GPIO.setup(23, GPIO.OUT)
__main__:1: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
>>>
Ich hatte das vorher schon mal eingegeben, habe dann aber ein paar Eigenarten festgestellt/Fehler gemacht und letzten Endes das Programm Thonny Python IDE wieder geschlossen (ohne etwas zu speichern).
Dann das Programm wieder geöffnet.
Wie oder wo kann man den Pin jetzt „resetten“, damit ich weiter testen bzw. diesen Pin wieder benutzen kann?
Grüße
Peer