Der Buzzer


auf dem 1.69-Zoll-IPS-LCD-Display
240 x 280 Pixel - RP2350


Anleitung getestet mit CircuitPython 10.0.0




Bildbox 1 (klick hier)




Hardware

- 1,69-Zoll-IPS-LCD-Touch-Display WS-30126 (RP 2350)
- USB-A zu USB-C Kabel

Firmware

- CircuitPython 10.0.0

Auf der Platine befindet sich ein kleiner Buzzer, von dem man natürlich nicht zu viel erwarten sollte. Bei richtiger Ansteuerung lassen sich aber doch beachtliche Tonfolgen erzeugen.

Man muss zunächst wissen, das Microcontroller keine analogen Tonsignale erzeugen und ausgeben können. Die digitalen Ausgangsports nehmen ja immer nur den Zustand LOW oder HIGH an. Schaltet man aber schnell zwischen diesen Zuständen hin und her, so wird z.B. ein Lautsprecher (oft ein Piezo-Buzzer) zum Schwingen gebracht. Dabei bestimmt die Frequenz dieser Schwingung die Tonhöhe. Das Verhältnis zwischen Impuls und Periodendauer (Summe von Impuls- und Pausendauer) wird als Duty Cycle bezeichnet. In CircuitPython wird dafür die in der Firmware enthaltene Bibliothek pwmio genutzt.

Für einen ersten Test braucht man jetzt nur noch zu wissen, dass der Buzzer am GPIO-Pin 2 angeschlossen ist. Der Quellcode im unteren Kasten erzeugt fünf Töne mit je einer kurzen Pause (Zeilen 13 u. 15). In Zeile 6 wird die Variable speaker definiert. Nach den fünf Tönen in der 'while-Schleife' wird der Lautsprecher mit speaker.deinit() deinitialisiert.

  
  
1  import time
2  import board
3  import pwmio
4
5  # GP2: Boardeigener Speaker, duty_cycle: zwischen 0 und 65535, frequency zwischen 1 Hz und 48 MHz
6  speaker = pwmio.PWMOut(board.GP2, frequency=1000, variable_frequency=True)
7
8  i = 0
9
10 while True:
11     for cycle in range(0, 65535, +2):  # Cycles through the full PWM range from 0 to 65535
12         speaker.duty_cycle = 32768
13     time.sleep(0.2)
14     speaker.duty_cycle = 0
15     time.sleep(0.2)
16     i += 1
17     if i == 5:
18         speaker.deinit()
19         break
  

Wenn Ihnen das gefällt, können Sie gleich noch ein wenig damit experimentieren (spielen). Ich habe im nächsten Kasten einige Frequenzen in einer Liste abgelegt, um sie mit veränderter Abtastrate, variierter Länge und Pause in der 'while-Schleife' aufzurufen. Wieder nur fünf Töne. Probieren Sie es aus:
  
  
1  import time
2  import board
3  import pwmio
4
5  # Define a list of tones/music notes to play.
6  TONE_FREQ = [ 262,  # C4 1
7                294,  # D4 2
8                330,  # E4 3
9                349,  # F4 4
10               392,  # G4 5
11               440,  # A4 6
12               494,  # B4 7
13               585,  # D2 8
14               660]  # E5 9
15
16 Cycle = [2, 1, 2, 1, 2]
17 Note = [ 8, 7, 8, 7, 4]
18 Lenght = [ 0.1, 0.2, 0.05, 0.15, 0.8]
19 Mute = [0.05, 0, 0, 0.02, 0.02]
20
21 # GP2: Boardeigener Speaker, duty_cycle: zwischen 0 und 65535, frequency zwischen 1 Hz und 48 MHz
22 buzzer = pwmio.PWMOut(board.GP2, frequency=1000, variable_frequency=True)
23
24 buzzer.frequency = TONE_FREQ[0]
25 buzzer.duty_cycle = 2000
26
27 # Main loop will go through each tone in order up and down.
28 while True:
29     for i in range(5):
30         buzzer.duty_cycle = Cycle[i] * 1000
31         buzzer.frequency = TONE_FREQ[Note[i]]
32         time.sleep(Lenght[i])
33         buzzer.duty_cycle = 0
34         time.sleep(Mute[i])
  



Na, erinnert Sie das an den lezten Italienurlaub?

Viel Spass und Erfolg beim Ausprobieren.