Skip to main content

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 se upali.

U ovoj dokumentaciji naučit ćeš:

  • Kako spojiti pasivni buzzer na pločicu.
  • Kako tone() pretvara frekvenciju u zvuk.
  • Kako noTone() ponovno utišava buzzer.
  • Kako držati melodiju u polju 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
ℹ️
Za razliku od primjera s LED-icom, ovome ne treba otpornik. Buzzer sjedi direktno između IO5 i mase. Nema ga od čega štititi, jer se pin uvijek kreće samo između 0 V i 3.3 V.
⚠️
Pobrini se da u ruci držiš pasivni buzzer, a ne aktivni. Pasivni buzzer proizvodi onu frekvenciju koju mu pošalješ, a upravo se na to ovaj primjer oslanja. Aktivni buzzer sadrži vlastiti oscilator i može piskati samo na jednoj fiksnoj visini, pa bi melodija izašla kao jedan ravan ton.

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.

ℹ️
Ovaj primjer doseže samo dva pina na pločici: IO5 u redu 28 i GND u redu 30, oba na f–j strani. Tijelo pločice prekriva stupce f–i, pa su j28 i j30 rupice u koje stvarno možeš uvesti žicu.

1. Umetni NULA MINI pločicu na breadboard

ℹ️
Ovaj korak pretpostavlja da znaš kako je breadboard spojen iznutra i što su njegove naponske vodilice (power rails). Za uvod pogledaj stranicu dokumentacije Osnove breadboarda.

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.

NULA MINI pločica postavljena na breadboard
Korak 1: pločica postavljena na breadboard

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.

Pasivni buzzer u redovima 14 i 15, s jumper žicom iz j30 na negativnu vodilicu
Korak 2: buzzer premošćuje redove 14 i 15, i GND spojen na plavu − vodilicu
⚠️
Dvije nožice sjede u susjednim redovima, pa odvoji trenutak da provjeriš da su stvarno sletjele u dva različita reda. Ako obje nožice završe u istom redu, buzzer je kratko spojen i ostaje tih bez obzira što kod radi.

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.

Jumper žica iz j15 u j28, spaja pozitivnu nožicu buzzera na IO5
Korak 3: + nožica buzzera spojena na IO5 u redu 28

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.

Jumper žica iz j14 na negativnu vodilicu, zatvara krug
Korak 4: druga nožica buzzera spojena na plavu − vodilicu, čime se krug zatvara

Krug je sada zatvoren: IO5 → buzzer → GND. Što god IO5 radi, buzzer osjeti.

5. Spoji pločicu na računalo

Gotov krug s buzzerom napajan preko USB-C
Korak 5: gotov krug, napajan preko USB-C
ℹ️
Redovi 14 i 15 samo su redovi koje fotografije slučajno koriste. Bilo koja dva slobodna reda rade, dokle god nožice buzzera sjede u dva različita reda, 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 sve što tone() radi. Prebacuje IO5 između 3.3 V i 0 V iznova, praveći pravokutni signal, a broj prebacivanja u sekundi je frekvencija, mjerena u hercima. Tvoje uho tu frekvenciju čita kao visinu tona:

NotaFrekvencija (Hz)
C4262
D4294
E4330
F4349
G4392
A4440
B4494
C5523
ℹ️
Viša frekvencija daje višu visinu tona, niža frekvencija dublju. Osam vrijednosti iznad su jedna oktava C-dur skale, a to je točno melodija koju ova skica svira.

Korisna stvar kod tone() je to što nastavlja raditi u pozadini. Kada nota počne, pločica je slobodna nastaviti s ostatkom koda, i zato skica koristi delay() da odluči koliko dugo čekati prije pokretanja sljedeće.


Kako je melodija pohranjena

Melodija je u stvari par lista koje putuju zajedno: koja nota i koliko traje. Skica ih drži u dva polja iste dužine:

  • melody[] drži frekvenciju svake note u hercima.
  • noteDuration[] drži dužinu svake note, zapisanu kako je zapisuju note: 4 za četvrtinku, 2 za polovinku.

Petlja for zatim prolazi kroz oba polja jedan indeks za drugim, svira notu pomoću tone() i počeka njezino trajanje. Kada petlja završi, noTone() se pobrine da buzzer ostane tih.


Kod

/*
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.
*/
const int BUZZER_PIN = 5;

/*
Koristit ćemo dva polja - jedno za frekvencije nota (u hercima) i jedno za trajanja nota.
Ona definiraju kratku melodiju koju će buzzer odsvirati.
*/
int melody[] = { 262, 294, 330, 349, 392, 440, 494, 523 }; // C4 do C5
int noteDuration[] = { 4, 4, 4, 4, 4, 4, 4, 2 }; // Četvrtinke (posljednja je polovinka)

/*
Ovdje računamo koliko nota melodija ima, umjesto da ih brojimo napamet. sizeof() nam kaže koliko memorije
nešto zauzima, pa nam veličina cijelog polja podijeljena s veličinom jednog unosa daje broj unosa.
Napisano ovako, broj ostaje ispravan i nakon što dodaš svoju notu.
*/
const int NOTE_COUNT = sizeof(melody) / sizeof(melody[0]);

void setup() {

/*
pinMode() je funkcija koja konfigurira zadani pin da se ponaša ili kao ulaz ili u ovom slučaju kao izlaz.
Budući da naš pin mora pobuđivati buzzer, pin ćemo staviti u OUTPUT mod.
*/
pinMode(BUZZER_PIN, OUTPUT);

/*
Serial.begin() uspostavlja serijsku komunikaciju između tvoje pločice i tvog računala preko USB kabela. Ovdje ga koristimo
da ti damo znati kada melodija počinje i kada je gotova.
*/
Serial.begin(115200);
Serial.println("Playing melody...");

/*
Petlja for ponavlja blok koda zadani broj puta, brojeći vlastitom varijablom. Ovdje "i" počinje na 0
i raste za jedan u svakom prolazu dok ne dosegne NOTE_COUNT, pa se blok ispod izvršava jednom za svaku notu u melodiji.
*/
for (int i = 0; i < NOTE_COUNT; i++) {

/*
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 polja, pa 4 postaje 250 ms a 2
postaje 500 ms.
*/
int duration = 1000 / noteDuration[i];

/*
tone() je funkcija koja tjera buzzer da proizvede zvuk. Generira pravokutni signal zadane frekvencije,
koju naše uho čuje kao visinu note, a treća vrijednost mu govori koliko dugo da nastavi svirati.
*/
tone(BUZZER_PIN, melody[i], duration);

/*
delay() je funkcija koja započinje pauzu u kodu. Čekamo malo dulje od same note, što ostavlja
kratku tišinu između nota da se ne stope jedna u drugu. Slobodno eksperimentiraj s tim faktorom 1.3.
*/
delay(duration * 1.3);
}

/*
noTone() zaustavlja svaki zvuk koji je buzzer pravio. Posljednja nota već je sama završila, ali poziv ovoga
osigurava da buzzer ostane tih što god se dogodilo.
*/
noTone(BUZZER_PIN);
Serial.println("Melody finished!");
}

void loop() {
// Ovdje se ništa ne događa - melodija se svira jednom u setup()
}

Što bi trebao vidjeti

Prenesi skicu i buzzer odsvira uzlaznu skalu od osam nota, ukupno oko dvije sekunde. Onda utihne.

Sve se događa u setup() a loop() je prazan, pa se melodija svira jednom po uključivanju. Da je čuješ ponovno, kucni tipku RST na pločici.

Otvori Tools → Serial Monitor i postavi baud rate na 115200, i istu stvar možeš gledati u tekstu:

Serial Monitor prikazuje Playing melody i Melody finished
Serial Monitor na 115200 bauda, prije i nakon melodije
ℹ️
Ako se obje poruke pojave, a ti ne čuješ ništa, kod je u redu a spajanje nije. Provjeri da su nožice buzzera u dva različita reda i da jumper žica s IO5 sleti u isti red kao jedna od njih.

Probaj sam: promijeni jedan od brojeva u melody[] i prenesi ponovno. Budući da se NOTE_COUNT računa iz samog polja, možeš i dodati note u oba polja i petlja će ih pokupiti bez ikakve druge promjene.


Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

2.4_Buzzer_Beep.ino

Primjer koji pokazuje kako pomoću funkcije tone() odsvirati jednostavnu melodiju na pasivnom buzzeru spojenom na IO5.