Zum Inhalt springen
BetaEN
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() == 0 heißt „gedrückt“. Deshalb steht im Code anforderung = 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)

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

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)