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. Если в данный момент необходима пауза в воспроизведении, то запускается пустая задержка.
Индивидуальные задания
- В предложенной мелодии попробуйте изменить темп исполнения и сделайте паузу 5 секунд между повторами.
- Теперь попробуйте самостоятельно изменить мелодию. Например, вот “Имперский марш” из того же кинофильма (вводить массивы нужно в одну строчку):
//массив с нотами 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};
- Установите перемычки для включения светодиодов с 0 до 9. Внесите в программу изменения, которые будут зажигать линейку светодиодов. Чем выше частота звука – тем больше светодиодов должно гореть. Перемычки должны быть установлены так, как показано на рисунке:
Остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.
Метки: Arduino, курс, обучение, программирование, пьезоизлучатель Просмотров: 15975