Skip to main content

2.7 Generovanie zvuku cez PWM

Pri zariadeniach s mikrokontrolérom často potrebujeme vydávať aj nejaký zvuk - zväčša nie je potrebný úplný prenos zvuku, ale stačí jednoduché výstražné, či potvrdzujúce pípanie. Ako už vieme z fyziky, zvuk je mechanické vlnenie, prenášané hmotou, napríklad vzduchom. Počet vĺn za sekundu, teda frekvencia zvuku, určuje výšku tónu. Pre zaujímavosť, dvojnásobná frekvencia dá tón „o oktávu vyšší“.

2.7 generovanie zvuku.webp

Bzučiak

Klasické zariadenie na vydávanie zvuku je reproduktor. Ten má však zvyčajne veľmi nízku impedanciu (odpor) a veľkú spotrebu energie, rozhodne ho nemôžeme pripojiť k MCU priamo - potrebný by bol zosilňovač. Vhodnejší bude buzzer (bzučiak, beeper) - piezoelektrický menič. V podstate sa jedná o veľmi jednoduchý reproduktor, poznajúci len dve krajné hodnoty polohy membrány.

Bzučiak existuje aktívny a pasívny. Aktívnemu stačí dodať napájanie a začne pískať na svojej nemennej frekvencii - tento nás nezaujíma, pretože nevieme meniť tón. Pasívny bzučiak sám od seba nerobí nič, no po prepnutí úrovne vstupného napätia prepne polohu membrány. Nevie teda plnohodnotne reprodukovať hudbu, vôbec nevie reprodukovať iné zvuky a reč, no postačuje na jednoduchú signalizáciu a nie príliš lahodne znejúce tóny melódie. Oproti plnohodnotnému reproduktoru má výhodu malých rozmerov a nízkej spotreby energie.

Elektrické zapojenie

Samotný bzučiak má len dva piny - zem a ovládací signál (napätie). So zapájaním však treba byť rovnako opatrný, ako v prípade LED - bzučiak nemá dostatočný odpor (bežné malé majú cca 15 Ω), a teda ho nemôžeme pripojiť na výstupný port priamo! Portom by pretekal prúd až 220 mA, čo by v horšom prípade mohlo skončiť poškodením portu, v lepšom prípade len zbytočne veľkou spotrebou energie a zahrievaním. Potrebný je buď sériový rezistor aspoň 100 Ω (zvuk však bude dosť tichý) alebo, čo je lepšie, tranzistor na spínanie externého napájania pre bzučiak.

Výhodné je zaobstarať si hotový modul s pasívnym bzučiakom, ktorý je vybavený tranzistorom. V takom prípade má modul 3 piny - jeden je pre zem, druhý je ovládací signál z MCU (s malým prúdom, obmedzený rezistorom cca 1 kΩ) a tretí je napájanie s veľkým prúdom, ktoré tranzistor posiela do piezoelektrického meniča. Toto napájanie bzučiaka musí ísť z napájacieho pinu MCU (môže byť 3,3 V alebo 5 V), pretože opäť treba očakávať prúd až 220 mA.

Zamyslenie nad spotrebou energie

Z hľadiska spotreby energie je dobré zamyslieť sa ešte nad hodnotou striedy PWM. Je zrejmé, že najzreteľnejší (najhlasnejší) zvuk bude pri striede 50 %. Obe krajné hodnoty budú znamenať, že membrána sa vôbec nehýbe, a teda nie je generovaný žiadny zvuk. Hodnoty pod a nad 50 % by mali fungovať symetricky, teda napríklad strieda 20 % by mala znieť rovnako ako 80 %. Lenže rozdiel bude v spotrebe energie - pri výstupe logickej úrovne 1 bude bzučiakom pretekať prúd, pri hodnote 0 nebude. Takže strieda 20 % bude podstatne úspornejšia ako hodnota 80 %. Pozor však na invertované zapojenie (časté pri moduloch s tranzistorom) - vtedy to bude presne naopak, lepšie je teda spraviť kontrolné meranie.

Bzučiak zo sady D1 Mini kit je pripojený cez D8 (na ESP32 D1 Mini zodpovedá GPIO 5), na M5StickC Plus je to cez GPIO 2. V oboch prípadoch je napájanie ošetrené tranzistorom, na M5Stick je obmedzený aj prúd napájania - teda jeho bzučiak je tichý a úsporný.

Demonštračný program

V tomto programe používame funkciu pre zahratie tónu. Jej vstupom je inštancia bzučiaka, frekvencia a trvanie tónu a prípadne aj pauza po skončení tónu.

Hlavný program použije túto funkciu na zahratie stupnice tónov 4. oktávy a následne prvej slohy našej hymny. V klasickom prevedení - nezabúdajme, že bzučiak je príliš jednoduchý a nevie zanôtiť zvuk fujary! 😁

from machine import Pin, PWM
from time import sleep

def ZahrajTón(buzzer, freq, trvanie, pauza = 0):
    buzzer.init(freq = freq, duty_u16 = 2**15)
    sleep(trvanie)
    buzzer.duty_u16(0)
    sleep(pauza)
    
# priradíme pin a vypneme (nevieme, čo bolo nastavené)
buzzer = PWM(Pin(2))
buzzer.deinit()
 
sleep(1)
for tón in (262, 294, 330, 349, 392, 440, 494, 523):
    ZahrajTón(buzzer, tón, 0.25)

sleep(1)
ZahrajTón(buzzer, 784, 0.2, 0.05)
ZahrajTón(buzzer, 880, 0.2, 0.05)
ZahrajTón(buzzer, 932, 0.45, 0.05)
ZahrajTón(buzzer, 932, 0.45, 0.05)
ZahrajTón(buzzer, 932, 0.2, 0.05)
ZahrajTón(buzzer, 932, 0.2, 0.05)
ZahrajTón(buzzer, 880, 0.2, 0.05)
ZahrajTón(buzzer, 932, 0.2, 0.05)
ZahrajTón(buzzer, 1046, 0.2, 0.05)
ZahrajTón(buzzer, 932, 0.2, 0.05)
ZahrajTón(buzzer, 880, 0.45, 0.05)
ZahrajTón(buzzer, 784, 0.45, 0.05)