Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 13

Генерация звука на микроконтроллерах AVR методом волновых таблиц с поддержкой полифонии

Пищалка на Ардуино, которую часто еще называют зуммером, пьезодинамиком или даже баззером – частый гость в DIY проектах. Этот простой электронный компонент достаточно легко подключается к платам Arduino, поэтому вы можете быстро заставить вашу схему издавать нужные звуки – сигнализировать, пищать или вполне сносно проигрывать мелодию. В данной статье расскажем про отличие активных и пассивных зуммеров, разберем схему подключения пьезоэлемента к плате Ардуино и покажем пример скетча для управления пищалкой. А еще вы найдете пример мелодии, которыми cможете снабдить свой проект.

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

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

active_buzzer_2-550x550-e1566961989134.jpg
Пьезоэлемент “пищалка”

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

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

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

1-e1566961887910.jpg
Модуль пищалки для Ардуино

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

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

Где купить пищалку Ардуино

Наш традиционный обзор предложений на Aliexpress

Модуль пьезодинамика с необходимой обвязкой для работы с Ардуино Громкий пьезодинамик – пищалка 3-24 Вольт, подходит для Ардуино Простейшие пассивные пьезоизлучатели 12MM*8.5MM 3-12В, набор 5 штук
Модуль пьезодинамика с необходимой обвязкой для работы с Ардуино Пищалки с разъемами для подключения к материнской плате компьютера Набор из 10 активных спикеров – пьезопищалок

Отличия активного и пассивного зуммера

Главное отличие активного зуммера от пассивного заключается в том, что активный зуммер генерирует звук самостоятельно. Для этого пользователь должен просто включить или выключить его, другими словами, подав напряжение на контакты или обесточив. Пассивный зуммер же требует источника сигнала, который задаст параметры звукового сигнала. В качестве такого источника может выступать плата Ардуино. Активный зуммер будет выдавать более громкий звуковой сигнал в сравнении с его конкурентом. Частота излучаемого звука активного зуммера составляет значения 2,5 кГц +/- 300Гц. Напряжение питания для пищалки варьируется от 3,5 до 5 В.

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

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

Подключения зуммера к Arduino

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

Подключение пищалки к Ардуино (порт 12)

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

Схема подключения зуммера

На некоторых вариантах корпусов зуммера можно найти отверстие для фиксации платы при помощи винта.

Зуммер 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(); // Остановили звучание      }

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

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

Когда вы используете функцию 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 аудио и музыку в ардуино.

В этой статье пойдет речь о воспроизведении аудиофайлов с помощью одной лишь Ардуино.

Иногда в проектах, построенных на основе микроконтроллера arduino присутствует необходимость в воспроизведении неких аудиофайлов. Если эти файлы являются набором нот или частотой колебания, то нет проблем – в примерах самой arduino IDE есть несколько примеров проигрывания нот и «пищания» на разных тонах.

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

Эти варианты подходят для воспроизведения большого числа треков разных размеров, но если вам нужно воспроизводить небольшие аудиофайлы, и вы не хотите тратиться на сторонние модули, то можно залить их в саму плату arduino. Так как же это сделать? Читайте далее!

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

Скачать wav2asm_c.zip

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

Вот сайт с простыми фразами на английском: http://ru.nemoapps.com/phrasebooks/english они как раз укладываются в размеры памяти. Возьмем с него один файл «That’s good» и на его примере рассмотрим весь процесс.

Хорошо, файл нашли. Скачиваем его. Программе wav2asm_c нужен специальный формат (.wav). Для перевода скачанного файла воспользуемся онлайн конвертером https://audio.online-convert.com/ru/convert-to-wav.

Перетаскиваем скачанный аудиофайл в поле с облачком.

Выбираем настройки как на скриншоте ниже и жмем кнопочку «Начать конвертирование». В графе каналов можно выбрать и стерео, но тогда вес сконвертированного файла будет раза в два больше.

Справка. Для тех, кто не в курсе: моно это одна аудиодорожка, а стерео – две, следовательно, для воспроизведения моно необходим только один динамик, а для стерео два независимых динамика (можно воспроизводить и на одном, но тогда аудиодорожка все равно сольется в моно).

Поскольку мы используем только один динамик, разницы между стерео и моно не почувствуем, так что лучше сэкономить память.

После окончания конвертирования скачиваем получивший файл.

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

Затем открываем программу wav2asm_c, выбираем нужный файл, ставим настройки как на скриншоте (название роли играть не будет, поэтому там как хотите, с числом байт в строке тоже самое) и жмем кнопочку создать.

Получим следующий файл:

Его можно открыть с помощью Блокнота винды, но я предпочитаю Notepad++ (скачать с официального сайта https://notepad-plus-plus.org ).

В папке проекта программы нужно создать библиотеку – файл с разрешением «.h» и названием sounddata.

Скачать sounddata.h

Только после этого можно запускать Arduino IDE, созданный файл откроется автоматически рядом со скетчем. Заходим в него и прописываем следующее:

const int sounddata_length = ;    const unsigned char sounddata_data[] PROGMEN = {    };  

Важно! Все названия и типы данных должны в точности совпадать со скриншотом.

Переменной sounddata_length присваиваем длину массива, хранящего запись аудиофайла, длину массива так же указываем явно. Она записана в файле, сгенерированном программой wav2asm_c между /* и */ .

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

Теперь остается лишь подключить динамик к Arduino и залить скетч. Скачать и скопировать скетч можно ниже:

Скачать audio_without_players_cards.ino

#include   #include <avr>  #de <avr>  #de <avr>  #de "sounddata.h"  #define SAMPLE_RATE 8000 // скорость воспроизведения    int speakerPin = 11;  volatile uint16_t sample;  byte lastSample;    // далее идут команды не использующие Ардуиновскую оболочку, особо не вникайте.    // Это называется на 8000 Гц для загрузки следующего образца.  ISR(TIMER1_COMPA_vect) {      if (sample >= sounddata_length) {          if (sample == sounddata_length + lastSample) {              stopPlayback();          }          else {              // Рампа вниз до нуля, чтобы уменьшить щелчок в конце воспроизведения.              OCR2A = sounddata_length + lastSample - sample;          }      }      else {            OCR2A = pgm_read_byte(&sounddata_data[sample]);            }      ++sample;  }    void startPlayback()  {      // Настраиваем 2-ой таймер для использования широтно-импульсной модуляции на динамике        // Используем внутренние часы      ASSR &= ~(_BV(EXCLK) | _BV(AS2));        // Устанавливаем быстрый режим PWM      TCCR2A |= _BV(WGM21) | _BV(WGM20);      TCCR2B &= ~_BV(WGM22);        // Не используйте ШИМ на контакте OC2A      // На Arduino это вывод 11.      TCCR2A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0);      TCCR2A &= ~(_BV(COM2B1) | _BV(COM2B0));        //  Не используем предварительный делитель      TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);        // Задаем начальную ширину импульса для первого образца.      OCR2A = pgm_read_byte(&sounddata_data[0]);          // Настраиваем Таймер 1, чтобы отправить образец каждого прерывания.        cli();        // Устанавливаем режим CTC (Очистить таймер на совпадении)      // Необходимо установить OCR1A * после * ( *after*), иначе он будет сброшен на 0!      TCCR1B = (TCCR1B & ~_BV(WGM13)) | _BV(WGM12);      TCCR1A = TCCR1A & ~(_BV(WGM11) | _BV(WGM10));        //  Не используем предварительный делитель       TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);        // Устанавливаем регистр сравнения (OCR1A).      // OCR1A - это 16-разрядный регистр, поэтому мы должны сделать это с помощью      // отключенный прерываний, чтобы быть в безопасности.      OCR1A = F_CPU / SAMPLE_RATE;    // 16e6 / 8000 = 2000        // Включаем прерывание, когда TCNT1 == OCR1A (p.136)      TIMSK1 |= _BV(OCIE1A);        lastSample = pgm_read_byte(&sounddata_data[sounddata_length-1]);      sample = 0;      sei();  }    void stopPlayback()  {      // Отключаем прерывание воспроизведения на выборку.      TIMSK1 &= ~_BV(OCIE1A);        // Полностью отключаем таймер за выборку.      TCCR1B &= ~_BV(CS10);        // Отключаем таймер PWM.      TCCR2B &= ~_BV(CS10);        digitalWrite(speakerPin, LOW);  }    void setup()  {      // проигрываем наш аудиофайл      startPlayback();  }    void loop()  {      }  </avr></avr></avr>

Динамик элемент не полярный, поэтому один его контакт подключаем к 11 пину, а другой к GND. Скорость воспроизведения (SAMPLE_RATE) нужно подобрать под себя. Если вы выбрали при первой конвертации стерео, то она должна быть в 2 раза больше, чем при моно. Если все было сделано правильно, то Arduino скажет нам «that’s good!».

amperka-nabor.png

Продолжаем серию уроков “Arduino для начинающих”. Сегодня собираем модель с пьезоэлементом (динамиком), которые используются в робототехники для управления звуками, издаваемыми роботом. В статье вы найдете видео-инструкцию, листинг программы, схему подключения и необходимые компоненты.

Пьезоэлемент — электромеханический преобразователь, одним из разновидностей которого является пьезоизлучатель звука,  который также называют пьезодинамиком, просто звонком  или английским buzzer. Пьезодинамик переводит электричеcкое напряжение в колебание мембраны. Эти колебания и создают звук (звуковую волну).

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

Видео-инструкция сборки модели:

Для сборки модели с пьезоэлементом нам потребуется:

  • плата Arduino
  • провода “папа-папа”
  • пьезоэлемент
  • программа Arduino IDE, которую можно скачать с сайта Arduino.

arduino-piezo-600x575.jpg

Что потребуется для подключения динамика на Arduino?

Схема подключения модели Arduino с пьезоэлементом:

6-схема1.jpg

Схема подключения пьезоэлемента (динамика) на Arduino

Для работы этой модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):

int p = 3; //объявляем переменную с номером пина, на который мы //подключили пьезоэлемент void setup() //процедура setup { pinMode(p, OUTPUT); //объявляем пин как выход } void loop() //процедура loop { tone (p, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(p, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс }

Так выглядит собранная модель Arduino с пьезоэлементом:

arduino-piezo-done-600x398.jpg

Собранная модель подключения динамика на Arduino

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

Смотрите также:

Учебный курс «Arduino для начинающих»: главная страница.

Посты по урокам:

  1. Первый урок: Светодиод
  2. Второй урок: Кнопка
  3. Третий урок: Потенциометр
  4. Четвертый урок: Сервопривод
  5. Пятый урок: Трехцветный светодиод
  6. Шестой урок: Пьезоэлемент
  7. Седьмой урок: Фоторезистор
  8. Восьмой урок: Датчика движения (PIR) и E-mail
  9. Девятый урок: Подключение датчика температуры и влажности DHT11 или DHT22

Все посты сайта «Занимательная робототехника» по тегу Arduino.

Наш YouTube канал, где публикуются видео-уроки.

Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазины Амперка и DESSY. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.

Автор: Александр Гагарин.

Используемые источники:

  • https://arduinomaster.ru/uroki-arduino/pishhalka-pezodinamik-arduino/
  • https://arduinoplus.ru/vosproizvedenie-audiofailov-arduino/
  • http://edurobots.ru/2014/05/arduino-pezoelement/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации