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 :)