Звук из Arduino

В микропроцессорных системах иногда не бывает лишним «озвучить» течение каких-либо процессов в системе. Это может быть звуковая индикация нажатия кнопки, сигнал об окончании какого-то измерения и многое другое. В качестве «звукового излучателя» может быть использовано все что угодно, но удобнее воспользоваться звуковыми излучателями, используемыми в компьютерных материнских платах. Возьмем, к примеру, легко выпаевыемый из неисправной «мамы» магнитный «преобразователь» (так Яндекс перевел) KC-1206pict_kc1206

Рабочее напряжение  «динамика» 4..8В, максимальный ток 50 мА, сопротивление 40 Ом, максимум излучения приходится на частоте 2400 Гц (на частотах ниже 2 КГц и выше 4 КГц звуковое давление падает более чем в 10 раз). 

Для использования «пищалки» надо решить две задачи: приделать ее к контроллеру электрически и программно заставить звучать.

С одной строны, рабочее напряжение вполне удовлетворяет питанию Arduino (5V). Но, с другой стороны, при подаче такого напряжения, ток превысит 100 мА — что не очень согласуется с выходным током портов микроконтроллера и превышает допустимые 50 мА для излучателя. Ниже приведены варианты включения KC-1206.kc_cxema

Простейшая схема подключения 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:osc_kc

Вообще-то так писать программы для микроконтроллеров НЕ НАДО! Нужно было воспользоваться другими ресурсами AVR, например, прерываниями от таймера для генерации прямоугольника как это реализовано, например, в процедуре tone(). Но для примера — это подойдет…

Звук из Arduino: 1 комментарий

Добавить комментарий