Опубликовано

Воспроизведение звуковых файлов на Arduino

По материалам книги С. Монка «Мейкерство. Arduino и Raspberry Pi» (глава 15 «Звук»)

Мейкерство. Arduino и Raspberry Pi

Эксперимент: громкоговоритель без усилителя на Arduino

Для воспроизведения более или менее сложного звука понадобится какой-нибудь громкоговоритель. Громкоговорители, появившиеся почти сто лет назад, в большинстве своем работают на основе соленоида (см. разд. «Соленоиды» главы 7) — содержащаяся в них электромагнитная катушка с достаточно высокой частотой колеблет жесткий конус, создающий звуковые волны.

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

Обычно на громкоговорителях встречаются значения 4 или 8 ом. И если вы собираетесь подключить 8-омный громкоговоритель к выходу Arduino с напряжением 5 В, то с полным основанием можете ожидать возникновения тока, равного по силе:

I = V / R = 5 / 8 = 625 мА

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

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


Звуковые частоты

Частота звуковой волны в музыкальных терминах называется тоном и выражается в количестве звуковых волн, достигающих ваших ушей за одну секунду. Мне нравится представлять звуковые волны в виде ряби на пруду. Звук высокой частоты — скажем, 10 кГц (килогерц), создает 10 000 звуковых волн в секунду, а звук низкой частоты (скажем, 100 Гц) — всего 100 звуковых волн в секунду. Человек обычно слышит звуки в диапазоне от 20 Гц до 20 кГц, но верхняя граница с возрастом снижается. Звуки выше 20 кГц обычно называют ультразвуком.

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

В музыке самая низкая нота «До» на обычном пианино соответствует частоте 32,7 Гц, а самая высокая — частоте 4186 Гц. Известное всем, имеющим хоть какое-то касательство к музыке, понятие октава означает удваивание частоты. Поэтому, если заставить на клавиатуре пианино зазвучать две ноты «До» смежных октав, то вторая нота будет звучать с удвоенной частотой первой ноты.


Комплектующие

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

Таблица 15.1. Комплектующие для работы с Arduino в эксперименте с громкоговорителем

Компонент схемы Источники
Небольшой громкоговоритель с импедансом 8 Ом Adafruit: 1891
Резистор 270 Ом 0,25 Вт Mouser: 291-270-RC
400-точечная беспаечная макетная плата Adafruit: 64
Перемычки «папа-папа» Adafruit: 758

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

Макетная схема эксперимента

Схема, собранная для проведения эксперимента на макетной плате, показана на рис. 15.1.

mkac_1501

Рис. 15.1. Схема эксперимента с громкоговорителем на Arduino в сборе

Один провод от громкоговорителя подключается к контакту GND (заземление) Arduino, а второй — к контакту D11 через резистор.

Программа для Arduino

Скетч Arduino для этого эксперимента находится в каталоге /arduino/experiments/ex_speaker (см. разд. «Код к книге» главы 2):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int soundPin = 11;
void setup() {
pinMode(soundPin, OUTPUT);
Serial.begin(9600);
Serial.println("Введите частоту ");
}
 
void loop() {
if (Serial.available()) {
int f = Serial.parseInt();
tone(soundPin, f); //<strong> 1</strong>
delay(2000);
noTone(soundPin); //<strong> 2</strong>
}
}

Незнакомая вам часть кода может находиться внутри цикла loop():

  1. tone настраивает один из выходных контактов Arduino на воспроизведение звука с указанной частотой (в данном случае, с частотой, набранной в окне монитора порта).
  2. После двухсекундной задержки команда noTone отменяет воспроизведение звука, возвращая умиротворяющую тишину.

Загружаем и выполняем программу

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

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

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


Синусоида и меандр

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

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


Звуковые волны в виде меандра и синусоиды

Рис. 15.2. Звуковые волны в виде меандра и в виде синусоиды

Усилители

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

В конструкции, собранной для эксперимента из разд. «Эксперимент: громкоговоритель без усилителя на Arduino», мощность звука, излучаемого громкоговорителем, можно существенно усилить, используя транзистор, как это делалось для включения и выключения реле или электродвигателя, — звук останется столь же неприятным, но станет значительно громче.

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

Усилитель можно собрать самостоятельно, но намного проще воспользоваться уже готовым изделием или же парой колонок, которыми оснащен ваш персональный компьютер. Задействовать такие колонки, в которые усилитель уже встроен, окажется особенно заманчиво, когда дело дойдет до использования Raspberry Pi, поскольку их входной штекер можно будет просто подключить к аудиоразъему Raspberry Pi.

Такой подход мы рассмотрим позже, когда кукла Пепе (из разд. «Проект: танцующая кукла Пепе на Raspberry Pi» главы 9) станет обретать голос (см. разд. «Проект: кукла Пепе обретает голос» далее в этой главе).

Эксперимент: воспроизведение звуковых файлов на Arduino

Звуковые файлы формата WAV можно проигрывать на Arduino с помощью оборудования из разд. «Эксперимент: громкоговоритель без усилителя на Arduino» и библиотеки Arduino под названием PCM (от англ. pulse code modulation, импульсно-кодовая модуляция). Для генерирования колебаний, способных вызвать звук, в этой библиотеке используется технология, слегка похожая на технологию широтно-импульсной модуляции (ШИМ). Флэш-памяти Arduino хватает приблизительно на 4 секунды записи, а если требуется проигрывать более длинные звуковые клипы, надо добавить к Arduino кардридер SD и следовать рекомендациям, приведенным на веб-сайте Arduino по адресу: https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer.

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

Исходная статья с описанием такого подхода к воспроизведению звука опубликована на веб-сайте High-Low Tech (http://highlowtech.org/?p=1963). Наш эксперимент немного отличается от этого описания тем, что в нем для записи аудиоклипа используется свободно распространяемое приложение Audacity.

Оборудование и софт

В этом эксперименте используется то же самое оборудование, что и в разд. «Эксперимент: громкоговоритель без усилителя на Arduino». Но вам придется установить на компьютер следующие программы, позволяющие записывать и обрабатывать звуковые клипы:

  • приложение Audacity: audacityteam.org;
  • утилиту Audio Encoder — ссылку на версию под вашу операционную систему можно найти на веб-сайте highlowtech.org/?p=1963.

Создание звукового файла


Примечание

Если записывать свой собственный звуковой клип желания у вас нет, вы можете сразу перейти к разд. «Загружаем и выполняем программу», входящему в состав этого эксперимента, и запустить программу wav_arduino, содержащую в закодированном виде небольшое звуковой блок.


Чтобы создать звуковой файл, запустите программу Audacity, переключите режим записи в моно (Mono) и выберите частоту проекта (Project Rate) равной 8000 Гц. Эти варианты настройки выделены на рис. 15.3.

mkac_1503

Рис. 15.3. Программа Audacity: запись звукового клипа

Чтобы начать запись, щелкните на красной кнопке Record (Записать) и запишите свое сообщение. Учтите, что запись не должна быть длиннее 4 секунд. Как только запись будет сделана, в окне Audacity появится изображение звуковой волны. Можно выбрать любую «немую» область в начале или в конце записи и удалить ее, оставив только нужную часть звукового блока.

Записанный звук надо экспортировать в нужный формат. Для этого опять понадобится выполнить специальные настройки. Выберите в меню File (Файл) пункт Export (Экспорт аудио), затем в раскрывающемся меню выберите вариант Other uncompressed files (Прочие несжатые файлы), перейдите в область настроек Format options (Настройки формата) и укажите характеристики WAV (Microsoft) и Unsigned 8 bit PCM (рис. 15.4). Присвойте файлу имя и пропустите страницу, приглашающую ввести данные об исполнителе.

Только что сгенерированный файл представляет собой двоичные данные. Его нужно преобразовать в список чисел в текстовом виде, отделенных друг от друга запятыми, чтобы его можно было вставить в нашу программу. Запустите для этого утилиту Audio Encoder, загруженную с веб-сайта highlowtech.org. Она выведет на экран приглашение на выбор конвертируемого файла — выберите файл, который только что был экспортирован из Audacity.

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

Откройте программу /arduino/experiments/wav_arduino и замените всю строку, начинающуюся с последовательности 125, 119, 115, данными из буфера обмена. Это очень длинная строка, поэтому лучше всего выбрать ее, поместив курсор в начало строки, а затем, удерживая нажатой клавишу <Shift>, опустить курсор вниз и переместить его на последний символ строки. Для замены выбранного текста данными из буфера обмена, воспользуйтесь пунктом контекстного меню Insert (Вставить).

mkac_1504

Рис. 15.4. Программа Audacity: выбор параметров экспорта

Если нанести все вставленные числа на график, его форма будет напоминать ту, что вы уже видели в Audacity при записи звукового клипа.

Программа для Arduino

Перед тем как приступить к компиляции и запуску программы, нужно установить библиотеку PCM. Загрузите ZIP-архив из GitHub (https://github.com/damellis/PCM/zipball/master), распакуйте его, переименуйте папку в PCM и переместите ее в каталог своих библиотек Arduino, воспользовавшись рекомендациями, представленными во врезке «Установка библиотек Arduino» главы 12.

Программа для Arduino (если проигнорировать звуковые данные) имеет весьма скромный размер, но массив данных представлен очень длинной строкой!

1
2
3
4
5
6
7
8
9
#include &lt;PCM.h&gt;
const unsigned char sample[] PROGMEM = { //<strong> 1</strong>
125, 119, 115, 115, 112, 116, 114, 113, 124, 126, 136, 145, 139,
};
void setup() {
startPlayback(sample, sizeof(sample)); //<strong> 2</strong>
}
void loop() { //<strong> 3</strong>
}

Уточним некоторые моменты этого скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

  1. Данные хранятся в массиве типа char, состоящем из восьмиразрядных чисел без знака. Команда PROGMEM обеспечивает хранение данных во флэш-памяти Arduino (в ней должно быть доступно около 32 Кбайт).
  2. Проигрывание звукового сэмпла осуществляет библиотека PCM. Функции startPlayback передается массив проигрываемых данных и размер данных в байтах.
  3. Звуковой клип проигрывается однократно при каждом перезапуске Arduino, поэтому функция loop() остается пустой.

Загружаем и выполняем программу

Загрузите программу в свой Arduino, и как только загрузка завершится, звуковой клип будет воспроизведен!

Сразу же после загрузки программы в нижней части Arduino IDE появится сообщение о том, сколько флэш-памяти Arduino было задействовано, примерно следующего содержания: Binary sketch size: 11,596 bytes (of a 32,256 byte maximum) (Размер двоичной программы: 11596 байтов (из максимально возможных 32256 байтов)). Если звуковой файл окажется слишком большим, вы получите сообщение об ошибке.

Подключение Arduino к усилителю

Как ни удивительно, но только что проведенный эксперимент оказался успешным, хотя его удалось проделать с применением только лишь Arduino.

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

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


Делитель напряжения

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

Например, на рис. 15.5 показан делитель напряжения, используемый для снижения сигнала напряжением 5 В от Arduino до более подходящего в качестве входа для усилителя звука значения в 0,5 В (или около того).


Напряжение в точке соединения двух резисторов (Vout) вычисляется по формуле:

В данном случае, когда на цифровом выходе выставлен высокий уровень сигнала (high) и Vin = 5 В, то:

Vout = 5 × 1/(1+10)=0,45 В.

Делитель напряжения

Рис. 15.5. Делитель напряжения

Макетную плату из разд. «Эксперимент: громкоговоритель без усилителя на Arduino» можно приспособить под подключение к усилителю, поместив один резистор над другим, как показано на рис. 15.6, и подключив верхний резистор номиналом 10 кОм к выводу D11, а нижний вывод нижнего резистора — к выводу GND (заземление). После этого останется только выбрать способ подключения контактной линии GND и линии, на которой встретились резисторы, к усилителю.

mkac_1506

Рис. 15.6. Схема подключения Arduino ко входу усилителя звукового сигнала в сборе

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

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

mkac_1507

Рис. 15.7. Тестирование входного кабеля звукового сигнала

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

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

Добавить комментарий