Зуммер (Trema-модуль)

Зуммер (Trema-модуль) - позволяет излучать звук, преобразовывая электрические сигналы в механические колебания воздуха.

Общие сведения:

Trema-зуммер основан на электромагнитном излучателе, который состоит из кольцевого магнита, сердечника с электромагнитной катушкой и гибкой металлической мембраны. Электромагнитная катушка преобразует электрические колебания в магнитные, а мембрана преобразует магнитные колебания в механические. Полученные механические колебания распространяются по воздуху в виде звуковых волн. Пластиковый корпус, с отверстием, усиливает акустический эффект.

Спецификация:

  • Напряжение питания: 5 В
  • Потребляемый ток: до 30 мА
  • Интенсивность звука: >= 85 дБ
  • Резонансная частота: 2048 Гц
  • Сопротивление обмотки: 40 Ом
  • Рабочая температура: -20 ... 70 °C
  • Габариты: 30x30x9 (без учёта выводов)

Подключение:

Trema-зуммер входит в линейку Trema-модулей, что позволяет подключить его к Arduino через Trema Shield по 3-проводному шлейфу (который идёт в комплекте с зуммером) без пайки, без дополнительных проводов и переходников, его можно подключать к любому выводу Arduino, как цифровому, так и аналоговому.

Модуль имеет три вывода: Signal (S) - вход и два вывода питания Vcc (V) и GND (G).

Питание:

Входное напряжение питания 5 В постоянного тока, подаётся на выводы Vcc (V) и GND (G).

Работа с модулем:

Зуммер не имеет встроенного генератора, а преобразует электрический сигнал со входа (S) в механические колебания воздуха. Таким образом частота излучаемого звука соответствует частоте сигнала подаваемого на вход модуля. Чем выше частота, тем «тоньше» звук. Чем ближе частота к резонансной, тем звук сильнее.

Самый простой способ получения звука заключается в применении функции tone(). Данная функция генерирует меандр (сигнал прямоугольной формы с равной длительностью импульсов и пауз), с заданной частотой и длительностью.

Примеры:

Вывод двух коротких звуковых сигнала функцией tone(), сигнализирующих о включении Arduino:
const uint8_t pinBF = 2;                         // Определяем номер вывода к которому подключён зуммер
                                                 //
void setup(){                                    //
    tone(pinBF, 2048, 100);                      // Выводим звуковой сигнал с частотой 2048 Гц и длительностью 0,1 сек
    delay(200);                                  // Не выводим звук в течении 0,1 сек (см. ниже)
    tone(pinBF, 2048, 100);                      // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц
}                                                //
void loop(){}                                    // Функция loop в данном примере не используется

Обратите внимание на то, что в примере, между двумя вызовами функции tone() устанавливается задержка на 0,2 секунды, а в комментарии написано «не выводим звук в течении 0,1 сек». Дело в том, что функция tone() выводит сигнал используя прерывания аппаратного таймера и не приостанавливает выполнение скетча на время вывода сигнала. Значит сразу после начала вывода первого звукового сигнала, стартует функция delay(), приостанавливая выполнение скетча на 0,2 сек. но звук продолжает выводиться. Значит первые 0,1 сек - выводится сигнал, следующие 0,1 сек - тишина и последние 0,1 - опять выводится сигнал.

Может возникнуть ситуация, когда использование функции tone() невозможно, например, если аппаратный таймер используется для других целей. Тогда сигнал придётся генерировать самим, используя функцию digitalWrite():

Тот же пример, но без использования функции tone():
void myTone(uint8_t, uint32_t, uint32_t);        // Определяем собственную функцию для генерации звука
const uint8_t pinBF = 2;                         // Определяем номер вывода к которому подключён зуммер
                                                 //
void setup(){                                    //
    myTone(pinBF, 2048, 100);                    // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц
    delay(100);                                  // Ждём 0,1 сек
    myTone(pinBF, 2048, 100);                    // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц
}                                                //
void loop(){}                                    // Функция loop в данном примере не используется
                                                 //
void myTone(uint8_t i, uint32_t j, uint32_t k){  // Определяем функцию myTone
  j=500000/j;                                    // Меняем значение переменной j на время одного полупериода в мкс
  k+=millis();                                   // Меняем значение переменной к на время завершения вывода сигнала
  pinMode(i, OUTPUT);                            // Конфигурируем вывод для вывода сигнала как выход
  while(k>millis()){                             // Выводим сигнал, пока не истечёт указанное время
    digitalWrite(i, HIGH); delayMicroseconds(j); // Устанавливаем на выходе i уровень логической  «1» на время j
    digitalWrite(i, LOW ); delayMicroseconds(j); // Устанавливаем на выходе i уровень логического «0» на время j
  }
}

Обратите внимание на то, что теперь задержка между первым и вторым вызовом функции myTone() соответствует паузе между сигналами в 0,1 сек, так как функция myTone() приостанавливает выполнение скетча на время вывода звукового сигнала.

Сама функция myTone() не сложна в понимании:

  • Сначала значение переменной j получившей частоту в Гц преобразуем в длительность одного полупериода в мкс.
    Период T = 1 / F (сек), значит полупериод L = 0,5 T (сек) = 0,5 / F (сек) = 500'000 / F (мкс).
  • Далее к переменной k получившей длительность импульса, добавляется время с начала старта скетча millis()
  • Конфигурируем вывод номер которого получила переменная i как выход
  • Чередуем на выводе i логические уровни, устанавливая их на длительность J
    пока время прошедшее с момента старта скетча millis() не сравняется со значением переменной k.

Применение:

  • Информирование о событиях
  • Вывод мелодий
  • Создание микровибраций

Ссылки:

Обсуждение

Присоединяйся

На главную