Ampelprojekt – Phase 3: Programmierung

Dem Aufbau des Modells folgt die abstrakte Modellierung, die Beschreibung der Ampel mit Methoden der Informatik. Das ist die Voraussetzung für die Implementierung als Programm.

Einfache Ausgaben – Testprogramm A

Zunächst soll der Aufbau getestet werden. Gelingt es eine LED an- und auszuschalten?

import RPi.GPIO as GPIO, time

print("""
==========================
==    TEST 1 LED        ==
==========================""")

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)    #aa gr
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)   #aa g
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)   #aa r

GPIO.setup(3, GPIO.OUT, initial=GPIO.LOW)    #fa r
GPIO.setup(5, GPIO.OUT, initial=GPIO.LOW)    #fa gr

GPIO.output(8, GPIO.HIGH)
time.sleep(0.5)
GPIO.output(8, GPIO.LOW)
time.sleep(0.5)

print("done.")

Testprogramm B

Gelingt es alle LEDs an- und auszuschalten?

import RPi.GPIO as GPIO, time

def onoff(pin, t):  # (***)
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(t)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(t)

print("""
==========================
==    TEST alle LEDs    ==
==========================""")

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)    #aa gr
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)   #aa g
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)   #aa r

GPIO.setup(3, GPIO.OUT, initial=GPIO.LOW)    #fa r
GPIO.setup(5, GPIO.OUT, initial=GPIO.LOW)    #fa gr

liste = [8,10,12,3,5] # (*)

for led in liste:     # (**)
    onoff(led, 0.5)

print("done.")

Das Programm B unterscheidet sich in drei Punkten von Programm A: Eine Liste enthält alle Pins (*) und wird in einer Schleife abgearbeitet (**). In der Schleife wird eine Funktion aufgerufen, die auf einen Pin Strom gibt und ihn wieder abschaltet (***).

Video 5: Testprogramm B, Ampel 01

Abfrage von Eingaben an Tastern

Das Ampelsystem ändert seinen Zustand nach dem Drücken des Knopfes an einer der beiden Ampeln. Diese Zustandsänderung soll immer verfügbar sein, d.h. sie soll immer wieder ausgelöst werden können.

Abbildung 7: Zustandsdiagramm – Zustandsübergang ausgelöst durch Drücken der Taste an der Ampel.

Um den Zustandsübergang von Zustand 1 zu Zustand 2 auszulösen, braucht das Ampelsystem eine Eingabemöglichkeit ähnlich der echten Ampel: Wenn ein bestimmter Knopf gedrückt wird, schaltet die Ampel um. Der Übergang von Zustand 2 zu Zustand 1 erfolgt dagegen zeitgesteuert: Wenn die Fußgänger genug Zeit hatten, um die Ampel zu überqueren, wird das Signallicht zurückgestellt.

Programm 02 führt dazu drei Änderungen ein. Zentral ist die Endlosschleife (*) mit der Abfrage (**) der Pins 16 bzw. 18. Als Grundlage dafür werden die beiden Pins 16 und 18 als Eingaben konfiguriert (***).

import RPi.GPIO as GPIO, time

#===============================#
# FUNCTION                      #

def onoff(pin, t):
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(t)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(t)

#===============================#
# CONFIG / SETUP                #

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

lights = [8,    # autoampel gruen
          10,   # aa gelb
          12,   # aa rot
          3,    # fussgaengerampel rot   
          5     # fa gruen
          ]

for led in lights:
    GPIO.setup(led, GPIO.OUT, initial=GPIO.LOW)

GPIO.setup(16, GPIO.IN) # input 1     (***)
GPIO.setup(18, GPIO.IN) # input 2

#===============================#    
# HAUPTPRG                      #

print("""prg: ampel 02
==========================
==    TEST              ==
==========================""")

while True:                              # (*)
    if GPIO.input(16) or GPIO.input(18): # (**)
        for led in lights:
            onoff(led, 0.5)

Die Endlosschleife bewirkt, dass die nachfolgende Abfrage immer wieder geprüft wird. Im Effekt werden jedes Mal nach dem Drücken des ersten oder des zweiten Tasters alles LEDs einmal durchgeschaltet. Im Vergleich mit der fertigen Ampel fehlt jetzt noch die Logik der Signale.

Video 6: Programm Ampel 02

Bedingte Signalschaltung

Programm 03 bringt die Endlosschleife, die Abfrage der Pins und die bedingte Ausführung der Funktionen fussgaenger() bzw. autofahrer() in eine logische Folge. Dabei stellt die Funktion fussgaenger() Zustand 2 her (*), die Funktion autofahrer() stellt danach zeitbedingt Zustand 1 her (**).

Video 6: Programm Ampel 03
import RPi.GPIO as GPIO, time

#==============================================#
# CONFIG / SETUP                               #

# globale Variablen: verfuegbare Pins
aa_gruen =  8 # Output: LEDs
aa_gelb  = 10
aa_rot   = 12
fa_rot   =  3
fa_gruen =  5

in_1     = 16 # Input: Taster
in_2     = 18

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(aa_gruen, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(aa_gelb,  GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(aa_rot,   GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(fa_rot,   GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(fa_gruen, GPIO.OUT, initial=GPIO.LOW)

GPIO.setup(in_1, GPIO.IN) # input 1
GPIO.setup(in_2, GPIO.IN) # input 2

#==============================================#
# FUNKTIONEN                                   #

def fussgaenger():
    # fussgaenger rot und autofahrer gruen
    GPIO.output(fa_rot, GPIO.HIGH)
    GPIO.output(aa_gruen, GPIO.HIGH)
    time.sleep(3)
    # autofahrer gelb
    GPIO.output(aa_gruen, GPIO.LOW)
    GPIO.output(aa_gelb, GPIO.HIGH)
    time.sleep(3)
    # autofahrer rot
    GPIO.output(aa_gelb, GPIO.LOW)
    GPIO.output(aa_rot, GPIO.HIGH)
    time.sleep(3)        
    # fussgaenger gruen
    GPIO.output(fa_rot, GPIO.LOW)
    GPIO.output(fa_gruen, GPIO.HIGH)    

def autofahrer():
    # fussgaenger rot
    GPIO.output(fa_gruen, GPIO.LOW)
    GPIO.output(fa_rot, GPIO.HIGH)
    time.sleep(3)        
    # autofahrer rot und gelb
    GPIO.output(aa_gelb, GPIO.HIGH)
    time.sleep(3)
    # autofahrer gruen
    GPIO.output(aa_gelb, GPIO.LOW)
    GPIO.output(aa_rot, GPIO.LOW)
    GPIO.output(aa_gruen, GPIO.HIGH)

def aus():
    GPIO.output(fa_rot, GPIO.LOW)
    GPIO.output(aa_gruen, GPIO.LOW)

#==============================================#  
# HAUPTPRG                                     #

print("""
================================================
==   PROGRAMM AMPEL 03                        ==
================================================
""")

while True:
    
    aus()
    
    if GPIO.input(in_1) or GPIO.input(in_2):
        # autoampel auf rot; fussgaenger gruen
        fussgaenger()     # (*)
        # zwischenzeit
        time.sleep(10)
        # autoampel auf gruen; fussgaenger rot
        autofahrer()      # (**)
        time.sleep(10)
            

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.