KursyPoradnikiInspirujące DIYForum

Kurs Arduino II – #3 – syrena alarmowa, MOSFET w praktyce

Kurs Arduino II – #3 – syrena alarmowa, MOSFET w praktyce

Zdarza się, że korzystając z Arduino chcemy użyć podzespołów, które wymagają napięcia wyższego od 5V. Tutaj przydatne okazują się MOSFETy.

Zanim przejdziemy do tego tematu zajmiemy się jednak tworzeniem dźwięków. Generowaliśmy już wcześniej proste sygnały akustyczne, teraz pora na ich urozmaicenie. Dzięki temu możliwa będzie budowa syreny alarmowej.

Podczas pierwszego poziomu kursu Arduino generowaliśmy dźwięki za pomocą buzzera, który miał wbudowany generator. Element ten działał bardzo prosto - po dostarczeniu zasilania wydawał ciągły dźwięk, a właściwie głośny pisk. Działo się tak, ponieważ w jego wnętrzu producent umieścił generator, który wprawiał w szybkie drgania element odpowiedzialny za wytwarzanie dźwięku.

Przykład dźwięku buzzera z generatorem - programowe włączanie i wyłączanie.

Teraz zajmiemy się buzzerem bez generatora. Nazwa tego elementu mówi już wiele. Tym razem, aby coś usłyszeć, sami będziemy musieli dostarczać odpowiedni sygnał. Oczywiście, jak pewnie się domyślasz, zmiana tego sygnału (głównie jego częstotliwości) będzie wpływała na dźwięk.

Buzzer bez generatora z zestawu.

Buzzer bez generatora z zestawu.

Buzzer widoczny na powyższym zdjęciu, nie różni się od tego z generatorem. Bez problemu znaleźć można dwa identycznie wyglądające buzzery, które będą różniły się swoim wnętrzem.

Najłatwiej sprawdzimy, czy element wyposażony jest w generator zaglądając do jego dokumentacji. Jeśli jej nie posiadamy, to można podłączyć go do jakiegoś niskiego napięcia (3-5V). W przypadku wbudowanego generatora usłyszymy ciągły pisk, w przeciwnym razie nie stanie się praktycznie nic.

Dużą zaletą buzzerów bez generatorów jest możliwość ich pracy w szerokim zakresie napięcia. W przypadku omawianego modelu można z niego korzystać w układach zasilanych od 1 do 40V.

Pora na przejście do ćwiczeń praktycznych!

Gotowe zestawy do kursów Forbota

 Komplet elementów  Gwarancja pomocy  Wysyłka w 24h

Części do wykonania ćwiczeć z kursu Arduino (poziom 2) dostępne są w formie gotowych zestawów! W komplecie m.in. diody programowalne, termometry analogowe i cyfrowe, wyświetlacze 7-segmentowe oraz czujnik ruchu (PIR).

Zamów w Botland.com.pl »

Podłączenie buzzera bez generatora do Arduino

Zaczniemy od najprostszego podłączenia, czyli bezpośrednio do pinów naszego sterownika. Jest to możliwe, ponieważ buzzer pobiera bardzo mały prąd i nie uszkodzi wyjścia mikrokontrolera.

Zgodnie z zapowiedzią łączymy:

  • pierwsze wyprowadzenie buzzera z masą (GND),
  • drugie z wyjściem Arduino, np. A5.

Podłączenie układu do testu:

Bezpośrednie podłączenie buzzera do Arduino.

Bezpośrednie podłączenie buzzera do Arduino.

Pierwszy test buzzera bez generatora

Na początku sprawdźmy, co dzieje się, gdy wykorzystamy buzzer w sposób znany z poprzednich ćwiczeń - czyli tak, jakby miał generator. W tym celu po prostu zmieniamy stan wyjścia:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście  
}

void loop() {
  digitalWrite(A5, LOW); //Cykliczna zmiana stanu wyjścia
  delay(1000);
  digitalWrite(A5, HIGH);
  delay(1000);
}

W przypadku wykorzystania buzzera z generatorem słyszelibyśmy głośne piski trwające sekundę. Tym razem jednak słychać jedynie ciche "pyknięcia". Co więcej nie trwają one sekundę. Dźwięk jest krótki i odbywa się wyłącznie przy zmianie stanu wyprowadzenia.

Dzieje się tak, ponieważ wraz ze zmianą dostarczanego napięcia odkształca się blaszka, która znajduje się wewnątrz buzzera. To własnie drgania tej części generują dźwięk.

Generowanie dźwięku poprzez odkształcenie.

Generowanie dźwięku poprzez odkształcenie.

Wniosek z tego jest taki, że im częściej będzie zachodziła zmiana tym częściej usłyszymy dźwięk. Spróbujmy zatem kolejną wersję programu:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście  
}

void loop() {
  digitalWrite(A5, LOW); //Cykliczna zmiana stanu wyjścia
  delay(100);
  digitalWrite(A5, HIGH);
  delay(100);
}

Działanie układu w praktyce:

Zgodnie z oczekiwaniem, dźwięk wydobywa się teraz częściej. Możemy więc jeszcze bardziej zwiększyć tempo zmian:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście  
}

void loop() {
  digitalWrite(A5, LOW); //Cykliczna zmiana stanu wyjścia
  delay(10);
  digitalWrite(A5, HIGH);
  delay(10);
}

Działanie układu w praktyce:

Tym razem zaczyna dziać się coś dziwnego - ewidentnie słyszymy już inny dźwięk. Idąc krok dalej można sprawdzić działanie programu dla opóźnienia wynoszącego np. 1 ms. To pozostawiam już jednak dla chętnych.


Oczywiście takie generowanie dźwięku z wykorzystaniem funkcji delay nie jest wygodne. Trzeba pamiętać, że opóźnienia zatrzymują cały program. W związku z tym Arduino nie mogłoby robić praktycznie nic innego.

Funkcja Tone

Z pomocą przychodzi bardzo prosta funkcja tone(), która przyjmuje 3 argumenty:

  1. pin, na którym ma być wygenerowany sygnał,
  2. częstotliwość tego sygnału,
  3. czas trwania - parametr ten nie jest obowiązkowy.

W praktyce wykorzystanie tej funkcji wygląda następująco:

tone(A5, 1000, 2000); //Wygeneruj sygnał o częstotliwości 1000 Hz na pinie A5, który trwa 2000 ms

Lub w wersji skróconej:

tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5

Na razie będziemy korzystać tylko z takiej formy (czyli z dwóch parametrów).

Funkcja Tone w praktyce

Pora na sprawdzenie, czy faktycznie dzięki nowej funkcji uzyskamy dźwięk:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5  
}

void loop() {

}

Działanie układu w praktyce:

Warto zapamiętać, że funkcja tone() uruchamia generowanie sygnału na danym pinie i domyślnie będzie on tam wytwarzany cały czas! Dlatego powyższy program, mimo umieszczenia wywołania funkcji tone() w sekcji setup(), sprawia, że dźwięk słyszany jest cały czas. Ma to jednak wadę:

Aby zatrzymać raz uruchomione generowanie sygnału należy skorzystać z drugiej funkcji:

noTone(A5); //Wyłącz generowanie sygnału na pinie A5

Proste pikanie można zrealizować więc następująco:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
}

void loop() {
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5  
  delay(1000);  
  noTone(A5); //Wyłącz generowanie sygnału
  delay(1000);
}

Działanie kodu w praktyce:

Działa! Jednak niezbyt głośno i w sumie nie widać tutaj żadnych zalet nad buzzerem z generatorem. Zaraz wszystko się wyjaśni!

Szukanie najgłośniejszej częstotliwości

Każdy buzzer przy pewnej, charakterystycznej dla niego, częstotliwości zaczyna wydawać głośne dźwięki. Konkretnie mowa o częstotliwości rezonansowej. Można ją sprawdzić w dokumentacji, ja zachęcam jednak teraz do podejścia eksperymentalnego.


W powyższych przykładach generowaliśmy sygnał o częstotliwości 1000Hz, czyli 1kHz. Skąd ta wartość? Dobre pytanie - znikąd, po prostu wpisałem ją "z palca" i udało się trafić w wartość, która generuje jakiś dźwięk. Wykorzystajmy jednak pętlę for, aby sprawdzić szerszy zakres:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
}

void loop() {
  int czestotliwosc = 0;
  for (czestotliwosc = 31; czestotliwosc < 65535; czestotliwosc++) { 
    tone(A5, czestotliwosc); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5  
  }
}

Dlaczego pętla for wykonuje się od częstotliwości wynoszącej 31Hz do 65535Hz? To ograniczenia funkcji tone(), która na Arduino UNO może generować sygnały o częstotliwości mieszącej się w takim zakresie (na tym etapie kursu nie będziemy wnikać dlaczego).

Działanie powyższego programu w praktyce:

Po uruchomieniu programu słychać świst, a później różne dziwne dźwięki. Po kilku sekundach pętla rusza od początku i ponownie słyszymy krótki świst. Zmieniając zakres, przez który przechodzi pętla można próbować znaleźć najgłośniejszą częstotliwość.

Jeśli mamy taką możliwość można od razu zajrzeć do noty katalogowej i znaleźć częstotliwość rezonansową. W przypadku naszego buzzera wynosi ona: 4000 Hz ± 500 Hz. Czyli powinniśmy spodziewać się jego najgłośniejszej pracy w zakresie 3500-4500 Hz.

Sprawdzamy to prostym programem:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
}

void loop() {
  tone(A5, 4000); //Wygeneruj sygnał o częstotliwości 4000Hz na pinie A5  
  delay(100);  
  noTone(A5);
  delay(100);
}

Teraz uzyskujemy zdecydowanie głośniejszy dźwięk:

Głośna syrena alarmowa

Powyższy program pozwala na generowanie przerywanego, jednostajnego dźwięku. Jak pokazał test z pętlą for, buzzer taki pozwala również na generowanie innych dźwięków - wszystko zależy od wybranej częstotliwości. Możemy więc utworzyć prostą syrenę alarmową:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
}

void loop() {
  tone(A5, 4300); //Wygeneruj sygnał o częstotliwości 4300Hz na pinie A5  
  delay(150);  
  tone(A5, 3500); //Wygeneruj sygnał o częstotliwości 3500Hz na pinie A5  
  delay(150);
}

Działanie programu w praktyce:

Czasy i częstotliwości dobrałem eksperymentalnie. Niestety moje zdolności muzyczne kończą się na takich ślepych testach. Wierzę jednak, że część z Was ma większy talent i będzie potrafiła wyczarować znacznie ciekawsze dźwięki.

Dla zaawansowanych - generowanie melodyjek

Jeśli odnajdujecie się w świecie muzyki możecie generować różne melodyjki. Niestety to kompletnie nie mój świat. Całe szczęście, że to kurs programowania (a nie muzyki), czuje się usprawiedliwiony. Jeśli naprawdę chcecie zdziałać więcej, to polecam zajrzeć do:

Plik > Przykłady > Digital > toneMelody

Znajduje się tam przykładowy program, który generuje prostą melodyjkę.

Najciekawsze dla osób, które chcą działać dalej w tym zakresie są definicje z pliku pitches.h, który otwiera się automatycznie razem z powyższym przykładem:

#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

Oczywiście można je wkleić do swoich programów i wykorzystywać do tworzenia rozbudowanych sygnałów dźwiękowych. Temat pozostawiam dla chętnych, ponieważ nie czuje się na siłach, aby doradzać komuś w kwestiach muzycznych...

W Internecie można znaleźć wiele przykładów ciekawego użycia tej funkcji. Oto jeden z nich:

Skupmy się jednak dalej na elektronice i programowaniu!

MOSFET - sterowanie wyższym napięciem

Na myśli mam przypadki, w których musimy sterować urządzeniami wymagającymi przykładowo 9V lub 12V. Są takie elementy, które nie będą mogły pracować z napięciem dostarczanym przez Arduino, czyli 5V. Tutaj pomocne będą tranzystory typu MOSFET.

Oczywiście drugą zaletą sterowania przez "takich małych pośredników" jest ich znacznie większa wytrzymałość prądowa. Z pojedynczego pinu Arduino bezpiecznie można pobierać około 20mA. Po użyciu MOSFETów będą to całe ampery!

Podczas naszego eksperymentu posłużymy się MOSFETem, do sterowania buzzera z 12V.

MOSFET w praktyce - sterowanie buzzerem

W zestawach znajduje się popularny wśród majsterkowiczów tranzystor IRL540N. Jego parametry znaleźć można oczywiście w nocie katalogowej. Najważniejsze z nich, to:

  • maksymalny prąd drenu Id: 36 A,
  • maksymalne napięcie VDSS: 100 V,
  • rezystancja kanału Rdson: 0,044 Ω.

Powyższe artykuły wyczerpują podstawowe zagadnienia związane z MOSFETami. Dlatego nie będę już rozpisywał się na ich temat. Na początek sprawdźmy, czy tranzystor faktycznie pozwala na sterowanie wyższym napięciem. W tym celu łączymy układ tak jak poniżej:

  • sygnał sterujący przez rezystor 10k do bramki (skrajne lewe wyprowadzenie MOSFETa),
  • masa Arduino do źródła (skrajne prawe wyprowadzenie),
  • od drenu (środkowe wyprowadzenie) prowadzimy przewód, który wpinamy w płytkę (tak, aby nie łączył się z żadnym innym sygnałem),
  • dodatkowy przewód od VIN z Arduino wpinamy w płytkę - na razie też tak, aby nie łączył się z żadnym innym sygnałem,
  • podłączamy zasilacz oraz przewód USB. Od teraz na pinie VIN dysponujemy ~12V, które pojawia się tam prosto z zasilacza.
Podłączenie tranzystora MOSFET do Arduino.

Podłączenie tranzystora MOSFET do Arduino.

Następnie wgrywamy prosty program, który zmienia stan wyjścia:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście  
}

void loop() {
  digitalWrite(A5, LOW); //Cykliczna zmiana stanu wyjścia
  delay(1000);
  digitalWrite(A5, HIGH);
  delay(1000);
}

Jeśli wszystko będzie poprawnie, to między dwoma luźno wyprowadzonymi przewodami (zielony i żółty na powyższym schemacie montażowym) otrzymamy napięcie zdecydowanie wyższe od 5V, które będzie pojawiało się tam regularnie (co sekundę):

Sterowanie wyższym napięciem z poziomu Arduino.

Sterowanie wyższym napięciem z poziomu Arduino.

Gdy, wszystko jest poprawnie możemy podłączyć buzzer. Wpinamy go tak, jak jest to widoczne na poniższym schemacie:

Podłączenie buzzera.

Podłączenie buzzera.

Następnie wgrywamy program z naszą syreną alarmową:

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście
}

void loop() {
  tone(A5, 4300); //Wygeneruj sygnał o częstotliwości 4300Hz na pinie A5  
  delay(150);  
  tone(A5, 3500); //Wygeneruj sygnał o częstotliwości 3500Hz na pinie A5  
  delay(150);
}

Całość zasilamy wyższym napięcie, a dźwięk wychodzący z układu jest znacznie cichszy. Dlaczego? Element piezoelektryczny, znajdujący się wewnątrz buzzera, podczas szybkiego przełączania gromadzi energię (zachowuje się jak kondensator).

Przy tak szybkich zmianach stanu energia ta nie ma gdzie "uciec". W efekcie tłumi to wychodzący z niego dźwięk. Na szczęście stosunkowo łatwo można naprawić ten problem. Wystarczy równolegle z buzzerem wpiąć rezystor np. 10k, który pozwoli na jego szybkie rozładowywanie.

ard2_buz_2

Układ z dodanym rezystorem.

W praktyce układ wygląda ostatecznie następująco:

Układ z dodanym rezystorem 1k.

Układ z dodanym rezystorem 10k.

Teraz wszystko powinno działać poprawnie. Możemy cieszyć się buzzerem zasilanym z wyższego napięcia! Warto sprawdzić, jak układ będzie zachowywał się dla innych częstotliwości. Czy wyższe napięcie zmieniło reakcję na różne częstotliwości? Niech pozostanie to ćwiczeniem dla chętnych.


Akurat w tym przypadku wykorzystanie tego tranzystora nie jest bezwzględnie konieczne i można spokojnie korzystać z buzzera bez niego. Dlatego traktujcie to jako przykład, a nie jako "wyrocznię", że tak trzeba robić. Moim celem było głównie pokazanie, że przez Arduino bardzo łatwo można sterować również podzespołami działającymi z wyższym napięciem. Na ten moment tylko lekko zahaczyliśmy o ten temat!

Podsumowanie

Celem tej części było opanowanie nowych elementów - głównie buzzera bez generatora. Teraz, wraz z linijką diod LED (omówioną w poprzedniej części) możliwe będzie stworzenie głośnego i dobrze widocznego sygnalizatora alarmowego. Zajmiemy się tym w kolejnej części, przy okazji poznając również między innymi czujnik ruchu.

Czy wpis był pomocny? Oceń go:

Średnia ocena 4.9 / 5. Głosów łącznie: 162

Nikt jeszcze nie głosował, bądź pierwszy!

Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!

Nawigacja kursu

Nie chcesz przeoczyć kolejnych części kursu? Skorzystaj z poniższego formularza i zapisz się na powiadomienia o nowych artykułach!

Autor kursu: Damian (Treker) Szymański

arduino, buzzer, dźwięk, kursArduino2, mosfet, piezo, programowanie, syrena

Trwa ładowanie komentarzy...