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.