В микропроцессорных системах иногда не бывает лишним «озвучить» течение каких-либо процессов в системе. Это может быть звуковая индикация нажатия кнопки, сигнал об окончании какого-то измерения и многое другое. В качестве «звукового излучателя» может быть использовано все что угодно, но удобнее воспользоваться звуковыми излучателями, используемыми в компьютерных материнских платах. Возьмем, к примеру, легко выпаевыемый из неисправной «мамы» магнитный «преобразователь» (так Яндекс перевел) KC-1206
Рабочее напряжение «динамика» 4..8В, максимальный ток 50 мА, сопротивление 40 Ом, максимум излучения приходится на частоте 2400 Гц (на частотах ниже 2 КГц и выше 4 КГц звуковое давление падает более чем в 10 раз).
Для использования «пищалки» надо решить две задачи: приделать ее к контроллеру электрически и программно заставить звучать.
С одной строны, рабочее напряжение вполне удовлетворяет питанию Arduino (5V). Но, с другой стороны, при подаче такого напряжения, ток превысит 100 мА — что не очень согласуется с выходным током портов микроконтроллера и превышает допустимые 50 мА для излучателя. Ниже приведены варианты включения KC-1206.
Простейшая схема подключения KC-1206 (HB1) показана на рисунке 1. Для комфортной работы микроконтроллера (выходной ток линии pinX = 20 мА), расчетное значение резистора R1 составляет 200 Ом. При этом напряжение на излучателе не превышает одного вольта. В итоге звук будет негромким. Можно попытаться уменьшить номинал резистора для увеличения громкости, но в этом случае сработает защита контроллера по выходному току.
В схеме на рисунке 2 мы не ограничены выходным током линий контроллера и можем обеспечить максимальный ток через динамик при сопротивлении R2 50..60 Ом. Номинал резистора R1 может быть в диапазоне 5..10 КОм. N-P-N транзистор — любой с током коллектора более 50 мА.
Схему на рисунке 3 я использовал с ATtiny при напряжении питания 3 В. Сигнал на линиях pinX и pinY противофазный. Ничего: пищало довольно громко, особенно, когда бумажку закрывающую отверстие излучателя оторвал :).
На «динамике» зачем то указана полярность. Видимо, при таком включении можно получить максимальную громкость. На практике, работает при любом включении.
Программно сгенерировать 2,4КГц на цифровом выходе Arduino несложно — в качестве основы можно использовать обычный Blink. Пример скетча ниже:
int outPin = 8; // цифровой порт вход/выхода 8 void setup() { pinMode(outPin, OUTPUT); // устанавливается режим порта - выход digitalWrite(outPin, LOW); // устанавливаем LOW на выходе } void loop() { // буква "С" (три точки) в азбуке Морзе Beep(); // звуковой сигнал 0,4 сек delay(500); // пауза пол-секунды Beep(); // звуковой сигнал 0,4 сек delay(500); // пауза пол-секунды Beep(); // звуковой сигнал 0,4 сек delay(1000); // пауза секунда // буква "М" (два тире) в азбуке Морзе Beep(); // звуковой сигнал 0,4 сек Beep(); // звуковой сигнал 0,4 сек Beep(); // звуковой сигнал 0,4 сек delay(500); // пауза пол-секунды Beep(); // звуковой сигнал 0,4 сек Beep(); // звуковой сигнал 0,4 сек Beep(); // звуковой сигнал 0,4 сек delay(1000); // пауза секунда // буква "С" (три точки) в азбуке Морзе Beep(); // звуковой сигнал 0,4 сек delay(500); // пауза пол-секунды Beep(); // звуковой сигнал 0,4 сек delay(500); // пауза пол-секунды Beep(); // звуковой сигнал 0,4 сек delay(2000); // пауза 2 секунды } // процедура формирования сигнала 2,4КГц на 0,4 сек void Beep() { for (int i=0; i<1000; i++) { // циклов примерно на 0,4 сек digitalWrite(outPin, HIGH); // подаем HIGH на выход delayMicroseconds(208); // ожидаем полпериода от 2,4КГц digitalWrite(outPin, LOW); // устанавливаем LOW на выходе delayMicroseconds(208); // ожидаем полпериода от 2,4КГц } }
Программка передает азбукой Морзе текст «СМС». Для формирования звука используется функция delayMicroseconds(). Осциллограмма сигнала на pin8:
Вообще-то так писать программы для микроконтроллеров НЕ НАДО! Нужно было воспользоваться другими ресурсами AVR, например, прерываниями от таймера для генерации прямоугольника как это реализовано, например, в процедуре tone(). Но для примера — это подойдет…
If you get a warning that your sketch is too big for the Arduino board, delete some of the numbers from the end of the sample array.