In diesem Beitrag erfährst du, wie man einen passiven Piezo Buzzer am ESP32 mit MicroPython programmiert.
Einen Piezo Buzzer steuerst du mit einem PWM Signal. Und wie du ein PWM Signal am ESP32 erzeugst hast du bestimmt schon im letzten Beitrag Programmieren mit MicroPython #2: steuern von Leuchtdioden (LED) gelesen.
benötigte Bauteile
Für den Nachbau benötigst du:
- einen ESP32*,
- einen passiven Piezo Buzzer*,
- zwei Breadboardkabel, 10cm, Stecker – Stecker*,
- ein 400 Pin Breadboard*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau der Schaltung
Die Schaltung ist relativ einfach, denn der passive Piezo Buzzer wird lediglich mit einem GPIO Pin sowie dem Pin “G” (steht für GND, Minuspol) verbunden.
An meinem ESP32 vom Typ LOLIN32 habe ich den passiven Piezo Buzzer an GND (schwarzes Kabel) sowie dem GPIO Pin 4 (gelbes Kabel) angeschlossen.
Programmieren
Das nachfolgende Beispiel habe ich von der Seite Micropython on ESP8266 Workshop übernommen.
Der passive Piezo Buzzer wird über ein PWM Signal gesteuert. Zuerst müssen wir uns also die benötigten Module importieren.
Es wird das Pin sowie PWM aus der Bibliothek “machine” importiert.
from machine import Pin, PWM
Des Weiteren benötigen wir für die Pausen zwischen den einzelnen Tönen die Funktion “sleep” diese finden wir im Modul “time” welches wir ebenso importieren.
from time import sleep
Definieren wir nun zunächst unseren Buzzer Pin
buzzer = PWM(Pin(4, Pin.OUT), freq=440, duty=512)
Für das Abspielen der Tonleiter definieren wir ein Dictionary mit den Keys der Buchstaben der Töne und den Values der jeweiligen Frequenz.
tones = { 'c': 262, 'd': 294, 'e': 330, 'f': 349, 'g': 392, 'a': 440, 'b': 494, 'C': 523, ' ': 0, }
Die maximale Frequenz eines PWM Signales liegt bei 1000 Hz.
Nun definieren wir die Tonfolge / Melodie und den Takt, welcher auf dem Buzzer abgespielt werden soll.
melody = 'cdefgabC' rhythm = [8, 8, 8, 8, 8, 8, 8, 8]
Zunächst definieren wir unser Tempo fest.
tempo = 5
Um jetzt die Tonfolge abzuspielen, durchlaufen wir die Zeichenfolge “melody” und des Rhythmus (“Rhythm”).
Mit der Funktion “freq” geben wir eine bestimmte Frequenz auf dem Buzzer wieder und mit der darauffolgenden Funktion “sleep” pausieren wir, somit haben wir den Ton in einer bestimmten Länge abgespielt.
Dieses machen wir für jeden Ton in der Zeichenkette “melody”.
for tone, length in zip(melody, rhythm): buzzer.freq(tones[tone]) sleep(tempo/length) beeper.deinit()
Hier nun das gesamte Programm:
from machine import Pin, PWM from time import sleep buzzer = PWM(Pin(4, Pin.OUT), freq=440, duty=512) tones = { 'c': 262, 'd': 294, 'e': 330, 'f': 349, 'g': 392, 'a': 440, 'b': 494, 'C': 523, ' ': 0, } melody = 'cdefgabC' rhythm = [8, 8, 8, 8, 8, 8, 8, 8] tempo = 5 for tone, length in zip(melody, rhythm): buzzer.freq(tones[tone]) sleep(tempo/length) beeper.deinit()