Взаимодействие arduino с датчиком звука и управление устройствами с помощью хлопков

Содержание:

Питание плат Arduino

Перед рассмотрением способов снижения электроэнергии стоит отметить, что энергоэффективность устройства повышается с понижением питающего напряжения. Большинство плат Arduino поддерживают входное напряжение до 12В, при этом сам микроконтроллер питается напряжением 5В. Таким образом, учитывая, что в большинстве плат Arduino установлены линейные регуляторы напряжения, получается, что при питании платы напряжением больше 5В, значительная часть мощности будет рассеиваться в тепло.

Пример потребления электроэнергии платой Arduino Mini Pro:

Питающее напряжение, В Ток, мА Потребляемая мощность, мВт
9 42 378
5 22 110
3.3 8 26.4

На нашем сайте вы можете найти описание схем энергопитания для плат Arduino Uno, Nano, Mega и Leonardo.

В рамках данной темы мы рассмотрим 4 основных метода снижения энергопотребления:

  • использование режимов энергосбережения;
  • использование библиотеки Narcoleptic;
  • выключение компонентов микроконтроллера;
  • снижение тактовой частоты;

Примеры мелодий для зуммера

Для того, чтобы разнообразить работу с новым проектом, добавить в него «развлекательный» элемент, пользователи придумали задавать определённый набор частот звука, делая его созвучным некоторым знаменитым композициям из песен и кинофильмов. Разнообразные скетчи для таких мелодий можно найти в интернете. Приведем пример мелодии для пьезопищалки для одного из самых узнаваемых треков «nokia tune»из ставших легендарными мобильников Nokia. Файл pitches.h можно сделать самим, скопировав его содержимое так, как указано в этой статье на официальном сайте.

При написании собственных мелодий пригодится знание частот нот и длительностей интервалов, используемых в стандартной нотной записи.


Частота нот для пищалки Ардуино

Использование стороннего аналогового датчика давления

Редко, но все же случаются ситуации, когда по каким-либо причинам использовать в схеме специализированный сенсор, рассчитанный на работу конкретно с Ардуино, не получается. Скажем, его невозможно найти сразу в близлежащих магазинах электроники, а ждать посылку долго. Выходом могут стать датчики давления, применяемые в автомобильной электронике. Их тоже можно связать непосредственно с микроконтроллером.

Примером послужит WABCO 4410400130 — сенсор указанного плана, используемый на большегрузных фурах. Единственное, требующее внимания в представленной схеме — питание у элемента раздельно с Arduino. В последнем, просто нет требуемых для запуска датчика +24 В. В связи с чем и приходится использовать дополнительный блок энергообеспечения, с правильными и достаточными характеристиками питания — 8–32 V постоянного тока, при минимуме 400 mА мощности.

Что касается соединения сенсора напрямую к плате микроконтроллера — в нем на выходе не более 5 В. И чем больше давление, тем меньший ток будет поступать на аналоговые контакты логического устройства. Вот только, на всякий случай, рекомендуется проверить изначальный выход мультиметром, с целью контроля варианта «пробития» сенсора, с возникновением обстоятельств беспрепятственного связывания OUT с минусом или плюсом питающей детектор линии.

Пример скетча получения информации с аналогового датчика:

Теперь, что касается данных получаемых на выходе скетча. Нужно провести их градацию с использованием классического манометра, оценив какие цифры идут от сенсора при разном давлении и ввести соответствующую формулу в тело программы.

И в окончании, технические характеристики WABCO 4410400130, для сравнения с похожими датчиками Arduino:

  • Тип: пьезоэлемент
  • Питание: 8–32 V
  • Рабочая температура: −40..+80 °С
  • Диапазон измерения: от 0 до 10 bar
  • Точность: 0.2–0.3 %
  • Предельное давление разрушения: 16 bar

5Скетч «эквалайзера»

Немного модифицируем скетч. Добавим светодиоды и пороги их срабатывания.

const int micPin = A0;
const int gPin = 12;
const int yPin = 11;
const int rPin = 10;

void setup() {
    Serial.begin(9600); 
    pinMode(gPin, OUTPUT);
    pinMode(yPin, OUTPUT);
    pinMode(rPin, OUTPUT);
}

void loop() {  
    int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах
    Serial.println(mv); // выводим в порт
    /* Пороги срабатывания светодиодов настраиваются
       вами экспериментальным методом: */
    if (mv }

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

Полезный совет

Значения порогов, после которых загораются соответствующие светодиоды, зависят от чувствительности микрофона. На некоторых модулях чувствительность задаётся подстроечным резистором, на моём модуле его нет. Пороги получились 2100, 2125 и 2150 мВ. Вам для своего микрофона придётся определить их самим.

Датчик звука (микрофон) для Arduino

Состоит датчик из платы (смотри картинку ниже) на котором смонтированы порты подключения к Arduino Nano, усилитель звука, подстроечный резистор и электронный микрофон, чувствительный к звуку, приходящему во всех направлениях. Регулятором чувствительности (переменным резистором) можно настраивать чувствительность микрофона и выбирать от какого уровня шума будет срабатывать датчик.

Датчик звука Arduino для слежения за уровнем шума

Данная плата расширения для Arduino позволяет перевести звуковые колебания в цифровой сигнал. При колебании мембраны в микрофоне от звуковых волн, изменяется емкость его конденсатора, вследствие чего проявляется изменение напряжения на выходах датчика звука, соответствующее звуковому сигналу. Сенсор слева на картинке может отправлять цифровой и аналоговый сигнал.

Обзор аппаратного обеспечения

Звуковой датчик представляет собой небольшую плату, которая объединяет микрофон (50 Гц – 10 кГц) и схему обработки для преобразования звуковых волн в электрические сигналы.

Этот электрический сигнал подается на встроенный высокоточный компаратор LM393 для его оцифровки и выводится на выход (вывод OUT).

Рисунок 2 – Регулировка чувствительности датчика звука и компаратора

Для регулировки чувствительности выходного сигнала модуль содержит встроенный потенциометр.

С помощью этого потенциометра вы можете установить пороговое значение. Таким образом, когда амплитуда звука превысит это пороговое значение, модуль выдаст низкий логический уровень, в остальных случаях будет выдаваться высокий логический уровень.

Эта настройка очень полезна, когда вы хотите запустить какое-то действие при достижении определенного порога. Например, когда амплитуда звука пересекает пороговое значение (при обнаружении стука), вы можете активировать реле для управления освещением. Вот вам идея!

Совет: поворачивайте движок потенциометра против часовой стрелки, чтобы увеличить чувствительность, и по часовой стрелке, чтобы ее уменьшить.

Рисунок 3 – Светодиодные индикаторы питания и состояния

Помимо этого, модуль имеет два светодиода. Индикатор питания загорится, когда на модуль подается напряжение питания. Светодиод состояния загорится, когда на цифровом выходе будет низкий логический уровень.

Примеры мелодий для зуммера

Для того, чтобы разнообразить работу с новым проектом, добавить в него «развлекательный» элемент, пользователи придумали задавать определённый набор частот звука, делая его созвучным некоторым знаменитым композициям из песен и кинофильмов. Разнообразные скетчи для таких мелодий можно найти в интернете. Приведем пример мелодии для пьезопищалки для одного из самых узнаваемых треков «nokia tune»из ставших легендарными мобильников Nokia. Файл pitches.h можно сделать самим, скопировав его содержимое так, как указано в этой статье на официальном сайте.

Скетч

При написании собственных мелодий пригодится знание частот нот и длительностей интервалов, используемых в стандартной нотной записи.

Частота нот для пищалки Ардуино

Настройка JDY-31, AT команды

Рассмотрим также настройку самого JDY-31, делается это при помощи AT-команд:

  • Чтобы модуль отвечал на команды, он должен находиться в режиме ожидания подключения (светодиод мигает)
  • Загружаем в Arduino пустую программу (Файл/Новый). Либо любую другую, в которой не задействован Serial. Либо подключаем пин RST к GND, чтобы микроконтроллер не запустился и нам не мешал
  • Подключаем JDY-31 на RX TX Arduino (аппаратный Serial) наоборот: TX > TX, RX > RX
  • Открываем монитор порта, ставим текущую скорость модуля (по умолчанию 9600 бод), конец строки NL & CR

Отправляем команду . Если всё сделано правильно – модуль ответит +VERSION=JDY-31-V1.35,Bluetooth V3.0

Какие ещё есть команды? Полный список есть в документации, давайте разберём:

Команда Описание Ответ
Информация о версии +VERSION=JDY-31-V1.35,Bluetooth V3.0
Перезагрузить +OK
Отключиться +OK
Запрос MAC адреса +LADDR=5C7B00006378
Запрос текущей скорости порта. Код:

  • 4:9600
  • 5:19200
  • 6:38400
  • 7:57600
  • 8:115200
  • 9:128000
+BAUD=4
Установить скорость порта, где x – код (см. выше). Пример установки скорости 115200:

Примечание: после перезагрузки модуль будет работать с АТ командами на новой скорости!

+OK
Запрос текущего ПИН-кода +PIN=1234
Установка пина. Пример: +OK
Запрос текущего имени модуля +NAME=JDY-31-SPP
Установка имени модуля. Пример: +OK
Сброс настроек +OK

3Параллельные процессы без оператора «delay()»

Вариант, при котором Arduino будет выполнять задачи псевдо-параллельно, предложен разработчиками Ардуино. Суть метода в том, что при каждом повторении цикла loop() мы проверяем, настало ли время мигать светодиодом (выполнять фоновую задачу) или нет. И если настало, то инвертируем состояние светодиода. Это своеобразный вариант обхода оператора delay().

const int soundPin = 3;  // переменная с номером пина пьезоэлемента
const int ledPin = 13;  // переменная с номером пина светодиода
const long ledInterval = 200; // интервал мигания светодиодом, мсек.

int ledState = LOW;  // начальное состояние светодиода
unsigned long previousMillis = 0;  // храним время предыдущего срабатывания светодиода

void setup() {
    pinMode(soundPin, OUTPUT); // задаём пин 3 как выход.
    pinMode(ledPin, OUTPUT);   // задаём пин 13 как выход.
}

void loop() {
    // Управление звуком:
    tone(soundPin, 700); 
    delay(200);
    tone(soundPin, 500); 
    delay(200);
    tone(soundPin, 300);
    delay(200);
    tone(soundPin, 200);
    delay(200);
     
    // Мигание светодиодом:
    // время с момента включения Arduino, мсек:
    unsigned long currentMillis = millis(); 
    // Если время мигать пришло,
    if (currentMillis - previousMillis >= ledInterval) {
        previousMillis = currentMillis;  // то запоминаем текущее время
        if (ledState == LOW) {  // и инвертируем состояние светодиода
              ledState = HIGH;
        } else {
              ledState = LOW;
        }
        digitalWrite(ledPin, ledState); // переключаем состояние светодиода
    }
}

Существенным недостатком данного метода является то, что участок кода перед блоком управления светодиодом должен выполняться быстрее, чем интервал времени мигания светодиода «ledInterval». В противном случае мигание будет происходить реже, чем нужно, и эффекта параллельного выполнения задач мы не получим. В частности, в нашем скетче длительность изменения звука сирены составляет 200+200+200+200 = 800 мсек, а интервал мигания светодиодом мы задали 200 мсек. Но светодиод будет мигать с периодом 800 мсек, что в 4 раза больше того, что мы задали.

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

В данном случае нужно было бы для блока управления звуком сирены также проверять, пришло время или нет, а не использовать delay(). Но это бы увеличило количество кода и ухудшило читаемость программы.

Пример скетча для пьезодимнамика

Для “оживления” подключенного к плате ардуино зуммера потребуется программное обеспечение Arduino IDE, которое можно скачать на нашем сайте.

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

Пример скетча с функцией tone() и noTone()

//Пин, к которому подключен пьезодинамик.int piezoPin = 3; void setup() { }void loop() { /*Функция принимает три аргумента 1) Номер пина 2) Частоту в герцах, определяющую высоту звука 3) Длительность в миллисекундах. */ tone(piezoPin, 1000, 500); // Звук прекратится через 500 мс, о программа останавливаться не будет! /* Вариант без установленной длительности */ tone(piezoPin, 2000); // Запустили звучание delay(500); noTone(); // Остановили звучание}

Схема подключения для примера выглядит следующим образом:

Подключение пищалки к 3 пину Ардуино

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

Невозможно одновременно использовать ШИМ на пинах 3 и 11 (они используют одинаковый внутренний таймер), а также нельзя запустить одновременно две мелодии двумя командами tone() – в каждый момент времени будет исполняться только одна.Еще одно ограничение: нельзя извлечь звук частотой ниже 31 Гц. 

Вариант скетча для активного зуммера чрезвычайно прост. С помощью digitalWrite() мы выставляем значение 1 в порт, к которому подключена пищалка.

Вариант скетча для зуммера без tone()

Пример скетча для варианта без функции tone() представлен на изображении внизу. Этот код задает частоту включения звука один раз в две секунды.

Пример скетча

Для корректной работы устройства необходимо задать номер PIN, определить его как «выход». Функция analogWrite использует в качестве аргументов номер вывода и уровень, который изменяет свое значение от 0 до 255. Это все по причине того, что шим-выводы Arduino имеют ЦАП (цифроаналоговый преобразователь) 8-бит. Изменяя этот параметр, пользователь меняет громкость зуммера на небольшую величину. Для полного выключения следует пропитать в порте значение «0». Следует сказать, что используя функцию «analogwrite», пользователь не сможет изменять тональность звука. Для пьезоизлучателя будет определена частота 980 Гц. Это значение совпадает с частотой работы выводов с шим на платах Ардуино и аналогов.

1Схема подключения пьезоизлучателяк Arduino

Пьезоизлучатель, или пьезоэлектрический излучатель, или «пьезопищалка» – это электроакустическое устройство воспроизведения звука, использующие обратный пьезоэлектрический эффект. Принцип действия его основан на том, что под действием электрического поля возникает механическое движение мембраны, которое и вызывает слышимые нами звуковые волны. Обычно такие излучатели звука устанавливают в бытовую электронную аппаратуру в качестве звуковых сигнализаторов, в корпуса настольных персональных компьютеров, в телефоны, в игрушки, в громкоговорители и много куда ещё.

Пьезоизлучатель имеет 2 вывода, причём полярность имеет значение. Поэтому чёрный вывод подключаем к земле (GND), а красный – к любому цифровому пину с функцией ШИМ (PWM). В данном примере положительный вывод излучателя подключён к выводу «D3».

Схема подключения пьезоизлучателя к Arduino и схема, собранная на макетной плате

Описание и схема работы зуммера

Зуммер, пьезопищалка – все это названия одного устройства. Данные модули используются для звукового оповещения в тех устройствах и системах, для функционирования которых в обязательном порядке нужен звуковой сигнал. Широко распространены зуммеры в различной бытовой технике и игрушках, использующих электронные платы. Пьезопищалки преобразуют команды, основанные на двухбитной системе счисления 1 и 0, в звуковые сигналы.

Пьезоэлемент “пищалка”

Пьезопищалка конструктивно представлена металлической пластиной с нанесенным на нее напылением из токопроводящей керамики. Пластина и напыление выступают в роли контактов. Устройство полярно, имеет свои «+» и «-». Принцип действия зуммера основан на открытом братьями Кюри в конце девятнадцатого века пьезоэлектрическом эффекте. Согласно ему, при подаче электричества на зуммер он начинает деформироваться. При этом происходят удары о металлическую пластинку, которая и производит “шум” нужной частоты.

Устройство пьезодинамика пищалки

Нужно также помнить, что зуммер бывает двух видов: активный и пассивный. Принцип действия у них одинаков, но в активном нет возможности менять частоту звучания, хотя сам звук громче и подключение проще. Подробнее об этом чуть ниже.

Модуль пищалки для Ардуино

Если сравнивать с обыкновенными электромагнитными преобразователями звука, то пьезопищалка имеет более простую конструкцию, что делает ее использование экономически обоснованным. Частота получаемого звука задается пользователем в программном обеспечении (пример скетча представим ниже).

5Скетч «эквалайзера»

Немного модифицируем скетч. Добавим светодиоды и пороги их срабатывания.

const int micPin = A0;
const int gPin = 12;
const int yPin = 11;
const int rPin = 10;

void setup() {
    Serial.begin(9600); 
    pinMode(gPin, OUTPUT);
    pinMode(yPin, OUTPUT);
    pinMode(rPin, OUTPUT);
}

void loop() {  
    int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах
    Serial.println(mv); // выводим в порт
    /* Пороги срабатывания светодиодов настраиваются
       вами экспериментальным методом: */
    if (mv }

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

Полезный совет

Значения порогов, после которых загораются соответствующие светодиоды, зависят от чувствительности микрофона. На некоторых модулях чувствительность задаётся подстроечным резистором, на моём модуле его нет. Пороги получились 2100, 2125 и 2150 мВ. Вам для своего микрофона придётся определить их самим.

Arduino Code — Melody

#include «pitches.h»

const int BUTTON_PIN = 7;
const int BUZZER_PIN = 3;

int melody[] = {
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
NOTE_E5,
NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
NOTE_D5, NOTE_G5
};

int noteDurations[] = {
8, 8, 4,
8, 8, 4,
8, 8, 8, 8,
2,
8, 8, 8, 8,
8, 8, 8, 16, 16,
8, 8, 8, 8,
4, 4
};

void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
int buttonState = digitalRead(BUTTON_PIN);

if (buttonState == LOW) {
Serial.println(«The button is being pressed»);
buzzer();
}
}

void buzzer() {

int size = sizeof(noteDurations) / sizeof(int);

for (int thisNote = 0; thisNote < size; thisNote++) {

int noteDuration = 1000 / noteDurations;
tone(BUZZER_PIN, melody, noteDuration);

int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);

noTone(BUZZER_PIN);
}
}

Quick Steps

  • Copy the above code and open with Arduino IDE

  • Create the pitches.h file On Arduino IDE:

    • Either click on the button just below the serial monitor icon and choose «New Tab», or use Ctrl+Shift+N.

    • Give file’s name «pitches.h» and click «OK» button

    • Copy the below code and paste it to that file.

#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

  • Click Upload button on Arduino IDE to upload code to Arduino

  • Press the button

  • Listen to piezo buzzer’s melody

Примеры мелодий для зуммера

Для того, чтобы разнообразить работу с новым проектом, добавить в него «развлекательный» элемент, пользователи придумали задавать определённый набор частот звука, делая его созвучным некоторым знаменитым композициям из песен и кинофильмов. Разнообразные скетчи для таких мелодий можно найти в интернете. Приведем пример мелодии для пьезопищалки для одного из самых узнаваемых треков «nokia tune»из ставших легендарными мобильников Nokia. Файл pitches.h можно сделать самим, скопировав его содержимое так, как указано в этой статье на официальном сайте.

Скетч

При написании собственных мелодий пригодится знание частот нот и длительностей интервалов, используемых в стандартной нотной записи.

Частота нот для пищалки Ардуино

Пример скетча для пьезодимнамика

Для “оживления” подключенного к плате ардуино зуммера потребуется программное обеспечение Arduino IDE, которое можно скачать на нашем сайте.

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

Пример скетча с функцией tone() и noTone()

Схема подключения для примера выглядит следующим образом:

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

Вариант скетча для активного зуммера чрезвычайно прост. С помощью digitalWrite() мы выставляем значение 1 в порт, к которому подключена пищалка.

Вариант скетча для зуммера без tone()

Пример скетча для варианта без функции tone() представлен на изображении внизу. Этот код задает частоту включения звука один раз в две секунды.

Для корректной работы устройства необходимо задать номер PIN, определить его как «выход». Функция analogWrite использует в качестве аргументов номер вывода и уровень, который изменяет свое значение от 0 до 255. Это все по причине того, что шим-выводы Arduino имеют ЦАП (цифроаналоговый преобразователь) 8-бит. Изменяя этот параметр, пользователь меняет громкость зуммера на небольшую величину. Для полного выключения следует пропитать в порте значение «0». Следует сказать, что используя функцию «analogwrite», пользователь не сможет изменять тональность звука. Для пьезоизлучателя будет определена частота 980 Гц. Это значение совпадает с частотой работы выводов с шим на платах Ардуино и аналогов.

Заголовочный файл pitches.h

Теперь мы знаем как генерировать звуки с помощью функции tone(). Но как узнать какой вид тона будет генерироваться на каждой частоте? Для этой цели в Arduino есть специальная таблица нот, которая приравнивает каждую частоту к определенному типу музыкальной ноты. Эта таблица нот первоначально была написана Бреттом Хангманом (Brett Hagman), на чьих трудах и была основана работа функции tone(). Мы будем использовать эту таблицу нот чтобы проигрывать наши мелодии.

Приведенный участок кода записан в заголовочном файле pitches.h в форме zip файла. Вы должны скачать его и включить его в свой код программы как сделано в конце данной статьи. Либо этот код вы можете взять непосредственно из скачанного zip файла.

3 Извлекаем звук из пьезоизлучателяс помощью функции tone()

Но частоту звучания можно менять по-другому. Для этого извлечём звук из пьезоизлучателя посредством встроенной функции tone(). Пример простейшего скетча приведён на врезке.

int soundPin = 3; /* объявляем переменную с номером пина, 
  на который мы подключили пьезоэлемент */
void setup() {
    pinMode(soundPin, OUTPUT); //объявляем пин 3 как выход.
    Serial.begin(9600); // будем выводить в порт текущую частоту
}

void loop() {
    for (int i=20; i

Функция tone() принимает в качестве аргументов номер вывода Arduino и звуковую частоту. Нижний предел частоты – 31 Гц, верхний предел ограничен параметрами пьезоизлучателя и человеческого слуха. Чтобы выключить звук, посылаем в порт команду noTone().

А вот так будет выглядеть временная диаграмма сигнала, который генерирует функция tone(). Видно, что каждые 100 мс частота увеличивается, что мы и слышим:

Временная диаграмма сигнала функции tone()

Как видите, с помощью пьезоизлучателя из Ардуино можно извлекать звуки. Можно даже написать несложную музыкальную композицию, задав ноты соответствующими частотами, а также определив длительность звучания каждой ноты посредством функции delay().

Обратите внимание, что если к Ардуино подключены несколько пьезоизлучателей, то единовременно будет работать только один. Чтобы включить излучатель на другом выводе, нужно прервать звук на текущем, вызвав функцию noTone()

Важный момент: функция tone() накладывается на ШИМ сигнал на «3» и «11» выводах Arduino. Т.е., вызванная, например, для пина «5», функция tone() может мешать работе выводов «3» и «11». Имейте это в виду, когда будете проектировать свои устройства.

Примеры мелодий для зуммера

Для того, чтобы разнообразить работу с новым проектом, добавить в него «развлекательный» элемент, пользователи придумали задавать определённый набор частот звука, делая его созвучным некоторым знаменитым композициям из песен и кинофильмов. Разнообразные скетчи для таких мелодий можно найти в интернете. Приведем пример мелодии для пьезопищалки для одного из самых узнаваемых треков «nokia tune»из ставших легендарными мобильников Nokia. Файл pitches.h можно сделать самим, скопировав его содержимое так, как указано в этой статье на официальном сайте.

При написании собственных мелодий пригодится знание частот нот и длительностей интервалов, используемых в стандартной нотной записи.

Схема подключения KY-006 к Arduino.

Подключите сигнал (S) к контакту 8 на Arduino, а землю (-) к GND. Средний контакт на модуле не используется.

Пример кода (скетч) для «KY-006» и Arduino.

Следующий скетч Arduino будет генерировать два разных тона, путем включения и выключения зуммера KY-006 на разных частотах, с использованием задержки.

// Демонстрация роботы модуля KY-006 
// https://arduino-tex.ru/ 
// Номер пина на плате к которому  
// будет подключен пассивного пьезоизлучателя  
int PinBuzzer = 8;

void setup ()
  {
    //Настройка вывода платы в режим "Выход"
    pinMode (PinBuzzer, OUTPUT);
  }
void loop ()
  {
    // Выдаем звук: Тембр 1
 for(int i = 0; i <100; i++)
      {
        // Выдать звук 
        digitalWrite(PinBuzzer, HIGH);
        delay(1);
        
        // Пауза
        digitalWrite(PinBuzzer, LOW);
        delay(1);
      }
    
    // Выдаем звук: Тембр 2
    for(int i = 0; i <100; i++)
      {
        // Выдать звук
        digitalWrite(PinBuzzer, HIGH);
        delay(2);
        
        // Пауза
        digitalWrite(PinBuzzer, LOW);
        delay(2);
      }
  }

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

Описание функции tone().

Функция генерирует, на выводе, прямоугольный сигнал заданной частоты (с коэффициентом заполнения 50%). Функция также позволяет задавать длительность сигнала. Однако, если длительность сигнала не указана, то он будет генерироваться до тех пор, пока не будет вызвана функция noTone(). Для воспроизведения звука вывод можно подключить к зуммеру или динамику.

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

Использование функции tone() может влиять на ШИМ-сигнал на выводах 3 и 11 (на всех платах, кроме Mega).

ПРИМЕЧАНИЕ: для воспроизведения разных звуков на нескольких выводах, необходимо сперва вызвать noTone() на одном выводе, и только после этого использовать функцию tone() на следующем.

Плюсы и минусы функции tone() рассмотрели, пришло время написать код генерирования сигнала.

// Демонстрация роботы модуля KY-006 
// https://arduino-tex.ru/ 
// Номер пина на плате к которому  
// будет подключен пассивного пьезоизлучателя  
int PinBuzzer = 8;

void setup ()
  {
    //Настройка вывода платы в режим "Выход"
    pinMode (PinBuzzer, OUTPUT);
    tone(PinBuzzer, 1500); // включаем звук частотой 1500 Гц
      delay(200);
      tone(PinBuzzer, 1000); // включаем звук частотой 1000 Гц
      delay(200);
      tone(PinBuzzer, 500); // включаем звук частотой 500 Гц
      delay(200);

    noTone(PinBuzzer); // выключаем звук
    delay(2000);
  }
void loop ()
  { 
      tone(PinBuzzer, 1500); // включаем звук частотой 100 Гц
      delay(200);
      tone(PinBuzzer, 1000); // включаем звук частотой 100 Гц
      delay(200);
      tone(PinBuzzer, 500); // включаем звук частотой 100 Гц
      delay(200);
      noTone(PinBuzzer); // выключаем звук
      delay(2000);
  }

Код можно написать так, чтобы звуковой сигнал подавался, когда устройство включилось и готово к работе, для этого код прописываем в блоке setup ().

    tone(PinBuzzer, 1500); // включаем звук частотой 1500 Гц
      delay(200);
      tone(PinBuzzer, 1000); // включаем звук частотой 1000 Гц
      delay(200);
      tone(PinBuzzer, 500); // включаем звук частотой 500 Гц
      delay(200);

    noTone(PinBuzzer); // выключаем звук

Если нам нужно, чтобы звуковой сигнал воспроизводился постоянно, то добавляем код в основной цикл loop (). Также можно добавить тактовую кнопку, или другой алгоритм, и включать звуковой сигнал в определённый момент. Например, при получении данных с датчика температуры, и при повышении заданного значения подавать звуковой сигнал.

Как видим, код получается достаточно простой, и объяснять каждую строчку не вижу смысла.

В своих проектах пассивный звуковой излучатель использовал в проекте, который собирал вместе с сыном: «Часы-будильник на Arduino». Корпус сделан из конструктора LEGO.

Описание всех датчиков из набора «37 in 1 Sensors Kit for Arduino» вы можете посмотреть на странице описания данного набора модулей для Arduino.

Понравился Урок KY-006 модуль с пассивным звуковым излучателем? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу , в группу на .

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Скачивая материал, я соглашаюсь с
Правилами скачивания и использования материалов.

Пример кода (скетч) для KY-006 и Arduino..ino 2 Kb 61 Скачать

Подробнее о модулях:

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

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

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

Trema-модуль зуммер активный состоит из 5В генератора прямоугольных импульсов (меандра) с частотой 2,3 кГц, и электромагнитного излучателя в одном корпусе. Сигнал с генератора подается на электромагнитный излучатель и преобразуется в звуковые волны той же частоты.

Trema-модуль зуммер активный уже имеет встроенный генератор и для генерации звука ему не требуется использование функции beep() и ей аналогичных (как для простого Trema-зуммера). Достаточно установить состояние логической «1» на выводе «S» и Вы услышите сигнал с частотой 2,3 кГц и уровнем звукового давления не ниже 85дБ/10см.

1 Схема подключения пьезоизлучателя к Arduino

Пьезоизлучатель, или пьезоэлектрический излучатель, или «пьезопищалка» — это электроакустическое устройство воспроизведения звука, использующие обратный пьезоэлектрический эффект
. Принцип действия его основан на том, что под действием электрического поля возникает механическое движение мембраны, которое и вызывает слышимые нами звуковые волны. Обычно такие излучатели звука устанавливают в бытовую электронную аппаратуру в качестве звуковых сигнализаторов, в корпуса настольных персональных компьютеров, в телефоны, в игрушки, в громкоговорители и много куда ещё.

Пьезоизлучатель имеет 2 вывода, причём полярность имеет значение. Поэтому чёрный вывод подключаем к земле (GND), а красный — к любому цифровому пину с функцией ШИМ (PWM). В данном примере положительный вывод излучателя подключён к выводу «D3».

Схема подключения пьезоизлучателя к Arduino и схема, собранная на макетной плате

SoftwareSerial

В качестве примера подключим модуль по второй схеме (на пины D2 и D3) и загрузим простую программу, которая будет пересылать данные с программного Serial (на пинах D2 и D3, Bluetooth) на аппаратный (который мы можем смотреть через монитор порта в Arduino IDE):

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); // RX, TX

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Откроем терминал и монитор порта и можем общаться с компьютером, Arduino выступает в роли посредника и перекидывает данные с Bluetooth на USB и наоборот:

Точно так же можно использовать SoftwareSerial для программ и приложений, если аппаратный UART на Arduino нужен для других целей.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector