Kurz Arduino úroveň II – #3 – Poplachová siréna, MOSFET v praxi

Při používání Arduino chceme někdy použít komponenty, které vyžadují vyšší napětí než 5 V. Zde přicházejí ke slovu tranzistory MOSFET.

Než se však k tomuto tématu dostaneme, podívejme se, jak se zvuky vytvářejí. Jednoduché akustické signály jsme již vytvořili, nyní je čas je zpestřit. To umožní sestavit poplašnou sirénu.

Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>

V první fázi kurzu Arduino jsme generovali zvuky pomocí bzučáku, který měl zabudovaný generátor. Tato součástka fungovala velmi jednoduše: když byla napájena, vydávala nepřetržitý tón, nebo spíše hlasité pípání. Důvodem byla instalace generátoru, který způsobuje rychlé vibrace součástky vydávající zvuk.

Příklad bzučáku s generátorem – softwarově řízené zapínání a vypínání.

Nyní se podíváme na bzučák bez generátoru. Již název této komponenty říká mnohé. Tentokrát, abychom něco slyšeli, musíme sami poskytnout odpovídající signál. Jak jste si již pravděpodobně domysleli, změna tohoto signálu (zejména frekvence) ovlivní zvuk.

Bzučák bez generátoru ze sady.

Bzučák na výše uvedené fotografii se neliší od bzučáku s generátorem. Snadno najdete dva stejně vypadající bzučáky, které se liší svým vnitřním uspořádáním.

Ve většině případů se bzučák s generátorem neliší
od bzučáku bez generátoru.

Nejjednodušší způsob, jak zjistit, zda je komponenta vybavena generátorem, je nahlédnout do její dokumentace. Pokud je nemáme, můžeme je připojit na nízké napětí (3-5 V). V případě vestavěného generátoru slyšíme nepřetržité pípání, jinak se prakticky nic neděje.

Velkou výhodou bzučáků bez generátoru je, že je lze provozovat v širokém rozsahu napětí. V případě tohoto modelu jej lze použít v obvodech s napětím 1 až 40 V.

Je čas přejít k praktickým cvičením!

Hotové sady pro kurzy Forbot
Sada prvků   Zaručená podpora   Odeslání do 24 hodin

Komponenty pro cvičení z kurzu Arduino (úroveň 2) jsou k dispozici jako hotové sady! Patří sem programovatelné diody, analogové a digitální teploměry, 7-segmentové displeje a senzor pohybu (PIR).

Připojení bzučáku bez generátoru k Arduino

Začneme nejjednodušším připojením, a to přímo na piny našeho regulátoru. To je možné, protože bzučák odebírá velmi malý proud a nepoškozuje výstup mikrokontroléru.

Jak bylo oznámeno, připojujeme se:

  • první řádek bzučáku s GND,
  • druhý s výstupem Arduino, např. A5.

Bzučák bez generátoru není polární součástkou (můžeme jej volně připojit). Z principu a pro svůj klid však doporučuji držet se uznávaných norem a připojit černý kabel k zemi.

Zapojení obvodu pro test:

Přímé připojení bzučáku k Arduino.

První test bzučáku bez generátoru

Nejprve si ověříme, co se stane, když použijeme bzučák tak, jak ho známe z předchozích cvičení, tj. jako by měl generátor. Za tímto účelem jednoduše změníme stav výstupu:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu  
}

void loop() {
  digitalWrite(A5, LOW); //Cyklická změna stavu výstupu
  delay(1000);
  digitalWrite(A5, HIGH);
  delay(1000);
}
				
			

Když použijeme bzučák s generátorem, uslyšíme hlasité pípání s dobou trvání jedné sekundy. Tentokrát je však slyšet pouze tiché „pípnutí“. Navíc nevydrží ani vteřinu. Tón je krátký a zazní pouze při změně stavu připojení.

Důvodem je deformace desky uvnitř bzučáku při změně napájecího napětí. Zvuk vzniká vibracemi této části.

Generování zvuku deformací.
				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstup 
}

void loop() {
  digitalWrite(A5, LOW); //Cyklická změna stavu výstupu
  delay(100);
  digitalWrite(A5, HIGH);
  delay(100);
}
				
			

Jak obvod funguje v praxi:

Podle očekávání se nyní zvuk ozývá častěji. Proto můžeme tempo změn ještě zvýšit:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu  
}

void loop() {
  digitalWrite(A5, LOW); //Cyklická změna stavu výstupu
  delay(10);
  digitalWrite(A5, HIGH);
  delay(10);
}
				
			

Jak systém funguje v praxi:

Tentokrát se děje něco zvláštního – už zřetelně slyšíme jiný zvuk. Pokud půjdete ještě o krok dál, můžete program otestovat například se zpožděním 1 ms. Nechávám to však na těch, kteří si to přejí.

Generování zvuku pomocí funkce zpoždění samozřejmě není pohodlné. Musíte mít na paměti, že zpoždění zastaví celý program. Arduino proto nemohlo dělat prakticky nic jiného.

Mnohem lepší je použít hotovou funkci, která využívá speciální obvody zabudované v mikrokontroléru (zejména časovače/počítače).

Funkce tone

Jako pomůcka slouží velmi jednoduchá funkce tone(), která vyžaduje 3 argumenty:

  1. pin, na kterém má být signál generován,
  2. frekvence tohoto signálu,
  3. Doba trvání – tento parametr není povinný.

V praxi se tato funkce používá takto:

				
					tone(A5, 1000, 2000); //Generuj signál o frekvenci 1000 Hz na vývodu A5, který trvá 2000 ms.
				
			

Nebo ve zkrácené verzi:

				
					tone(A5, 1000); //Generuj 1000Hz signál na vývodu A5
				
			

Prozatím budeme používat pouze tuto formu (tj. dva parametry).

Funkce tone v praxi

Je čas vyzkoušet, zda s novou funkcí skutečně dokážeme vydat zvuk:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
  tone(A5, 1000); //Generuj 1000Hz signál na vývodu A5 
}

void loop() {

}
				
			

Jak obvod funguje v praxi:

Je třeba si uvědomit, že funkce tone() spouští generování signálu na určitém pinu a že tento signál je tam vždy generován ve výchozím nastavení! Proto je ve výše uvedeném programu vždy slyšet tón, i když je funkce tone() volána v sekci setup(). To má však jednu nevýhodu:

Funkce tone() využívá čítač (časovač) zabudovaný v Arduino ke generování tónu, který je také zodpovědný za generování signálu PWM. Použití této funkce proto ovlivňuje také schopnost generovat PWM na výstupech 3 a 11.

Chcete-li zastavit generování signálu po jeho spuštění, použijte druhou funkci:

				
					noTone(A5); //Vypni generování signálu na pinu A5
				
			

Jednoduché pípnutí lze tedy realizovat takto:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
}

void loop() {
  tone(A5, 1000); //Generuj 1000Hz signál na vývodu A5 
  delay(1000);  
  noTone(A5); //Vypni generování signálu
  delay(1000);
}
				
			

Fungování kodexu v praxi:

Funguje to! Není však příliš hlasitý a celkově nemá oproti bzučáku s generátorem žádné rozpoznatelné výhody. Za chvíli bude vše jasnější!

Hledání nejhlasitější frekvence

Každý bzučák začne vydávat hlasitý zvuk při určité charakteristické frekvenci. Konkrétně se jedná o rezonanční frekvenci. Můžete si je vyhledat v dokumentaci, ale zatím vám doporučuji experimentální přístup.

Ve výše uvedených příkladech jsme vygenerovali signál o frekvenci 1000 Hz, tj. 1 kHz. Odkud tato hodnota pochází? Dobrá otázka – právě jsem ji z ničeho nic zadal a našel hodnotu, která vydává zvuk. Použijme však smyčku for ke kontrole většího rozsahu:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
}

void loop() {
  int frekvence = 0;
  for (frekvence = 31; frekvence < 65535; frekvence++) { 
    tone(A5, frekvence); //Generuj 1000Hz signál na vývodu A5 
  }
}
				
			

Proč se smyčka for provádí s frekvencí 31 Hz až 65535 Hz? Jedná se o omezení funkce tone(), která může na Arduino UNO generovat signály s frekvencemi, které se v tomto rozsahu mísí (důvody v této fázi kurzu nebudeme rozebírat).

Jak výše uvedený program funguje v praxi:

Po spuštění programu se ozve skřípot a pak různé podivné zvuky. Po několika sekundách se smyčka znovu spustí a ozve se další krátké zaskřípění. Změnou rozsahu, kterým smyčka prochází, se můžete pokusit najít nejhlasitější frekvenci.

Je to dobré cvičení, abyste si zapamatovali, jak bzučák funguje!

Pokud máte možnost, můžete se podívat na katalogový list a zjistit rezonanční frekvenci. V případě našeho bzučáku je to: 4000 Hz ± 500 Hz. Takže bychom měli očekávat, že bude nejhlasitější v rozmezí 3500-4500 Hz.

Ověříme to pomocí jednoduchého programu:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
}

void loop() {
  tone(A5, 4000); //Generuj signál 4000 Hz na vývodu A5 
  delay(100);  
  noTone(A5);
  delay(100);
}
				
			

Nyní se ozývá mnohem hlasitěji:

Hlasitá poplašná siréna

Výše uvedený program lze použít k vytvoření přerušovaného, rovnoměrného tónu. Jak ukázal test se smyčkou for, lze s takovým bzučákem generovat i jiné zvuky – záleží jen na zvolené frekvenci. Můžeme tedy vygenerovat jednoduchou poplašnou sirénu:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
}

void loop() {
  tone(A5, 4300); //Generuj 4300Hz signál na vývodu A5 
  delay(150);  
  tone(A5, 3500); //Generuj signál 3500 Hz na vývodu A5 
  delay(150);
}
				
			

Jak program funguje v praxi:

Časy a frekvence jsem zvolil experimentálně. Bohužel mé hudební schopnosti u takovýchto testů naslepo končí. Věřím však, že někteří z vás mají větší talent a dokáží vykouzlit mnohem zajímavější zvuky.

Pro pokročilé uživatele - vytváření melodií

Pokud se ocitnete ve světě hudby, můžete vytvářet různé melodie. Bohužel je to úplně mimo můj svět. Naštěstí se jedná o kurz programování (a ne o hudební kurz). Pokud chcete opravdu udělat víc, doporučuji se podívat:

Soubory > Příklady > Digitální > toneMelody

Najdete zde ukázkový program, který vytvoří jednoduchou melodii.

Nejzajímavější pro ty, kteří chtějí v této oblasti dále pracovat, jsou definice ze souboru pitches.h, který se automaticky otevře spolu s výše uvedeným příkladem:

				
					#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
				
			

Můžete je samozřejmě vložit i do vlastního programu a použít je ke generování složitých zvukových signálů. Nechám toto téma na těch, kteří o to stojí, protože se necítím být v pozici, abych někomu radil v hudebních záležitostech…..

Na internetu lze najít mnoho zajímavých příkladů použití této funkce. Zde je jeden z nich:

Soustřeďme se však i nadále na elektroniku a programování!

MOSFET - řízení vyšším napětím

Na úvod bych rád zdůraznil, že se nejedná o kontrolu vysokého síťového napětí nad 200 V.

Mám na mysli případy, kdy potřebujeme ovládat zařízení, která vyžadují například 9 V nebo 12 V. Některé komponenty nejsou schopny pracovat s napětím, které poskytuje Arduino, tj. 5 V. Zde mohou pomoci tranzistory MOSFET.

Další výhodou ovládání „tak malými mezičlánky“ je samozřejmě to, že mají mnohem vyšší proudovou zatížitelnost. Z jednoho pinu Arduino můžete bez obav odebírat proud kolem 20 mA. Po použití tranzistorů MOSFET to bude plný ampér!

Praktickým příkladem, kde by takový tranzistor mohl být užitečný, je řízení osvětlení. LED pásky obvykle vyžadují napájení 12 V a jejich proudová náročnost může dosahovat několika ampérů. Přímé ovládání pomocí Arduino tedy není možné!

V našem experimentu použijeme MOSFET k ovládání 12 V bzučáku.

MOSFET v praxi - ovládání bzučáku

Sady obsahují tranzistor IRL540N, který je oblíbený mezi kutily. Jeho parametry lze samozřejmě nalézt v katalogové poznámce. Nejdůležitější z nich jsou

  • Maximální vypouštěcí proud Id: 36 A,
  • Maximální napětí VDSS: 100 V,
  • Odpor kanálu Rdson: 0,044 Ω.

Nejprve zkontrolujme, zda tranzistor skutečně dokáže ovládat vyšší napětí. Za tímto účelem zapojíme obvod následujícím způsobem:

  • Řídicí signál přes rezistor 10k na hradlo (nejlevější řádek MOSFETu),
  • Uzemněte Arduino ke zdroji (pravý řádek),
  • Z odtoku (středová čára) vyvedeme vedení, které zapojíme do desky plošných spojů (tak, aby nebylo spojeno s žádným jiným signálem),
  • Do desky je zapojena další linka z VIN Arduino – zatím také proto, aby neměla spojení s jiným signálem,

Nyní pečlivě zkontrolujeme spojení.
Pokud uděláte chybu, můžete poškodit celé Arduino.

  • Připojte napájecí zdroj a kabel USB. Od této chvíle máme na pinu VIN ~12 V, které přichází přímo z napájecího zdroje.
Připojení tranzistoru MOSFET k Arduino.

Poté nahrajeme jednoduchý program, který změní stav výstupu:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu 
}

void loop() {
  digitalWrite(A5, LOW); //Cyklická změna stavu výstupu
  delay(1000);
  digitalWrite(A5, HIGH);
  delay(1000);
}
				
			

Pokud je vše v pořádku, dostaneme mezi dvěma volnými vodiči (zelený a žlutý na výše uvedeném schématu zapojení) napětí výrazně vyšší než 5 V, které se tam objevuje pravidelně (každou sekundu):

Řízení vyššího napětí z Arduino.

Pokud je vše v pořádku, můžeme bzučák připojit. Připojte jej podle obrázku níže:

Připojení bzučáku.

Následně nahrajeme program s naší poplašnou sirénou:

				
					void setup() {
  pinMode(A5, OUTPUT); //Konfigurace A5 jako výstupu
}

void loop() {
  tone(A5, 4300); //Generuj 4300Hz signál na vývodu A5 
  delay(150);  
  tone(A5, 3500); /Generuj signál 3500 Hz na vývodu A5 
  delay(150);
}
				
			

Celá věc je provozována při vyšším napětí a hluk vycházející z obvodu je mnohem tišší. Proč? Piezoelektrický prvek uvnitř bzučáku ukládá energii během rychlých spínacích operací (chová se jako kondenzátor).

Při tak rychlých změnách stavu nemá tato energie kam „uniknout“. V důsledku toho je zvuk vycházející z prvku tlumený. Tento problém lze naštěstí poměrně snadno vyřešit. Jednoduše připojte paralelně k bzučáku rezistor, např. 10 k, aby se mohl rychle vybíjet.

Obvod s přídavným rezistorem.

V praxi vypadá obvod nakonec takto:

Obvod s přídavným rezistorem 10k.

Nyní by mělo vše fungovat správně. Můžeme se těšit na vyšší napětí bzučáku! Stojí za to ověřit, jak se obvod chová při jiných frekvencích. Změnilo vyšší napětí odezvu na jiných frekvencích? To by mělo být cvičení pro všechny dobrovolníky.

Zejména v tomto případě není použití tohoto tranzistoru bezpodmínečně nutné a bzučák lze jistě použít i bez něj. Berte to tedy jako příklad, nikoli jako „věštbu“, že to musíte dělat tímto způsobem. Mým hlavním cílem bylo ukázat, že komponenty, které pracují s vyšším napětím, lze také velmi snadno ovládat pomocí Arduino. Tohoto tématu jsme se zde dotkli jen okrajově!

Shrnutí

Cílem této části bylo zvládnout nové komponenty – zejména bzučák bez generátoru. Společně s páskem LED (o kterém byla řeč v předchozí části) bude nyní možné vytvořit hlasitý a dobře viditelný výstražný signál. Tomu se budeme věnovat v příštím díle a mimo jiné se seznámíme také s detektorem pohybu.

Objednejte si sadu prvků a začněte se učit v praxi! Kliknutím sem přejdete do obchodu >>

Přejít nahoru