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 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.
Najczęściej buzzer z generatorem nie różni się wizualnie niczym od tego bez generatora.
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).
Masz już zestaw? Zarejestruj go wykorzystując dołączony do niego kod. Szczegóły »
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.
Buzzer bez generatora nie jest elementem biegunowym (możemy podłączyć go dowolnie). Dla zasady i własnego spokoju polecam jednak trzymać się przyjętych standardów i podłączać czarny przewód do masy.
Podłączenie układu do testu:
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:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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.
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:
C
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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.
Zdecydowanie lepiej użyć gotową funkcję, która wykorzystuje dedykowane układy wbudowane w mikrokontroler (konkretnie timery/liczniki).
Funkcja Tone
Z pomocą przychodzi bardzo prosta funkcja tone(), która przyjmuje 3 argumenty:
pin, na którym ma być wygenerowany sygnał,
częstotliwość tego sygnału,
czas trwania - parametr ten nie jest obowiązkowy.
W praktyce wykorzystanie tej funkcji wygląda następująco:
Arduino
1
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:
Arduino
1
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:
Arduino
1
2
3
4
5
6
7
8
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
tone(A5,1000);//Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5
}
voidloop(){
}
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ę:
Do generowania dźwięku funkcją tone() wykorzystywany jest licznik (timer) wbudowany w Arduino, który odpowiada również za generowanie sygnału PWM. W związku z tym używanie tej funkcji wpływa również na możliwość generowania PWM na wyjściach nr 3 oraz 11.
Aby zatrzymać raz uruchomione generowanie sygnału należy skorzystać z drugiej funkcji:
Arduino
1
noTone(A5);//Wyłącz generowanie sygnału na pinie A5
Proste pikanie można zrealizować więc następująco:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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:
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ść.
Jest to dobre ćwiczenie, aby zapamiętać jak działa taki buzzer!
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:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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ą:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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.
Zachęcam do dzielenia się w komentarzach
swoimi pomysłami na syrenę alarmową!
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:
Arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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 wstępie zaznaczam, że nie chodzi tutaj o sterowanie
wysokim napięciem sieciowym powyżej 200V.
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!
Przykładem praktycznym, gdzie przyda się taki tranzystor może być sterowanie oświetleniem. Taśmy LED najczęściej wymagają zasilania z 12V, a ich zapotrzebowanie na prąd może sięgać kilku amperów. Bezpośrednie sterowanie z Arduino, nie jest wtedy możliwe!
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:
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,
Teraz bardzo dokładnie sprawdzamy połączenia.
W przypadku pomyłki można uszkodzić całe Arduino.
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.
Następnie wgrywamy prosty program, który zmienia stan wyjścia:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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.
Gdy, wszystko jest poprawnie możemy podłączyć buzzer. Wpinamy go tak, jak jest to widoczne na poniższym schemacie:
Podłączenie buzzera.
Następnie wgrywamy program z naszą syreną alarmową:
Arduino
1
2
3
4
5
6
7
8
9
10
voidsetup(){
pinMode(A5,OUTPUT);//Konfiguracja A5 jako wyjście
}
voidloop(){
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.
Układ z dodanym rezystorem.
W praktyce układ wygląda ostatecznie następująco:
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.8 / 5. Głosów łącznie: 155
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ć!
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...