Weiter geht es also mit dem zweiten Teil und der eigentlichen Ampelschaltung. Schauen wir und erst einmal die verschiedenen Ampelphasen auf Wikipedia an. Diese wollen wir auf Tastendruck nachbauen.
(Quelle: Wikipedia)
Zu erst einmal bauen wir die Schaltung auf:
Wir haben also die folgenden Phasen:
- kein Tastendruck – dauerhaft rot (gelb und grün aus)
- Taster wird gedrückt – rot und gelb leuchten (grün aus), Dauer: 3 Sekunden
- Wechsel auf grün (rot und gelb aus), Dauer: 15 Sekunden
- Wechsel auf gelb (rot und grün aus), Dauer: 3 Sekunden
- Zurück zu Schritt 1.
Diese gilt es nun in Code umzusetzen. Ich habe dazu beispielhaft ein Skript erstellt:
sudo nano ampel_skript2.py
Dieses Mal nehme ich anstelle der Pin-Nummern die GPIO Belegunsgsnummern.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#Bibliotheken einbinden import RPi.GPIO as GPIO import time #GPIO Modus (BOARD / BCM) GPIO.setmode(GPIO.BCM) #Warnungen ausschalten GPIO.setwarnings(False) #GPIO Pin Belegung ROT = 02 GELB = 14 GRUEN = 15 TASTER = 07 #Richtung der GPIO-Pins festlegen (IN / OUT) GPIO.setup(ROT, GPIO.OUT) #rot GPIO.setup(GELB, GPIO.OUT) #gelb GPIO.setup(GRUEN, GPIO.OUT) #gruen GPIO.setup(TASTER, GPIO.IN) #Taster #Umschaltung definieren def umschalten(): #Phase 2 GPIO.output(ROT, True) GPIO.output(GELB, True) GPIO.output(GRUEN, False) time.sleep(2) #Phase 3 GPIO.output(GRUEN, True) GPIO.output(ROT, False) GPIO.output(GELB, False) time.sleep(15) #Phase 4 GPIO.output(GELB, True) GPIO.output(GRUEN, False) time.sleep(3) #zurueck zu Phase 1 GPIO.output(ROT, True) GPIO.output(GELB, False) #Endlosschleife while True: #Phase 1 GPIO.output(ROT, True) GPIO.output(GELB, False) GPIO.output(GRUEN, False) #Status des Tasters einlesen tasterStatus = GPIO.input(TASTER) if (tasterStatus): umschalten() |
Aufgerufen wird es wieder mit
sudo python ampel_skript2.py
Die rote LED leuchtet auf und bei Drücken des Tasters wird die Funktion aufgerufen und die Ampeln gewechselt. Die Ausführung des Skrips mit STRG + C beendet.
Die Funktionen können umgeändert und erweitert werden. Hier noch ein Bild meiner Schaltung.
37 Kommentare
Moin Moin,
vielen Dank für dieses Tutorial. Ich habe den Aufbau und das Script nach Vorbild eingebaut, allerdings erhalte ich bei der Ausführung des Scriptes:
File „ampel_skript2.py“, line 53
umschalten()
^
IndentationError: expected an indented block
Hey,
du hast recht, da ist ein Tab verloren gegangen. Ich habe es verbessert 🙂
Hallo, tolle Seite für Anfänger wie mich, wie sehen die letzten beiden Zeilen des skripts dann richtig aus ?
So wie es da steht ist es richtig (habe es längst angepasst) 🙂
Hatte es mal so geändert, „if (tasterStatus): umschalten()“ läuft auch.
Hab dann mal die Zeiten geändert und debuggt, läuft auch.
Dann werde ich mal ans nächste wagen, digitale Sensoren und AD-Wandler.
Also Deine Seite ist für Einsteiger echt Klasse ! Super erklärt, weiter so !!!
hi Felix,
vielen Dank für deine ausführlichen skripts, aber wäre es nicht schön mit einem GPIO.cleanup() zu beenden?
VG Wolfgang
Naja GPIO.cleanup() setzt alle Pins auf Input – ob das gewollt ist, ist halt die Frage.
Wie lautet der Programmcode wenn ich mit dem drücken des Tasters eine Fußgängerampel anschalten möchte?
Dazu musst du zwei weitere GPIOs für die Fußgängerampel definieren (Rot & Grün, Definition äquivalent). Du bräuchtest dann noch zwei Übergangsphase, in der beide Ampeln rot sind (bevor Autoampel grün wird und bevor die Fußgängerampel grün wird).
Hallo,
ich habe mit der Schaltung ein Phänomen dass ich nicht nachvollziehen kann:
– in Grundstellung leuchtet Rot und Grün (etwas schwächer)
– nach betätigen des Tasters leuchten alle drei
– dann gehen alle aus (eigentlich die Grünphase)
– Dann Grün und orange
– dann wieder Rot und Grün (etwas schwächer)
Irgendwas scheint mit dem grünen LED oder Ausgang nicht zu stimmen.
Ich hab den Pi 3 und habe entsprechend die Pins belegt. Verdrahtung finde ich auch keinen Fehler.
Jemand ne Idee?
Hi, hab die Schaltung nachgebaut.
Läuft so wie beschrieben.
Aber wieso verbraucht das Scipt beim Ausführen kanppe 34% CPU Last?
Hey,
weil unten im Script eine Schleife läuft die einiges an CPU last braucht (viele Berechnungen).
Moin zusammen , ich habe das ähnlich Phänomen dass das Script in „Wartephase“ ca. 30% CPU-Load hat. ich denke es liegt an der „Endlosschleife“, gibt es hier „Optimierungspotential“ ?
Gruß
Jan
DU könntest add_event_detect probieren.
Hallo zusammen,
ich habe es genau so aufgebaut wie auf der Zeinchnung. Und das skript kopiert.
In der Zeichnung ist ein fehler drin.
Wenn LED + zum NPN soll, müssen die rote und schwarzen stecker im Breadboard getauscht werden, und dann auch beim Taster.
Stromrückfluss über Ground Pin 6, Strom + 3,3 volt Pin 1
Welches Programm wurde für die Zeichnung benutzt. Möchte später meine Erfahrungen auch gerne mitteilen.
Fritzing
Hallo Felix,
herzlichen Dank für deine tollen Tutorials. Für Anfänger wie mich ist das ein super Einstieg. Die Ampelschaltung hat auch auf Anhieb funktioniert. Allerdings hab ich bei der Schleife ein Verständnisproblem.
Hinter einer while Schleife erwarte ich eigentlich eine Bedingung. Im Skript steht nur
while True… aber was muss True sein damit Zeile 46-48 ausgeführt wird?
Ebenso in Zeile 52
if (tasterStatus):
Ist hier der default Wert „True“?
Also könnte dort auch stehen
if (tasterStatus) == True:
dann führe die umschalten Funktion aus?
Wäre dir sehr dankbar wenn du hier Aufklärung schaffst.
Freue schon darauf die weiteren Tutorials durchzuprobieren
while True ist eine Endlosschleife und wird erst durch Drücken von Strg+X unterbrochen 🙂
Wozu genau hast du jetzt nochmal die Transistoren da drin? Also ich habe die LED’s und den Schalter jetzt so wie in deiner Einführungsreihe zum Programmieren angeschlossen und die Ampelschaltung programmiert – klappt gut. Erst dann hab ich den Beitrag hier gesehen und wundere mich jetzt wofür die Transistoren gebraucht werden? In dem „Einführungskurs“ sind die LED ja auch nur mit Widerständen angeschlossen?
Wenn die LEDs mehr Strom bräuchten, kannst du sie nicht mehr direkt mit den GPIOs versorgen (das sollte man sowieso nicht). Mit den Transistoren kann man auch größere Ströme schalten, trotz niedriger Spannung.
Achso. Aber mit LED’s funktioniert es ja noch, da die nicht so viel Strom brauchen? Mit anderen Verbrauchern dann nicht mehr, das ist klar
Genau, ich wollte aber direkt von anfang an darauf hinweisen, nicht dass man sich später ggf. wundert 🙂
Moin, wollte Mal wissen ob man mit der gleichen Programmiersprache die für die Ampel genutzt wurde auch
CPLD Chips oder andere programmieren kann.
Gut Frage würde ich auch gerne wissen
Hallo,
das dürfte schwierig werden. Da Python den größten Teil der Prozessorleistung verbraucht, bleibt für die eigentliche Anwendung leider nicht mehr viel übrig!
Die CPU kocht und es kommen trotzdem maximal 70 Herz aus den GPIO´s raus.
Und bei vielen GPIO´s kann das Programm ganz einfrieren.
Lerne gleich eine Programmiersprache, die ein kompiliertes Programm ausgibt. Dann schaltest Du alle GPIO mit Megaherz Geschwindigkeit bei 2 – 5 % CPU – Auslastung und kannst staunen was aus dem Winzling alles raus zu holen ist. Du musst nur wissen, was Du an die CPLD Chips senden must.
C läuft direkt auf dem Raspi und es gibt viele Beispiele für fast alle Anwendungsgebiete.
Wenn Dir C zu schwierig ist, dann versuch es doch mal mit LAZARUS. Es basiert auf Pascal – ist also sehr leicht zu lernen, läuft gut auf dem Raspi, und erzeugt sehr effizienten Maschinencode.
Hey,
tolle Anleitung. Super beschrieben. Jedoch habe ich eine kleine Verständnisfrage. Warum werden die Transistoren eingesetzt? Welchen Vorteil hat dies gegenüber der Möglichkeit den Ausgangspin direkt mit der LED zu verbinden?
Hallo,
weil die GPIO´s nur Steuerausgänge sind und keine Leistungsstufen.
Es währe viel zu teuer CPU´s zu bauen an die man ordentliche Lasten anschließen könnte.
Deshalb muß derjenige, der Lasten treiben will selbst für eine Treiberstufe sorgen.
ich habe eine schaltung erstellt, die wenn ich den knopf drücke, die nächste schaltverbindung zeigt und bleibt, bis ich den knopf erneut drücke
Hallo,
vielen Dank für dieses Tutorial. Ich habe den Aufbau und das Script nach Vorbild aufgebaut und zum Laufen gebracht :). Hierducht wurde mein Eifer geweckt. Nun Versuche ich eine Fußgängerschaltung zu erweitern.
Aktuell sieht es bei mir so aus, dass die „normale“ Ampelschaltung in einer Endlosschleife Läuft. Wenn ich nun den Taster zum Richtigen Zeitpunkt betätige (ende der Schleife), Kommt meine Fusgängerschaltung zum Einsatz.
Da ich ein absoluter Anfänger auf diesem Gebiet bin, möchte ich Fragen ,ob es möglich ist den Tastendruck „zwischenzuspeichern“ bis das Ende der Standardschleife erreicht ist.
Hallo wir machen diese Schaltung als Schulprojekt. Aber es funktionirt nicht ganz der befahl von Taster wird nicht angenommen und die schaltun bigint sofort wenn man des Programm startet. Könnten hilfe gebrauchen.
Hallo,
auch ich finde das Tutorial sehr gut. Allerdings funktioniert mein Aufbau mit einem Raspi2 von der Logik her genau umgekehrt. Wenn ich einen GPIO auf True setze geht die entsprechende LED aus und umgekehrt. Kann das daran liegen, dass ich für den Testaufbau keine Transistoren verwendet habe?
Hallo Jörg,
Du liegst mit Deiner Vermutung richtig – liegt an den fehlenden Transistoren!
Bei „true“ wird der GPIO-Ausgang auf High-Potential gebracht (3,3V), bei „false“ auf Low (0V).
Ergebnis für beide Schaltungsvarianten …
Ohne Transistor:
true (High-Potential): die LED hängt zwischen 3,3V (Anode) und GPIO 3,3V (Kathode) – LED aus
false (Low-Potential): die LED hängt zwischen 3,3V (Anode) und GPIO 0V (Kathode) – LED an
Mit Transistor:
true (High-Potential): High-Potential an der Basis (mittlerer Anschluß) vom Transistor bedeutet, das dieser durch steuert (somit das Potential am linken Anschluß, dem Collector auf den vom rechten Anschluß, dem Emitter zieht )und somit das Potential an der Kathode der LED auf 0V gebracht wird -> LED an
false (Low-Potential): Transistor gesperrt, keine 0V an der Kathode der LED, LED aus
Ein Transistor in dieser Schaltung wirkt invertierend!
Um die LED ohne Transistor betreiben zu können (bei true -> LED an), müßtest Du die Schaltung wie folgt anpassen: LED Anode statt über den Widerstand an 3,3V an den GPIO-Pin und LED-Kathode statt an den GPIO-PIN an GND (0V)
Ansonsten verweise ich aber auf den Kommentar von Felix vom 03.04.2018, 18:29 – sicherer für den PI ist ein Einsatz eines Transistors als Treiber! Die GPIOs können laut Spezifikation maximal 30mA liefern, eine typische LED braucht ca. 20mA – willst Du zwei LEDs parallel betreiben, würdest Du den GPIO bereits überlasten!
Nicht ganz eindeutig geschrieben – sorry: Der Vorwiderstand an der LED muß trotzdem eingesetzt werden! Die Anode würde dann MIT WIDERSTAND an den GPIO-Pin angeschlossen werden!
Jetzt muß ich mich (nach Recherche) doch noch einmal selbst korrigieren!
Laut Spezifikation liefert die GPIO nur maximal 16mA – empfohlen wird 2-5mA maximal!
Eine LED, die laut Hersteller einen empfohlenen Arbeitspunkt von 2V/20mA hat, würde bei Betrieb in demselben den GPIO schon überlasten!
Felix hat hier durch die Wahl des Vorwiederstandes den Strom auf ca. 3mA begrenzt, die LED wird also deutlich unter ihrem Arbeitspunkt betrieben (ca. 1,8V/ca. 3mA), was sie nicht so hell leuchten lässt aber dafür den GPIO schützt!
Ein Transistor hat nicht nur invertierende Funktion (in dieser Beschaltung), sondern auch einen Verstärkungsfaktor – um 20mA zwischen Collector und Emitter fliessen zu lassen (bei einem Verstärkungsfaktor von z.B. 200 – zu finden im Datenblatt vom jeweiligen Transistor) wären also nur 0,1mA zur Ansteuerung nötig – der GPIO-Pin ist deutlich geringer belastet, selbst wenn man die LED im Arbeitspunkt betreiben würde, wozu man den Vorwiderstand dann reduzieren müßte.
Noch einmal zusammenfassend: lieber die LED NICHT direkt betreiben sondern über einen Transistor – dieser mit dem dazugehörigen Basisvorwiderstand macht einen finanziellen Aufwand von unter 10 Cent – gegenüber einem geschrotteten PI …
welche wiederstände sind zu nehmen?
habe beim PI4 keinen GPIO07
der PIN 26 ist ein SPICSC.
bitte um Hilfe.
Danke
Hat wunderbar funktioniert! Allerdings habe ich PNP Transistoren, BC557A, da musste ich die Schaltung etwas ändern und alle Zustände von TRUE auf FALSE ändern und umgekehrt. Das liegt aber nicht am Raspberry selber, sondern nur an den verwendeten Transistoren und deren Beschaltung.
Ich habe den Raspberry 3 und etwas andere GPIOs verwendet, funktioniert aber genauso. Die Pins für 3.3V, 5V und Masse (GND) sind dieselben wie beschrieben.
Was ich auch festgestellt habe, es ist egal ob ich „python ampel2.py“ mit oder ohne „sudo“ starte oder auch mit „python3“ .
Ich ging eigentlich davon aus daß jede Python Version ihre eigenen Repositories hat!?
Wäre es möglich ein Schaltbild zu erhalten? Warum braucht der Taster einen Widerstand?