Arduino
Генерировать звуки с помощью Ардуино можно разными способами. Самый простой из них – подключить к плате пьезоизлучатель (или, как его ещё называют, «пьезопищалку»). Но как всегда, есть тут свои нюансы. В общем, давайте подключим к Arduino пьезопищалку и будем разбираться.
Нам понадобится:
- Arduino (или совместимая плата);
- компьютер с Arduino IDE;
- пьезоизлучатель (пьезопищалка), приобрести можно здесь или здесь;
- соединительные провода;
- макетная плата.
1Схема подключения пьезоизлучателяк Arduino
Пьезоизлучатель, или пьезоэлектрический излучатель, или «пьезопищалка» – это электроакустическое устройство воспроизведения звука, использующие обратный пьезоэлектрический эффект. Принцип действия его основан на том, что под действием электрического поля возникает механическое движение мембраны, которое и вызывает слышимые нами звуковые волны. Обычно такие излучатели звука устанавливают в бытовую электронную аппаратуру в качестве звуковых сигнализаторов, в корпуса настольных персональных компьютеров, в телефоны, в игрушки, в громкоговорители и много куда ещё.
Пьезоизлучатель имеет 2 вывода, причём полярность имеет значение. Поэтому чёрный вывод подключаем к земле (GND), а красный – к любому цифровому пину с функцией ШИМ (PWM). В данном примере положительный вывод излучателя подключён к выводу «D3».
2Извлекаем звук из пьезоизлучателяс помощью функции analogWrite()
Пьезопищалку можно задействовать разными способами. Самый простой из них – это использовать функцию analogWrite(). Пример скетча – во врезке. Данный скетч попеременно включает и выключает звук с частотой 1 раз в 2 секунды.
Задаём номер пина, определяем его как выход. Функция analogWrite() принимает в качестве аргументов номер вывода и уровень, который может быть от 0 до 255, т.к. ШИМ-выводы Ардуино имеют 8-битный ЦАП. Это значение будет изменять громкость пьезопищалки в небольших пределах. Чтобы выключить пьезопищалку, нужно послать в порт значение «0».
Используя функцию analogWrite(), нельзя изменять тональность звука, к сожалению. Пьезоизлучатель всегда будет звучать на частоте примерно 980 Гц, что соответствует частоте работы выводов с широтно-импульсной модуляцией сигнала (ШИМ) на платах Arduino UNO и подобных.
3Извлекаем звук из пьезоизлучателяс помощью функции tone()
Но частоту звучания можно менять по-другому. Для этого извлечём звук из пьезоизлучателя посредством встроенной функции tone(). Пример простейшего скетча приведён на врезке.
Функция tone() принимает в качестве аргументов номер вывода Arduino и звуковую частоту. Нижний предел частоты – 31 Гц, верхний предел ограничен параметрами пьезоизлучателя и человеческого слуха. Чтобы выключить звук, посылаем в порт команду noTone().
А вот так будет выглядеть временная диаграмма сигнала, который генерирует функция tone(). Видно, что каждые 100 мс частота увеличивается, что мы и слышим:
Как видите, с помощью пьезоизлучателя из Ардуино можно извлекать звуки. Можно даже написать несложную музыкальную композицию, задав ноты соответствующими частотами, а также определив длительность звучания каждой ноты посредством функции delay().
Обратите внимание, что если к Ардуино подключены несколько пьезоизлучателей, то единовременно будет работать только один. Чтобы включить излучатель на другом выводе, нужно прервать звук на текущем, вызвав функцию noTone().
Важный момент: функция tone() накладывается на ШИМ сигнал на «3» и «11» выводах Arduino. Т.е., вызванная, например, для пина «5», функция tone() может мешать работе выводов «3» и «11». Имейте это в виду, когда будете проектировать свои устройства.
Последнее изменениеСреда, 16 Январь 2019 20:37 Прочитано 36368 раз
Пищалка на Ардуино, которую часто еще называют зуммером, пьезодинамиком или даже баззером – частый гость в DIY проектах. Этот простой электронный компонент достаточно легко подключается к платам Arduino, поэтому вы можете быстро заставить вашу схему издавать нужные звуки – сигнализировать, пищать или вполне сносно проигрывать мелодию. В данной статье расскажем про отличие активных и пассивных зуммеров, разберем схему подключения пьезоэлемента к плате Ардуино и покажем пример скетча для управления пищалкой. А еще вы найдете пример мелодии, которыми cможете снабдить свой проект.
Описание и схема работы зуммера
Зуммер, пьезопищалка – все это названия одного устройства. Данные модули используются для звукового оповещения в тех устройствах и системах, для функционирования которых в обязательном порядке нужен звуковой сигнал. Широко распространены зуммеры в различной бытовой технике и игрушках, использующих электронные платы. Пьезопищалки преобразуют команды, основанные на двухбитной системе счисления 1 и 0, в звуковые сигналы.
Пьезопищалка конструктивно представлена металлической пластиной с нанесенным на нее напылением из токопроводящей керамики. Пластина и напыление выступают в роли контактов. Устройство полярно, имеет свои «+» и «-». Принцип действия зуммера основан на открытом братьями Кюри в конце девятнадцатого века пьезоэлектрическом эффекте. Согласно ему, при подаче электричества на зуммер он начинает деформироваться. При этом происходят удары о металлическую пластинку, которая и производит “шум” нужной частоты.
Нужно также помнить, что зуммер бывает двух видов: активный и пассивный. Принцип действия у них одинаков, но в активном нет возможности менять частоту звучания, хотя сам звук громче и подключение проще. Подробнее об этом чуть ниже.
Конструктивно модуль исполняется в самых разных вариантах. Самый рекомендуемый для подключения к ардуино – готовый модуль со встроенной обвязкой. Такие модули можно без особого труда купить в интернет-магазинах.
Если сравнивать с обыкновенными электромагнитными преобразователями звука, то пьезопищалка имеет более простую конструкцию, что делает ее использование экономически обоснованным. Частота получаемого звука задается пользователем в программном обеспечении (пример скетча представим ниже).
Где купить пищалку Ардуино
Наш традиционный обзор предложений на Aliexpress
Модуль пьезодинамика с необходимой обвязкой для работы с Ардуино | Громкий пьезодинамик – пищалка 3-24 Вольт, подходит для Ардуино | Простейшие пассивные пьезоизлучатели 12MM*8.5MM 3-12В, набор 5 штук |
Модуль пьезодинамика с необходимой обвязкой для работы с Ардуино | Пищалки с разъемами для подключения к материнской плате компьютера | Набор из 10 активных спикеров – пьезопищалок |
Отличия активного и пассивного зуммера
Главное отличие активного зуммера от пассивного заключается в том, что активный зуммер генерирует звук самостоятельно. Для этого пользователь должен просто включить или выключить его, другими словами, подав напряжение на контакты или обесточив. Пассивный зуммер же требует источника сигнала, который задаст параметры звукового сигнала. В качестве такого источника может выступать плата Ардуино. Активный зуммер будет выдавать более громкий звуковой сигнал в сравнении с его конкурентом. Частота излучаемого звука активного зуммера составляет значения 2,5 кГц +/- 300Гц. Напряжение питания для пищалки варьируется от 3,5 до 5 В.
Активный пьезоизлучатель предпочтительней еще из-за того, что в скетче не потребуется создавать дополнительный фрагмент кода с задержкой, влияющий на рабочий процесс. Также для определения того, что за элемент находится перед пользователем, можно измерить сопротивление между двумя проводами. Более высокие значения будут указывать на активный зуммер ардуино.
По своей геометрической форме пищалки никак не различаются, и отнести элемент к тому или иному виду по данной характеристике не представляется возможным. Визуально зуммер можно идентифицировать, как активный, если на плате присутствуют резистор и усилитель. В пассивном зуммере в наличии только маленький пьезоэлемент на плате.
Подключения зуммера к Arduino
Подключение модуля пьезоэлемента к Ардуино выглядит достаточно простым. Потребляемый ток маленький, поэтому можно просто напрямую соединить с нужным пином.
Электрическая схема подключения пьезоэлемента без сопровождающих модулей выглядит следующим образом.
На некоторых вариантах корпусов зуммера можно найти отверстие для фиксации платы при помощи винта.
Зуммер arduino имеет два выхода. Следует обратить внимание на их полярность. Темный провод должен быть подключен к «земле», красный – к цифровому пину с PWM. Один вывод настраивается в программе как «вход». Arduino отслеживает колебания напряжения на выводе, на который подаётся напряжение с кнопки, резистора и датчиков.
Напряжение на «вход» подается различное по значениям, система четко фиксирует только два состояния – вышеупомянутые 1 и 0 (логические ноль и единица). К логической единице будет относиться напряжение 2,3-5 В. Режим «выход» – это когда Arduino подает на вывод логический ноль/единицу. Если брать режим логического нуля, тут величина напряжения настолько мала, что ее не хватает для зажигания светодиода.
Обратите внимание, что входы довольно чувствительны к внешним помехам разного рода, поэтому ножку пьезопищалки через резистор следует подключать к выводу. Это даст высокий уровень напряжения на ножке.
Пример скетча для пьезодимнамика
Для “оживления” подключенного к плате ардуино зуммера потребуется программное обеспечение 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(); // Остановили звучание }
Схема подключения для примера выглядит следующим образом:
Когда вы используете функцию tone(), то возникают следующие ограничения.
Невозможно одновременно использовать ШИМ на пинах 3 и 11 (они используют одинаковый внутренний таймер), а также нельзя запустить одновременно две мелодии двумя командами tone() – в каждый момент времени будет исполняться только одна.Еще одно ограничение: нельзя извлечь звук частотой ниже 31 Гц.
Вариант скетча для активного зуммера чрезвычайно прост. С помощью digitalWrite() мы выставляем значение 1 в порт, к которому подключена пищалка.
Вариант скетча для зуммера без tone()
Пример скетча для варианта без функции tone() представлен на изображении внизу. Этот код задает частоту включения звука один раз в две секунды.
Для корректной работы устройства необходимо задать номер PIN, определить его как «выход». Функция analogWrite использует в качестве аргументов номер вывода и уровень, который изменяет свое значение от 0 до 255. Это все по причине того, что шим-выводы Arduino имеют ЦАП (цифроаналоговый преобразователь) 8-бит. Изменяя этот параметр, пользователь меняет громкость зуммера на небольшую величину. Для полного выключения следует пропитать в порте значение «0». Следует сказать, что используя функцию «analogwrite», пользователь не сможет изменять тональность звука. Для пьезоизлучателя будет определена частота 980 Гц. Это значение совпадает с частотой работы выводов с шим на платах Ардуино и аналогов.
Примеры мелодий для зуммера
Для того, чтобы разнообразить работу с новым проектом, добавить в него «развлекательный» элемент, пользователи придумали задавать определённый набор частот звука, делая его созвучным некоторым знаменитым композициям из песен и кинофильмов. Разнообразные скетчи для таких мелодий можно найти в интернете. Приведем пример мелодии для пьезопищалки для одного из самых узнаваемых треков «nokia tune»из ставших легендарными мобильников Nokia. Файл pitches.h можно сделать самим, скопировав его содержимое так, как указано в этой статье на официальном сайте.
При написании собственных мелодий пригодится знание частот нот и длительностей интервалов, используемых в стандартной нотной записи.
Заключение
В этой статье мы рассмотрели вопросы использования пищалки в проектах Arduino: разобрались с пассивным и активным зуммерами, осветили некоторые теоретические вопросы по строению пьезоэлемента. Узнали, как подключить пьезопищалку к ардуино и как запрограммировать скетч для работы с активными, пассивными модулями. Как видно, ничего особенно сложного в работе с зуммерами нет и вы сможете легко включить аудио возможности в свой проект. Причем помимо обычных гудков вы можете создавать целые музыкальные произведения.
Надеемся, что статья будет вам полезной. Если же вы хотите узнать, как работать с более качественным звуком, то приглашаем прочитать статью про MP3 и WAV аудио и музыку в ардуино.
Do It Yourself
Будет достаточно проще пользоваться устройством, если мы реализуем звуковое сопровождение, подключим зуммер к нашей плате. У нас немного поменялось расположение элементов, поэтому обновим несколько директив #define, а конкретно зуммер подключим к ШИМ выходу arduino. (Полный код, как обычно будет в конце статьи)
#define buzzer 11 // Контакт динамика
В результате, схема подключения зуммера будет выглядеть так
Почему мы выбрали ШИМ выход? Если на динамик подать 5в, он один раз пикнет и всё, вернее это даже слышно не будет практически. Звук – это аналоговый сигнал, а ШИМ выход без лишней головной боли, сможет имитировать поток импульсов
Для активации ШИМ сигнала, мы можем использовать команду analogWrite( выход , значение); , где всего два аргумента – первый это номер выхода, а второй значение от 0 до 255, которое влияет на степень скважности в ШИМ – сигнале. Я поэкспериментировал, и нашёл оптимальное значение скважности 20, для нормального тона динамика. Соответственно, скважность 0 – полностью выключить звук.
analogWrite(buzzer, 20); // Включаем звук на ШИМ выходе analogWrite(buzzer, 0); // Выключаем звук на ШИМ выходе
Нужно помнить, что мы не должны использовать delay, в момент создания звуковых эффектов, значит опять будем привязываться к переменной времени контроллера millis().
Попробуем изобразить код на диаграмме. По нажатию кнопки, будем активировать динамик – а потом, при некоторых условиях отключать его, или делать циклы.
Введём флаг ошибки, который будем применять, при нажатии кнопки сброса, неправильном вводе пароля и простое 3 секунды, когда пользователь вдруг перестал вводить пароль
bool keyError; // Флаг ошибки пароля
Также введём переменную, которую будем сравнивать с временем контроллера millis().
uint32_t beep; // Переменная времени задержки зуммера после нажатия кнопки или действия
В цикле loop() у нас будут постоянно проверяться все наши функции.
key_beep_off(); // Выключение звука зуммера key_beep_ok(); // Звук зуммера при отрытии замка key_beep_error(); // Звук ошибки зуммера
В цикле обработки клавиши key_scan (), если было зафиксировано нажатие, то запустим звуковой сигнал, и сбросим переменную времени.
beep = millis(); // Приравниваем переменную времени зуммера к времени контроллера analogWrite(buzzer, 20);
Если это просто нажатая клавиша, без действия, то нам нужен очень кратковременный звук. Как нам узнать, что нажатие не привело к действию? Мы проверим статус закрытого замка, и переменную времени в течении 150мс. Если статус замка закрыт, то через 150мс, звук отключаем. Так мы получим непродолжительный звук, при нажатии любой кнопки.
void key_beep_off() // Выключаем пищалку, если замок остался закрытым, через 150мс { if (millis() - beep > 150 && lockType == 1 && digitalRead(lock) == LOW || millis() - beep > 200 && lockType == 0 && digitalRead(lock) == HIGH) { analogWrite(buzzer, 0); // Выключаем звук на ШИМ выходе } }
Теперь звук ошибки. Предлагаю для понимания сделать два коротких сигнала, обычно этот звук понятен пользователю. Здесь всё очень просто. Нам нужно использовать флаг ошибки keyError. Пока его значение равно 1, мы будем выполнять условия с временным промежутком в 150мс, а в конце просто сбросим его. Просто делаем 3 if, в каждом из котором делаем привязку ко времени. 1)Включаем динамик – > 2) отключаем – > 3) включаем. Потом снимаем флаг keyError == 0.
void key_beep_error() // Функция ошибки клавиатуры - двойной писк { if (keyError == 1) { if (millis() - beep > 0 && millis() - beep < 150) // Интервал времени от 0 до 150мс - звук есть { analogWrite(buzzer, 20); // Включаем звук на ШИМ выходе } if (millis() - beep > 150 && millis() - beep < 300) // Интервал времени от 150 до 3000мс - звука нет { analogWrite(buzzer, 0); // Выключаем звук на ШИМ выходе } if (millis() - beep > 300 && millis() - beep < 450) // Интервал времени от 300 до 450мс - звук есть { analogWrite(buzzer, 20); // Включаем звук на ШИМ выходе } if (millis() - beep > 450) // По прошествии 450мс { analogWrite(buzzer, 0); // Выключаем звук на ШИМ выходе keyError = 0; // Сбрасываем флаг ошибки открытия } } }
Затем нам нужно в некоторых участках кода, поднимать флаг keyError == 1 и сбрасывать переменную beep. Этот код нам нужно вставить в обработку клавиши # , также он должен исполняться при неправильном вводе пароля, и сбросе его, при простое 3 секунды.
beep = millis(); // Приравниваем переменную времени зуммера к времени контроллера keyError = 1; // Активируем флаг ошибки зуммера
Теперь разберём звук динамика в момент открытия замка. Чтобы пользователь понимал, что замок ещё открыт (это особенно актуально в случае применения магнитного замка) будем воспроизводить кратковременные бипы. Цикл бипов должен продолжаться, пока открыт замок, для этого у нас была переменная openTime. Т.е. мы можем считывать состояние замка, и бипать, пока beep < openTime. Далее мы организуем цикл включения и выключения динамика, по схожему принципу, как в коде ошибки, но он у нас будет повторять, пока открыт замок. Чтобы цикл повторно запустился, в конце нам нужно обновить переменную beep.
void key_beep_ok() { if (millis() - beep < openTime && lockType == 1 && digitalRead(lock) == HIGH || millis() - beep < openTime && lockType == 0 && digitalRead(lock) == LOW) { if (millis() - beep > 0 && millis() - beep < 120) // Задаём время от 0 до 120мс - зуммер активен { analogWrite(buzzer, 30); // Включаем звук на ШИМ выходе } if (millis() - beep > 120 && millis() - beep < 300) // Задаём время от 120 до 300 мс - зуммер не активен { analogWrite(buzzer, 0); // Выключаем звук на ШИМ выходе } if (millis() - beep > 300) // Свыше 300мс обнуляем переменную времени зуммера, чтобы цикл запустился снова, пока действует время открытия замка { beep = millis(); // Приравниваем переменную времени зуммера к времени контроллера } } }
У нас уже прошло достаточно циклов статей по построению нашей системы доступа, поэтому соберём всё в железе, и протестируем, как работает наш код
Смотрите также: dc-dc
Записал небольшое видео, где проверим основные функции нашего устройства.
Код этой статьи на github.
Используемые источники:
- https://soltau.ru/index.php/arduino/item/357-how-connect-buzzer
- https://arduinomaster.ru/uroki-arduino/pishhalka-pezodinamik-arduino/
- https://wreckage.ru/buzzer-in-arduino-sound-visualization-commands/