Weekly Challenge – Woche 2

Programmierung, Medienkompetenz & KI Foren Weekly Challenge Weekly Challenge – Woche 2

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Autor
    Beiträge
  • #8194
    Fabian
    Administrator

    Wir möchten den Aufbau mit dem Raspberry Pi Pico von der Weekly Challenge von Woche 1 erweitern und ein Reaktionsspiel für zwei Spieler bauen. So könnt ihr gegen eure Eltern, Geschwister und Freunde antreten und beweisen wer die schnellsten Nerven hat.

    Wir benötigen nun zwei Knöpfe. Auf der Kommandozeile soll nun angezeigt werden, wer der beiden Spieler sein Knopf nach dem Ausgehen der LED am schnellsten gedrückt hat.

    Du brauchst:

    PC oder MAC mit Thonny Programmierumgebung
    Aus unserer Maker-Box: Pi-Pico auf Breadboard und USB Kabel
    LED, 330 Ohm Widerstand, ein oder zwei Taster und Jumper Kabel

    #8208
    Fabian
    Administrator

    Tipp 1

    Erst bauen wir die Schaltung. Wir brauchen wieder eine LED mit einem Vorwiderstand in Serie (hintereinander). Zum Beispiel zwischen GP 15 (Pin 20) und Minuspol (Pin 38). Achtet wieder darauf, dass die Anode der LED (das lange Bein) am GP 15 verbunden ist.

    Die zwei Taster, einen für jeden Spieler, bauen wir zwischen jeweils GP 16 (Pin 21) und GP 17 (Pin 22) und dem Pluspol (Pin 36).

    Hier das Schaltbild des Pi Picos zur Hilfe.

    #8210
    Fabian
    Administrator

    Tipp 2

    Welche Änderungen müsst ihr in eurem Programm von Woche 1 hinzufügen? Hier ein paar Stichpunkte:

    • Ihr müsst ein zweiten Pin als Eingangs-Pin definieren: knopfA = machine.Pin(16, machine.PIN.IN,...)
    • Die Handler-Funktion def button_handler(pin) bleibt, muss aber abgeändert werden. Ihr braucht aber keine zweite Funktion. Diese Handler-Funktion wird sowohl beim Drücken vom Knopf an Pin 16 wie beim Drücken vom Knopf an Pin 17 aufgerufen. In der Variable pin ist der Knopf gespeichert der gedrückt wurde: knopfA oder knopfB.
    • Ihr braucht zwei Triggers im Hauptprogramm: knopfA.irq(trigger=machine...) und knopfB.irq(trigger=machine...)
    • Danach braucht ihr eine Schleife, die fortlaufend überprüft ob eines der Knöpfe gedrückt wurde und welches es war. Dann soll eine Nachricht in der Kommandozeile erscheinen.
    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Fabian.
    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Fabian.
    #8211
    Fabian
    Administrator

    Tipp 3

    Hier ist der Anfang vom Programm mit der Handler-Funktion:

    import machine
    import utime
    import urandom
    
    led = machine.Pin(15, machine.Pin.OUT)
    
    knopfA = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
    knopfB = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)
    
    pressed = False
    ersterGedrueckt = None
    
    def button_handler(pin):
        global pressed
        if not pressed:
            pressed=True
            global ersterGedrueckt
            ersterGedrueckt = pin
    
    while True:
    ....
    

    Wie geht’s weiter?

    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Fabian.
    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Fabian.
    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Fabian.
    #8228
    Fabian
    Administrator

    Auflösung

    Und hier ist der gesamte Code für das Reaktionsspiel für zwei Spieler:

    import machine
    import utime
    import urandom
    
    led = machine.Pin(15, machine.Pin.OUT)
    
    knopfA = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
    knopfB = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_DOWN)
    
    pressed = False
    ersterGedrueckt = None
    
    def button_handler(pin):
        global pressed
        if not pressed:
            pressed=True
            global ersterGedrueckt
            ersterGedrueckt = pin
    
    while True:
        print("Los...")
        led.value(1)
        utime.sleep(urandom.uniform(5, 10))
        led.value(0)
    
        knopfA.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)
        knopfB.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)
    
        # Warten bis erster gedrückt
        while ersterGedrueckt is None:
            utime.sleep(1)
        
        print("Gedrückt")
        
        # Wer war der erste?
        if ersterGedrueckt is knopfA:
            print("Spieler A gewinnt!")
            
        elif ersterGedrueckt is knopfB:
            print("Spieler B gewinnt!")
    
        # Spiel für nächste Runde vorbereiten
        fastest_button = None
        pressed = False
    

    Ihr könnt natürlich das Spiel für weitere Spieler erweitern. Ihr braucht einfach ein paar mehr Knöpfe, ein paar mehr Pin Definitionen und ein paar mehr Triggers.

    Viel Spaß!

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.