На самых первых уроках мы познакомились со светодиодами, которые часто используются в электронике как индикаторы состояния. Самым простым примером может служить индикатор питания, с помощью которого прибор сообщает пользователю, что он включен. Очень часто вместе со световой индикацией, в устройствах применяется звуковая индикация. Во многих электронных приборах есть источник звука, который как и световой индикатор помогает пользователю в работе.
Обычно в электронике используются два типа источников звука:
- громкоговоритель (динамик);
- звукоизлучатель (зуммер).
В этом уроке мы поговорим о динамике. Разберем подробно его устройство и попробуем проиграть мелодию на Ардуино!
Список необходимых компонентов
Для выполнения всех примеров из этого урока потребуется контроллер Arduino Uno или любой его аналог, динамик, два транзистора, резисторы, конденсаторы, макетная плата и немного проводов вилка-вилка.
Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Громкоговоритель, он же динамик
Все громкоговорители можно разделить на два подтипа: электродинамический и пьезоэлектрический. Именно от названия первого подтипа пошло хорошо известное нам название динамик.
Наверное каждый из нас хотя бы раз в жизни разбирал какой-нибудь старый динамик. Внутри него обязательно есть постоянный магнит, который прочно склеен с металлическим диском и цилиндрическим якорем по середине.
Кроме магнита в динамике еще есть небольшая электромагнитная (или звуковая) катушка, намотанная тонким лакированным проводом. Катушка приклеена к гофрированному подвесу и к диффузору. Все эти части изображены на схеме разреза динамика.
Человеку, знакомому со школьным курсом физики не составит труда догадаться как работает это устройство. Мы знаем, что если подать на звуковую катушку напряжение, то в её витках возникнет электрический ток (ну это уж совсем очевидно). Согласно закону Ампера, на проводник с током, находящийся в магнитном поле будет действовать сила Ампера.
Направление этой силы можно легко вычислить с помощью правила левой руки: если вектор манитного поля направлен в ладонь, а пальцы направлены по току (вдоль витков провода), то большой палец будет указывать направление силы. Именно сила Ампера то притягивает катушку к основанию якоря, то отталкивает от него, в зависимости от направления электрического тока.
То есть подавая на катушку переменный ток, мы заставим её колебаться. Звуковая катушка прочно соединена с диффузором, так что он тоже начнет колебаться. Движение же большого диффузора приведёт к колебанию большой массы воздуха, что мы и называем звуковой волной!
Генератор звука на транзисторах
Современные динамики могут иметь очень маленький размер. В нашем уроке мы будем использовать миниатюрный динамик, который мы даже разобрали для наглядности.
В отличие от своих старших собратьев, он имеет немного иную конструкцию. В этом динамике катушка прочно закреплена на основании, а колеблется вместо неё тонкая металлическая мембрана. По кругу же как и прежде размещается постоянный магнит.
Сделаем простейший генератор звука на двух транзисторах. Схема генератора представляет собой так называемый несимметричный мультивибратор, который при подаче питания будет формировать периодический импульсный сигнал.
Принципиальная схема генератора звука на транзисторах
В схеме есть:
- NPN транзистор 2n2222;
- PNP транзистор 2n2907;
- резистор с номиналом от 10 до 100 К;
- конденсатор 100 нФ.
Внешний вид макета
Собираем сначала схему и в самом конце подключаем к ней батарейку.
В текущем варианте динамик будет издавать пронзительный писк на высокой частоте. Изменить частоту звука можно с помощью конденсатора C1. Если параллельно с C1 подключить еще один или два точно таких же конденсаторов на 100 нФ, частота звука станет ниже.
Подключение к Ардуино
Теперь мы знаем как заставить динамик издавать один тон без использования микроконтроллера. Но такой простой генератор может понадобиться разве что сигнального гудка на автомобиле. Нам же больше интересно проигрывать мелодии, речь и разные звуковые сэмплы, с помощью которых робот может общаться с человеком. В этом нам поможет Ардуино.
Подключим динамик к Ардуино по следующей схеме.
Принципиальная схема подключения динамика к Ардуино
Внешний вид макета
Программа: метроном
Метроном — это устройство, которое задает ритм для музыканта. То есть нам потребуется издавать краткий звук с заданным периодом, скажем в 1 секунду.
Для генерации звука заданной частоты воспользуемся функцией tone, которая имеет следующий формат:
tone( контакт, частота [, длительность] );
- здесь контакт — номер вывода Ардуино к которому подключён динамик;
- частота — частота генерируемого звука в герцах;
- длительность — длительность звука в миллисекундах (параметр необязательный).
Как только мы вызовем функцию tone, Ардуино начнет генерировать импульсный сигнал и будет делать это, пока мы принудительно не выключим генерацию с помощью другой функции — noTone:
noTone( контакт );
Аргумент контакт — это номер вывода Ардуино к которому подключён динамик.
Примечание. Важно учитывать, что Ардуино может одновременно генерировать только один тон на одном контакте. Если вызовем функцию tone для одного контакта, и пока идет генерация попытаемся вызвать tone для другого контакта, то последний вызов будет попросту проигнорирован.
Программа метронома идентична программе для мигания светодиодом, за исключением того, что мы вместо функции digitalWrite применяем tone и noTone.
const byte dynPin = 2;
void setup() {
pinMode( dynPin, OUTPUT ); // настраиваем контакт №2 на выход
}
void loop() {
tone( dynPin, 100 ); // генерируем звук с частотой 100 Гц
delay( 100 ); // пауза 500 миллисекунд
noTone( dynPin ); // выключаем звук
delay( 900 ); // снова пауза 500 мс
}
Загружаем программу на Ардуино и внимаем ритмичному звуку метронома. Следующий пример по-сложнее — будем играть мелодию!
Программа: проигрывание нот
Теперь, когда мы умеем генерировать звук любой частоты, попробуем проиграть последовательно десять нот.
const int dynPin = 2;
int numTones = 10;
// Ноты C,C#,D,D#,E,F,F#,G,G#,A
int tones[10] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
void setup(){
pinMode( dynPin, OUTPUT );
}
void loop(){
for( int i = 0; i < numTones; i++ ){
tone( dynPin, tones[i] );
delay( 500 );
}
noTone( dynPin );
}
Для удобства хранения последовательности нот мы использовали массив tones. В следующем примере мы будем проигрывать десятки нот, и без массива наша программа стала бы через чур громоздкой и непонятной.
Мелодия из Звёздных войн на Ардуино
Наконец, попробуем воспроизвести полноценную мелодию из известной всем космической саги.
const byte dynPin = 2;
const byte COUNT_NOTES = 39;
// частоты нот
int tones[COUNT_NOTES] = {
392, 392, 392, 311, 466, 392, 311, 466, 392,
587, 587, 587, 622, 466, 369, 311, 466, 392,
784, 392, 392, 784, 739, 698, 659, 622, 659,
415, 554, 523, 493, 466, 440, 466,
311, 369, 311, 466, 392
};
// длительности нот
int durations[COUNT_NOTES] = {
350, 350, 350, 250, 100, 350, 250, 100, 700,
350, 350, 350, 250, 100, 350, 250, 100, 700,
350, 250, 100, 350, 250, 100, 100, 100, 450,
150, 350, 250, 100, 100, 100, 450,
150, 350, 250, 100, 750
};
void setup() {
pinMode( dynPin, OUTPUT ); // Настраиваем контакт на выход
}
void loop() {
for (int i = 0; i <= COUNT_NOTES; i++ ) {
tone( dynPin, tones[i], durations[i] * 2 );
delay( durations[i] * 2 );
noTone( dynPin );
}
}
Чтобы проиграть мелодию нам потребуется учитывать не только частоту звука, но и его длительность. Специально для этого мы ввели еще один массив — durations, в котором перечислены длительности нот из массива tones.
Загружаем программу на Ардуино и слушаем имперский марш!
На следующем уроке поговорим о зуммере, который выглядит почти также, но позволяет генерировать писк без дополнительных схем с транзисторами!