Obsługa pasywnego buzzera przez Arduino
Hej! Dziś poruszę temat dość prosty, ale mogący wielu początkującym napsuć nerw :) Chodzi o generowanie tonów w buzzerach. Jedne mają wbudowany generator i na nich sprawa jest prosta – ustawiamy stan wysoki i piszczy. Te drugie to buzzery pasywne, nie są one wyposażone w generator. Można powiedzieć, że są to małe głośniczki, więc podanie na nie stałego napięcia szybko by je uszkodziło. Dzisiaj dowiemy się w jaki sposób można nimi sterować.
Na początek nasuwa się pytanie po co w ogóle używać pasywnych buzzerów, skoro ich obsługa zajmuje więcej zachodu i zasobów? Przecież równie dobrze możemy podłączyć gotowy buzzer z generatorem i jedyne czym się martwić to zmiana stanu wysoki / niski.
Jest to słuszne założenie pod warunkiem, że jedyne co nam potrzebne to dwa stany: piszczenie oraz brak piszczenia. Problem pojawia się kiedy chcemy wygenerować jakąś melodię lub po prostu emitować sygnały dźwiękowe o różnej częstotliwości w zależności od ustalonych przez nas warunków.
One function to rule them all
Na szczęście twórcy Arduino zrobili za nas dużo dobrej roboty i udostępnili funkcję, która generuje dla nas sygnał prostokątny o wypełnieniu 50% i zadanej przez nas częstotliwości.
Mowa o funkcji tone(). Przyjmuje ona 2 lub 3 parametry (trzeci jest opcjonalny). Pierwszy z nich to numer pinu, na którym ma być generowany ton, drugi to częstotliwość. Trzecim parametrem jest czas trwania dźwięku w milisekundach. Jeżeli go nie podamy dźwięk będzie generowany aż do wywołania przez nas metody noTone().
Nasz zestaw do testowania składa się z buzzera podłączonego do pinu 9 Arduino Uno poprzez rezystor 220 Ohm (jeżeli użyjemy tranzystora to rezystor ograniczający prąd nie będzie potrzebny) oraz potencjometru do sterowania częstotliwością podłączonego do pinu analogowego A0.
Spójrzmy na kod:
#define BUZZER 9 #define POT A0 void setup() { pinMode(BUZZER, OUTPUT); pinMode(POT, INPUT); } void loop() { int freq = map(analogRead(POT), 0, 1023, 50, 17000); tone(BUZZER, freq); }
Tak, to wszystko! Wystarczy użyć tylko tej jednej funkcji i już gra muzyka :)
Jak widać zakres częstotliwości, które będziemy mogli wygenerować używając powyższego kodu to 50 Hz – 17 kHz.
Nie ma nic za darmo
Niestety korzystanie z funkcji tone() niesie za sobą dwie przykre niespodzianki. Jedną z nich jest fakt, że na płytkach innych niż Arduino Mega używa ona tego samego timera, który jest wykorzystywany do sterowania kanałami PWM na pinach 3 oraz 11 i z tego też powodu ich jednoczesne działanie może zostać zaburzone.
Kolejną wadą jest fakt, że w danej chwili możemy grać wyłącznie jeden ton na jednym pinie (przez to, że mamy do dyspozycji tylko jeden timer).
Protip: Jeżeli ustawicie częstotliwość na 50 Hz to uzyskacie symulator stacji transformatorowej lub zestawu audio w którym wyschły kondensatory :)