Krach machen

Damit deine Alarmanlage Alarm schlagen kann, brauchst du einen Tonerzeuger. Für den Anfang reicht dazu ein Piezo-Schallgeber (oder einfach Summer). Es gibt sie in vielen größen und Formen. Meistens sind es kleine runde schwarze Teile mit zwei Beinchen oder zwei Kabeln. Welche du verwendest, ist im Prinzip egal.

Baue die folgende Schaltung auf und stecke den Piezo-Summer an eine freie Stelle des Steckbretts falls dein Piezo Beinchen statt Kabel hat. Verbinde in diesem Fall den analogen Ausgang A3 mit dem Pluspol des Summers und stecke das andere Beinchen an eine beliebige Stelle in die blaue Minusleitung.

Schaltung mit Summer

Erstelle eine neue Datei, die du summer.py nennst und kopiere den Code dort hinein.

import time
import board
import pulseio

# PWM-Objekt für Piezo-Summer anlegen
piezo = pulseio.PWMOut(board.A3, duty_cycle=0, frequency=440, variable_frequency=True)

# Funktion für die Ausgabe eines Tones
def tone(frequency, duration=1, pause=0.05):
    piezo.frequency = frequency
    piezo.duty_cycle = 0x8000
    time.sleep(duration)
    piezo.duty_cycle = 0
    time.sleep(pause)

while True:
    for f in [262, 294, 330, 349, 392, 440, 494, 523]:
        tone(f, 0.25)
    time.sleep(0.5)

Vieles dürfte dir mittlerweile bekannt vorkommen. Manches ist aber neu.

PWM-Objekt

Im Kommentar vor Zeile 6 steht etwas von PWM-Objekt anlegen. Gemeint ist damit - du bist sicher schon von alleine drauf gekommen - das Objekt um den Piezo-Summer zu bedienen. PWM steht für den englischen Ausdruck Pulse Width Modulation, zu deutsch Pulsweitenmodulation. Was dieses lange Wort genau bedeutet, kannst du gerne auf Wikipedia nachlesen.

Zwei Dinge muss man über Töne wissen. Erstens: Die Frequenz gibt die Tonhöhe an. Zweitens: Die Amplitude gibt die Lautstärke an. Die Frequenz kann man mit PWM einstellen - die Amplitude nur so halb. Es ist nicht ganz so einfach mit PWM.

Funktionen

Wenn du den Programmcode genauer betrachtet hast, hast du bestimmt die beiden neuen Python-Schlüsselwörter entdeckt. def und for … in sind neu. Was es mit def auf sich hat, erfährst du hier.

Wenn du das Programm von deinem Board ausführen lässt, hörst du eine Tonfolge.

Jeder dieser Töne wird nacheinander erzeugt. Will man den Summer einschalten, muss man die Pulsdauer (englisch Pulse Width) auf einen bestimmten Wert ( 32768 ) einstellen. Information für Interessierte:

$$32768_{10} = 8000_{16}$$

In diesem Moment piept der Summer los. Dann wartet man, so lange, wie die Note gespielt werden soll und stellt die Pulsdauer wieder auf 0 um den Summer auszuschalten.

Zwischen zwei Tönen möchte man außerdem eine kurze Pause (0,05 Sekunden).

Pro Note sind das 5 Befehle!

Die Endlosschleife im Code rechts tut das Gleiche, wie die im vorherigen Quellcode und kommt sogar ohne die beiden Schlüsselwörter def und for … in aus.

Wozu braucht man also überhaupt Funktionen, könnte man fragen?

Beim Betrachten wird dir hoffentlich klar, welchen Nachteile diese Art zu Programmieren (ohne Funktionen) hat: Der Quelltext wird sehr lang und unhandlich. 8 Töne macht 40 Zeilen Code (ohne die Lehrzeilen zur Strukturierung). Für "Alle meine Entchen" bräuchte man schon 135 Zeilen (27 Noten).

Funktionen haben also den Vorteil, Codestücke wiederverwendbar zu machen.

while True:
    piezo.frequency = 262
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 294
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 330
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 349
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 392
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 440
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 494
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    piezo.frequency = 523
    piezo.duty_cycle = 0x8000
    time.sleep(0.25)
    piezo.duty_cycle = 0
    time.sleep(0.05)

    time.sleep(0.5)

Listen in Python

Die for…in - Schleife

Kommentieren Kommentare