TinyLab: Piezo bzučák
V dalším dílu seriálu věnovaného desce TinyLab si ukážeme, jak se dá využít Piezzo bzučák dostupný na desce.
Obsah článku:
Co je piezo bzučák
Označení „piezo“ nesou různé součástky, které pro svoji činnost využívají piezzoelektrický jev. O něm Wikipedie uvádí:
Piezoelektrický jev (z řeckého piezein (πιέζειν) – tlačit) je schopnost krystalu generovat elektrické napětí při jeho deformování.
Tedy, že některé krystaly mají speciální vlastnost, že když je zmáčkneme, generují elektrické napětí. Toho se využívá například v zapalovačích, kdy krystal generuje elektrickou jiskru. Piezo články nalezneme také v některých snímačích v kytarách.
Tento jev ale funguje i opačně. V tomto případě se nazývá nepřímý piezoelektrický jev. Přivedeme-li na krystal napětí, dochází k jeho deformaci. A toho se využívá právě v piezo bzučácích. Přivedením měnícího se napětí na krystal dochází k jeho střídavému smršťování a rozpínání. Krystal svým pohybem rozpohybovává i okolní částice a vzniká tak zvuková vlna, kterou slyšíme.
Z našeho pohledu to znamená, že musíme pin, ke kterému je bzučák připojen rychle vypínat a zapínat.
Zvuk
Zvuk se prostředím šíří jako kmitání částic. Bzučák svým pohybem částice rozpohybovává, tento pohyb se postupně šíří prostředím, až narazí na bubínek našeho ucha, který je tímto pohybem rozkmitán. A my tyto kmity vnímáme jako zvuk.
U zvuku rozlišujeme několik vlastností. Jsou to například barva, amplituda (hlasitost), frekvence (výška tónu) a další. U piezzo bzučáku na naší desce jsme schopni ovlivnit pouze frekvenci.
Frekvence
Frekvence říká, kolikrát za sekundu dojde ke kmitnutí částic. V našem případě tedy kolikrát za sekundu bzučák zapneme a vypneme.
Jednotkou frekvence je Hz (hertz). Pokud má tón frekvenci 50Hz, znamená to, že se krystal v bzučáku 50x za sekundu roztáhne a smrští.
Právě frekvence od sebe odlišuje různé tóny. Například pro komorní A je stanovena frekvence 440Hz. Tabulku tónů a jejich frekvencí nalezneme například zde.
Generování zvuku na Arduinu
Našim cílem bude přehrát na bzučáku komorní A, tedy tón s frekvencí 440Hz. Prvně musíme zjistit, jak rychle musíme bzučák zapínat a vypínat. Víme, že k zapnutí a vypnutí musí dojít 440x za sekundu. Bzučák stráví v zapnutém a vypnutém stavu vždy stejnou dobu. Dobu mezi jednotlivými zapnutími nazýváme perioda. Tu vypočítáme pomocí následujícího vzorce:
perioda = 1 / frekvence
Nebo také zapsáno fyzikálně:
T = 1 / f
Víme tedy, že v našem případě bude jedna perioda mít přibližně délku
1 / 440 = 0,002272 sekundy = 2272 mikrosekund
Kód bude vypadat tak, že bzučák zapneme, počkáme polovinu periody, bzučák vypneme a počkáme další polovinu periody. A tak pořád dokola.
Velice jednoduchý kód pro generování komorního A by mohl vypadat takto:
#define BZUCAK A1 unsigned int pulPeriody = 1134; void setup() { pinMode(BZUCAK, OUTPUT); } void loop() { digitalWrite(BZUCAK, HIGH); delayMicroseconds(pulPeriody); digitalWrite(BZUCAK, LOW); delayMicroseconds(pulPeriody); }
Na TinyLabu je bzučák připojený k pinu A1 (analogový pin 1), takže nesmíme zapomenout zapnout vypínač u tohoto pinu (označený číslem 5).
Popřípadě pokud chceme periodu dopočítávat až v kódu, bude vypadat takto:
#define BZUCAK A1 unsigned int frekvence = 440; unsigned int perioda = 1000000 / frekvence; // není v sekundách, ale mikrosekundách, proto 1000000 místo 1 unsigned int pulPeriody = perioda / 2; void setup() { pinMode(BZUCAK, OUTPUT); } void loop() { digitalWrite(BZUCAK, HIGH); delayMicroseconds(pulPeriody); digitalWrite(BZUCAK, LOW); delayMicroseconds(pulPeriody); }
Arduino funkce tone
Zapínání a vypínání pinu ručně, jak jsme si předvedli v předchozím příkladu má jednu nevýhodu. Pokud do funkce loop něco přidáme, dojde k jejímu zdržení, perioda se protáhne a místo tónu A máme jiný tón, popřípadě podivný šum.
Naštěstí existuje funkce tone, která za nás generování tónu obstará. Navíc je vytvořena „chytřeji“, než jsme si předvedli, takže ji dlouhotrvající kód v loop nerozhodí.
Funkci tone můžeme použít dvěma způsoby:
- tone(pin, frekvence)
- hraje tón na pinu o dané frekvenci, dokud jej funkcí noTone(pin) nevypneme
- tone(pin, frekvence, trvání)
- Pokud funkci zadáme ještě délku přehrávání tónu (v milisekundách), dojde vypnutí přehrávání tónu po uplynulé době.
Ukažme si tedy použití v obou případech.
#define BZUCAK A1 void setup() { tone(BZUCAK, 440); delay(1000); noTone(BZUCAK); } void loop() {}
A bez delay:
#define BZUCAK A1 void setup() { tone(BZUCAK, 440, 1000); } void loop() {}
Přehrávání melodie
V příkladu na závěr si ukážeme, jak se dá přehrát jednoduchá melodie. Abychom si usnadnili situaci, přidáme si k projektu soubor s definicemi tónů a jejich frekvencí.
V Arduino IDE klikneme na šipku dolů v pravé horní části. A zvolíme možnost Add new tab. Vytvoří se nám nová záložka v IDE, kterou nazveme pitches.h a vložíme do ní následující kód:
#define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
Tyto konstanty potom můžeme použít v našem programu tak, že na jeho začátek přidáme řádek #include „pitches.h“. Ukážeme si, jak přehrát stupnici. Úpravou programu ale bude možné zahrát libovolnou stupnici.
#include "pitches.h" #define BZUCAK A1 unsigned int stupnice[] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; void setup() { for(int i = 0; i < 8; i++){ tone(BZUCAK, stupnice[i]); delay(1000); } noTone(BZUCAK); } void loop() {}
Úprav se nabízí celá řada. Třeba umožnit různou délku tónu a další. Hodně zajímavý je třeba Imperial March na bzučák:
https://www.youtube.com/watch?v=9kIDWvAj-iE
Vytvořili jste vlastní kód? Pochlubte se v komentářích, nebo na našem fóru arduino-forum.cz.
- Sledovač slunce s Arduinem - 23.3.2022
- Programovatelný kytarový pedál s Arduinem - 26.2.2020
- Arduino infračervený teploměr vytištěný na 3D tiskárně - 11.2.2020