Lektion 5 von 5Robotik mit fischertechnik
Robotik mit fischertechnik · Lektion 5 · 45 Minuten
Projekt: Die Ampelsteuerung
Das lernst du
- Eine Ampel als Folge von Zuständen programmieren
- Mit kleinen Hilfsfunktionen den Code lesbar halten
- Auf eine Fußgänger-Anforderung per Taster reagieren
Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 3.4, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗
Eine Ampel ist eine Zustandsmaschine
Eine Ampel ist zu jedem Zeitpunkt in genau einem Zustand: Rot, Rot-Gelb, Grün oder Gelb. Feste Regeln sagen, wann sie in den nächsten Zustand wechselt. Genau so baust du sie im Code.
Aufbau: drei Lampen (rot, gelb, grün) an O1 bis O3 und ein Taster an I1 für die Fußgänger.
Der vollständige Code
Das ist das Projekt aus dem Buch. Drück auf Ausführen und schau aufs Schaltpult. Halte während der Rotphase den Taster an I1 gedrückt – dann bleibt die Ampel danach nur 3 statt 6 Sekunden grün.
# ============================================================
# PROJEKT: Ampelsteuerung
# Durchlaeuft den klassischen deutschen Ampelzyklus und reagiert
# auf eine Fussgaenger-Anforderung per Taster.
# ============================================================
import ftrobopy
from time import sleep
txt = ftrobopy.ftrobopy("localhost", 65000)
rot = txt.output(1) # Lampe an O1
gelb = txt.output(2) # Lampe an O2
gruen = txt.output(3) # Lampe an O3
taster = txt.input(1) # Taster an I1
def alle_aus():
# Hilfsfunktion: schaltet alle drei Lampen aus (siehe Funktionen, Teil 1)
rot.setLevel(0)
gelb.setLevel(0)
gruen.setLevel(0)
def zeige_rot():
alle_aus()
rot.setLevel(512)
def zeige_rot_gelb():
alle_aus()
rot.setLevel(512)
gelb.setLevel(512)
def zeige_gruen():
alle_aus()
gruen.setLevel(512)
def zeige_gelb():
alle_aus()
gelb.setLevel(512)
print("Ampel gestartet.")
while True:
# Fussgaenger-Anforderung pruefen: bei ftrobopy bedeutet state() == 0,
# dass der Taster gedrueckt ist (Kontakt geschlossen) - nicht 1!
anforderung = taster.state() == 0
zeige_rot()
sleep(2)
zeige_rot_gelb()
sleep(1)
zeige_gruen()
if anforderung:
# Bei Anforderung bleibt die Ampel kuerzer gruen
sleep(3)
else:
sleep(6)
zeige_gelb()
sleep(1)Die vier kleinen Funktionen zeige_rot(), zeige_rot_gelb(), zeige_gruen() und zeige_gelb() machen den Hauptteil viel leichter lesbar. Jede Funktion erledigt genau eine Aufgabe – und jede ruft zuerst alle_aus() auf. So kann nie aus Versehen Rot und Grün gleichzeitig leuchten.
Nochmal: vertauschte Logik.
taster.state() == 0heißt „gedrückt“. Deshalb steht im Codeanforderung = taster.state() == 0. Der Taster wird einmal pro Ampel-Runde abgefragt – ganz am Anfang, während Rot noch kommt.
Weitere Projekte im Buch
Im Buch „Python für Roboter“ (Teil 3) folgen noch größere Projekte: ein Linienfolger mit zwei Sensoren, eine Sortiermaschine, eine Parkschranke und eine Förderband-Anlage mit zwei Bändern. Alles, was du dafür brauchst – Motoren, Lampen, Taster und Sensoren –, kennst du jetzt.
Deine Aufgabe
Jetzt bist du dran
Übung 3.4 aus dem Buch (vereinfacht): Schreib die Funktion nachtmodus(mal). Nachts blinkt eine Ampel nur gelb: Schalte zuerst alle Lampen aus. Dann geht Gelb mal-mal für eine Sekunde an und für eine Sekunde aus. Rot und Grün bleiben die ganze Zeit aus.
import ftrobopy
from time import sleep
txt = ftrobopy.ftrobopy("localhost", 65000)
rot = txt.output(1) # Lampe an O1
gelb = txt.output(2) # Lampe an O2
gruen = txt.output(3) # Lampe an O3
def alle_aus():
rot.setLevel(0)
gelb.setLevel(0)
gruen.setLevel(0)
def nachtmodus(mal):
pass
nachtmodus(3)- Denkanstoß
In einer
for-Schleife:gelb.setLevel(512),sleep(1),gelb.setLevel(0),sleep(1). - Welcher Befehl hilft?
Benutze den Parameter mal in
range(mal)– keine fest eingetippte Zahl.Ruf am Anfang von
nachtmodus()die Funktionalle_aus()auf. - Lückencode – ergänze die ___
import ftrobopy from time import sleep txt = ftrobopy.ftrobopy("localhost", 65000) rot = txt.output(1) # Lampe an O1 gelb = txt.output(2) # Lampe an O2 gruen = txt.output(3) # Lampe an O3 def alle_aus(): rot.setLevel(0) gelb.setLevel(0) gruen.setLevel(0) def nachtmodus(mal): alle_aus() for _ in ___: gelb.setLevel(___) sleep(___) gelb.setLevel(0) sleep(___) nachtmodus(3)
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:
import ftrobopy
from time import sleep
txt = ftrobopy.ftrobopy("localhost", 65000)
rot = txt.output(1) # Lampe an O1
gelb = txt.output(2) # Lampe an O2
gruen = txt.output(3) # Lampe an O3
def alle_aus():
rot.setLevel(0)
gelb.setLevel(0)
gruen.setLevel(0)
def nachtmodus(mal):
alle_aus()
for _ in range(mal):
gelb.setLevel(512)
sleep(1)
gelb.setLevel(0)
sleep(1)
nachtmodus(3)