CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

Arduino. Работа с пьезоизлучателем

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

Подготовка к работе

На нашем TutorShield’е установлен пьезоизлучатель. Для его подключения установите перемычку между отмеченными выводами. Эти контакты подписаны как «buz». При их замыкании пьезоизлучатель подключается к выводу A5.

Подключение пьезоизлучателя

Подключение пьезоизлучателя

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

Первая программа

Для начала попробуем воспроизвести простой тональный сигнал. Сделать это можно также как мы мигали светодиодом, только надо сделать частоту гораздо выше, например 1кГц. Длительность импульса и паузы должна быть по 0,5мс. Для генерации такой задержки можно воспользоваться функцией delayMicroseconds();. Ее работа схожа с работой функции delay();, только параметр задается в микросекундах.
Запустите Arduino IDE, введите предложенный код и запустите его на загрузку. Если все выполнено верно, то вы услышите тональный сигнал с частотой 1кГц:

void setup() {                
  pinMode(19, OUTPUT);     
}

void loop() {
  digitalWrite(19, HIGH);
  delayMicroseconds(500);
  digitalWrite(19, LOW);
  delayMicroseconds(500);
}

Star Wars — Main Theme

Начнем сразу с интересного. Запустите Arduino IDE, введите предложенный код и запустите его на загрузку:

#define  c3    7634
#define  d3    6803
#define  e3    6061
#define  f3    5714
#define  g3    5102
#define  a3    4545
#define  b3    4049
#define  c4    3816    // 261 Hz 
#define  d4    3401    // 294 Hz 
#define  e4    3030    // 329 Hz 
#define  f4    2865    // 349 Hz 
#define  g4    2551    // 392 Hz 
#define  a4    2272    // 440 Hz 
#define  a4s   2146
#define  b4    2028    // 493 Hz 
#define  c5    1912    // 523 Hz
#define  d5    1706
#define  d5s   1608
#define  e5    1517    // 659 Hz
#define  f5    1433    // 698 Hz
#define  g5    1276
#define  a5    1136
#define  a5s   1073
#define  b5    1012
#define  c6    955
#define  R     0      //rest
int speakerOut = 19; 
int melody[] = {  f4,  f4, f4,  a4s,   f5,  d5s,  d5,  c5, a5s, f5, d5s,  d5,  c5, a5s, f5, d5s, d5, d5s,   c5};
int beats[]  = {  21,  21, 21,  128,  128,   21,  21,  21, 128, 64,  21,  21,  21, 128, 64,  21, 21,  21, 128 }; 
int MAX_COUNT = sizeof(melody) / 2;
long tempo = 10000; 
int pause = 1000;
int rest_count = 50;
int toneM = 0;
int beat = 0;
long duration  = 0;

void setup() { 
  pinMode(speakerOut, OUTPUT);
} 

void playTone() {
  long elapsed_time = 0;
  if (toneM > 0) {
    while (elapsed_time < duration) {
      digitalWrite(speakerOut,HIGH);
      delayMicroseconds(toneM / 2);
      digitalWrite(speakerOut, LOW);
      delayMicroseconds(toneM / 2);
      elapsed_time += (toneM);
    }
  }
  else {
    for (int j = 0; j < rest_count; j++) {
      delayMicroseconds(duration);
    }
  }
}

void loop() {
  for (int i=0; i<MAX_COUNT; i++) {
    toneM = melody[i];
    beat = beats[i];
    duration = beat * tempo;
    playTone();
    delayMicroseconds(pause);
  }
}

Если все сделано правильно, то плата начнет проигрывать мелодию из фильма «Star Wars»:

Теперь мы разберем работу программы.
В приведенном примере define применяется для объявления периода сигнала для разных нот в микросекундах. Например, ноте ля первой октавы соответствует частота 440Гц или период около 2272мкс.
Далее в виде двух разных массивов описаны ноты и их длительности. Для обозначения пауз используется R = 0.
В переменную MAX_COUNT записывается количество нот в массиве при помощи функции sizeof(). Обратите внимание, что функция sizeof() возвращение длину массива в байтах. Наш массив состоит из двухбайтовых переменных типа integer. Это значит, что возвращаемый результат необходимо поделить на 2.
Назначение остальных переменных понятно из кода программы.
В части программы void setup() один вывод, подключенный к пьезоизлучателю настраивается на выход. В нашем случае это вывод A5 или 19.
В цикле void loop() запущен цикл перебирающий элементы массивов melody[] и beats[]. Частота очередной ноты записывается непосредственно в переменную toneM. Конечная длительность (duration) определяется как произведение приведенной длительности из массива beats[] и темпа.
Далее запускается подпрограмма playTone(). Фактически эта подпрограмма в течении времени duration создает последовательность импульсов с периодом следования toneM. Если в данный момент необходима пауза в воспроизведении, то запускается пустая задержка.

Индивидуальные задания

  1. В предложенной мелодии попробуйте изменить темп исполнения и сделайте паузу 5 секунд между повторами.
  2. Теперь попробуйте самостоятельно изменить мелодию. Например, вот “Имперский марш” из того же кинофильма (вводить массивы нужно в одну строчку):
    //массив с нотами
    int melody[] = {a4, R,  a4, R,  a4, R,  f4, R, c5, R,  a4, R,  f4, R, c5, R, a4, R,  e5, R,  e5, R,  e5, R,  f5, R, c5, R,  g5, R,  f5, R,  c5, R, a4, R};
    //массив с длительностями
    int beats[]  = {50, 20, 50, 20, 50, 20, 40, 5, 20, 5,  60, 10, 40, 5, 20, 5, 60, 80, 50, 20, 50, 20, 50, 20, 40, 5, 20, 5,  60, 10, 40, 5,  20, 5, 60, 40};
  3. Установите перемычки для включения светодиодов с 0 до 9. Внесите в программу изменения, которые будут зажигать линейку светодиодов. Чем выше частота звука – тем больше светодиодов должно гореть. Перемычки должны быть установлены так, как показано на рисунке:
    Jumpers1

Остальные статьи цикла можно найти здесь.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , , , , Просмотров: 13440