2.4 Piskanje buzzera
Cilj ovog primjera je napraviti malo buke. Pasivni buzzer je maleni zvučnik: nahrani ga pravokutnim signalom i vibrirat će na onoj frekvenciji koju mu pošalješ, pa jedan buzzer može odsvirati bilo koju notu koju želiš.
U ovom primjeru NULA MINI odsvira kratku skalu od osam nota u trenutku kada pokreneš skriptu.
U ovoj dokumentaciji naučit ćeš:
- Kako spojiti pasivni buzzer na pločicu.
- Kako
PWMpretvara frekvenciju u zvuk. - Što
duty_u16()kontrolira i zašto je 32768 broj koji treba koristiti. - Kako držati melodiju u listi i prolaziti kroz nju petljom.
Potreban hardver:
- 1x Soldered NULA MINI pločica
- 1x Breadboard
- 1x Pasivni buzzer
- 3x Jumper žice
- 1x USB-C kabel
IO5 i mase. Nema ga od čega štititi, jer se pin uvijek kreće samo između 0 V i 3.3 V.Spajanje komponenti
Prati pet koraka ispod. Svaka fotografija snimljena je s istog položaja, pa je možeš usporediti s prethodnom i vidjeti točno što se promijenilo.
1. Umetni NULA MINI pločicu na breadboard
Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova sjednu s obje strane središnjeg kanala, s čipom okrenutim prema dolje.

2. Postavi buzzer i izvedi masu na vodilicu
Buzzer ide na f–j stranu, dobro odmaknut od pločice, s dvije nožice u redu 14 i redu 15.
Pogledaj vrh kućišta buzzera prije nego ga utisneš. Uz oznaku HWDZ nalazi se mali + unutar kružića, i nožica na toj strani kućišta je pozitivna. Ta nožica ide u red 15.
Zatim povuci jumper žicu iz j30 (GND) do plave − vodilice. Ta vodilica je linija mase za ostatak primjera.

3. Spoji pozitivnu nožicu na IO5
Jedna jumper žica iz j15 (red u kojem je + nožica buzzera) dolje u j28 (IO5). To je žica koja će nositi pravokutni signal.

4. Spoji drugu nožicu na masu
Još jedna jumper žica, iz j14 (druga nožica buzzera) do plave − vodilice, koja je već vezana na GND.

Krug je sada zatvoren: IO5 → buzzer → GND. Što god IO5 radi, buzzer osjeti.
5. Spoji pločicu na računalo

IO5 doseže red s +, a drugi red doseže masu.Kako pasivni buzzer proizvodi notu
Zvuk nije ništa više od zraka koji se potiskuje naprijed i natrag. Unutar buzzera je tanka membrana koja se pomiče kad god se napon na njoj promijeni, a pomicanje dovoljno brzo daje notu koju možeš čuti.
To je ono što PWM radi. PWM je skraćeno od Pulse Width Modulation: uključuje i isključuje pin vrlo brzo, i dopušta nam da odaberemo i koliko brzo prebacuje i koji dio vremena ostaje uključen. Broj prebacivanja u sekundi je frekvencija, mjerena u hercima, a tvoje uho tu frekvenciju čita kao visinu tona:
| Nota | Frekvencija (Hz) |
|---|---|
| C4 | 262 |
| D4 | 294 |
| E4 | 330 |
| F4 | 349 |
| G4 | 392 |
| A4 | 440 |
| B4 | 494 |
| C5 | 523 |
MicroPython nema funkciju tone(). Umjesto toga stvaraš PWM objekt na pinu i onda ga pobuđuješ pomoću dva poziva:
buzzer = PWM(Pin(BUZZER_PIN))
buzzer.freq(262) # odaberi visinu tona
buzzer.duty_u16(32768) # pokreni zvuk
buzzer.duty_u16(0) # zaustavi zvuk
freq() postavlja visinu tona. duty_u16() postavlja koji dio vremena pin ostaje uključen, kao broj od 0 (uvijek isključen) do 65535 (uvijek uključen). Polovica toga, 32768, je ravnomjerno prebacivanje uključeno-isključeno, što buzzeru daje njegov najčišći ton. Pisanje 0 ostavlja pin trajno isključen, a to je tišina.
PWM objekta već zauzima pin, pa mu za razliku od običnog Pin ne postavljaš smjer. U ovom primjeru nema Pin.OUT uopće.Kako je melodija pohranjena
Melodija je u stvari par lista koje putuju zajedno: koja nota i koliko traje. Skripta ih drži u dvije liste iste dužine:
melodydrži frekvenciju svake note u hercima.note_durationdrži dužinu svake note, zapisanu kako je zapisuju note:4za četvrtinku,2za polovinku.
Petlja for zatim prolazi kroz obje liste jednu poziciju za drugom, svira notu i počeka njezino trajanje.
for i in range(len(melody)):
len(melody) je broj nota u listi, a range() broji od 0 do neposredno ispod tog broja. Tako i uzima vrijednost svake pozicije redom, a mi je koristimo da iz obje liste pročitamo odgovarajući zapis. Napisana ovako, petlja ostaje ispravna i nakon što dodaš svoju notu. Nema ekvivalenta Arduino računanju s sizeof() koje treba držati u koraku.Kada petlja završi, otpuštamo pin:
buzzer.deinit()
deinit() vraća pin i ostavlja buzzer tihim zauvijek. Bez toga PWM hardver ostaje zauzet i nakon što program završi, što može ostaviti buzzer da zuji nakon što se skripta zaustavila.Kod
# PWM je skraćeno od Pulse Width Modulation. Uključuje i isključuje pin vrlo brzo, a mi možemo odabrati i koliko brzo
# prebacuje i koji dio vremena ostaje uključen. Dovođenje tog brzog prebacivanja u buzzer je ono što ga tjera da
# proizvede zvuk, a brzina prebacivanja je ono što čujemo kao visinu tona.
from machine import Pin, PWM
import time
# Ovo je varijabla kojoj dodjeljujemo broj pina na koji smo spojili buzzer.
# NULA pločica ima logiku imenovanja pinova ovako: IO5, gdje je 5 broj koji dajemo varijabli.
BUZZER_PIN = 5
# Koristit ćemo dvije liste - jednu za frekvencije nota (u hercima) i jednu za trajanja nota.
# Frekvencija je koliko se puta u sekundi buzzer pomakne naprijed i natrag, a naše uho to čuje kao visinu
# note: što je broj veći, to je nota viša.
melody = [262, 294, 330, 349, 392, 440, 494, 523] # C4 do C5
note_duration = [4, 4, 4, 4, 4, 4, 4, 2] # Četvrtinke (posljednja je polovinka)
# Ovdje stvaramo naš PWM objekt, koji smo nazvali "buzzer". Njegovo stvaranje već zauzima pin, pa mu za razliku
# od običnog Pin ne postavljamo smjer.
buzzer = PWM(Pin(BUZZER_PIN))
# duty_u16() postavlja koji dio vremena pin ostaje uključen, kao broj od 0 (uvijek isključen) do 65535 (uvijek uključen).
# Polovica toga, 32768, je ravnomjerno prebacivanje uključeno-isključeno koje buzzeru daje njegov najčišći ton.
SOUND_ON = 32768
SOUND_OFF = 0
# Počni s tihim buzzerom, da se ne oglasi prije nego melodija počne.
buzzer.duty_u16(SOUND_OFF)
print("Playing melody...")
# Petlja for ponavlja blok koda jednom za svaki element koji joj je dan. range(len(melody)) broji od 0 do
# broja nota u našoj listi, pa "i" na kraju bude pozicija svake note redom.
for i in range(len(melody)):
# Dužine glazbenih nota zapisuju se kao razlomci: četvrtinka je četvrtina cijele note. Ovdje taj razlomak
# pretvaramo u milisekunde dijeljenjem jedne sekunde s brojem iz liste, pa 4 postaje 250 ms a 2
# postaje 500 ms.
duration = int(1000 / note_duration[i])
# freq() postavlja koliko brzo pin prebacuje, što je visina note, a duty_u16() zatim pokreće zvuk.
buzzer.freq(melody[i])
buzzer.duty_u16(SOUND_ON)
# Odsviraj notu u punoj dužini.
time.sleep_ms(duration)
# Sada zaustavljamo zvuk i čekamo malo dulje prije sljedeće note. Ta dodatna tišina sprječava note da
# se stope jedna u drugu. Slobodno eksperimentiraj s onih 0.3.
buzzer.duty_u16(SOUND_OFF)
time.sleep_ms(int(duration * 0.3))
# deinit() otpušta pin kada smo s njim gotovi, ostavljajući buzzer tihim zauvijek.
buzzer.deinit()
print("Melody finished!")
Što bi trebao vidjeti
Pritisni Run i buzzer odsvira uzlaznu skalu od osam nota, ukupno nešto manje od tri sekunde. Onda utihne.
0.3, skala ide brže a da se ijednoj noti ne promijeni visina.U ovoj skripti nema beskonačne petlje, pa se melodija svira jednom i program završava. Da je čuješ ponovno, ponovno pritisni Run.
Shell prikazuje isto u tekstu:
Playing melody...
Melody finished!
IO5 sleti u isti red kao jedna od njih.Probaj sam: promijeni jedan od brojeva u melody i pokreni ponovno. Budući da petlja broji pomoću len(melody), možeš i dodati note u obje liste i ona će ih pokupiti bez ikakve druge promjene.
Cijeli primjer
Pogledaj cijeli kod primjera na linku ispod:
2.4_Buzzer_Beep.py
Primjer koji pokazuje kako pomoću PWM-a odsvirati jednostavnu melodiju na pasivnom buzzeru spojenom na IO5.