Звуковые файлы формата WAV можно проигрывать на Arduino с помощью оборудования из раздела "
Эксперимент: громкоговоритель без усилителя на Arduino" и библиотеки Arduino под названием
PCM (от англ. pulse code modulation, импульсно-кодовая модуляция). Для генерирования колебаний, способных вызвать звук, в этой библиотеке используется технология, слегка похожая на технологию широтно-импульсной модуляции (ШИМ).
Флеш-памяти Arduino хватает приблизительно на 4 секунды записи, а если требуется проигрывать более длинные звуковые клипы, необходимо добавить к Arduino кардридер SD и следовать рекомендациям, приведенным на веб-сайте Arduino по адресу: [
https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer](
https://www.arduino.cc/en/Tutorial/SimpleAudioPlayer).
Звук мы запишем на компьютере, воспользовавшись пакетом программ Audacity, а затем запустим утилиту, предназначенную для преобразования звукового файла в набор чисел, соответствующих этому звуку, который можно будет вставить в программу для Arduino и воспроизвести.
Исходная статья с описанием такого подхода к воспроизведению звука опубликована на веб-сайте High-Low Tech ([
http://highlowtech.org/?p=1963](
http://highlowtech.org/?p=1963)). Наш эксперимент немного отличается от этого описания тем, что в нем для записи аудиоклипа используется свободно распространяемое приложение Audacity.
Оборудование и программное обеспечение
В этом эксперименте используется то же самое оборудование, что и в разделе "
Эксперимент: громкоговоритель без усилителя на Arduino". Но вам придется установить на компьютер следующие программы, позволяющие записывать и обрабатывать звуковые клипы:
- Приложение Audacity: [audacityteam.org](
https://www.audacityteam.org/).
- Утилиту Audio Encoder - ссылку на версию под вашу операционную систему можно найти на веб-сайте [highlowtech.org/?p=1963](
http://highlowtech.org/?p=1963).
Создание звукового файла
Примечание: Если записывать свой собственный звуковой клип желания у вас нет, вы можете сразу перейти к разделу "Загружаем и выполняем программу", входящему в состав этого эксперимента, и запустить программу wav_arduino, содержащую в закодированном виде небольшой звуковой блок.
Чтобы создать звуковой файл, запустите программу Audacity, переключите режим записи в моно (
Mono) и выберите частоту проекта (
Project Rate) равной 8000 Гц.
Чтобы начать запись, щелкните на красной кнопке "
Record" (Записать) и запишите свое сообщение. Учтите, что запись не должна быть длиннее секунды. Как только запись будет сделана, в окне Audacity появится изображение звуковой волны. Можно выбрать любую "немую" область в начале или в конце записи и удалить её, оставив только нужную часть звукового блока.
Записанный звук необходимо экспортировать в нужный формат. Для этого опять понадобятся специальные настройки. Выберите в меню "
File" (Файл) пункт "
Export" (Экспорт аудио), затем в раскрывающемся меню выберите вариант "
Other uncompressed files" (Прочие несжатые файлы), перейдите в область настроек "
Format options" (Настройки формата) и укажите характеристики
WAV (Microsoft) и Unsigned 8 bit PCM, как показано на рисунке ниже. Присвойте файлу имя и пропустите страницу, приглашающую ввести данные об исполнителе.
- Программа Audacity выбор параметров экспорта
Только что сгенерированный файл представляет собой двоичные данные. Его нужно преобразовать в список чисел в текстовом виде, разделенных друг от друга запятыми, чтобы его можно было вставить в нашу программу. Запустите для этого утилиту Audio Encoder, загруженную с веб-сайта [highlowtech.org](
http://highlowtech.org). Она выведет на экран приглашение на выбор конвертируемого файла - выберите файл, который только что был экспортирован из Audacity
Через несколько секунд появится диалоговое окно с утверждением о том, что все данные находятся в вашем буфере обмена.
Откройте программу /arduino/experiments/wav_arduino и замените всю строку, начиная с последовательности
125, 119, 115, данными из буфера обмена. Это очень длинная строка, поэтому лучше всего выбрать ее, поместив курсор в начало строки, а затем, удерживая нажатой клавишу <
Shift>, опустить курсор вниз и переместить его на последний символ строки. Для замены выбранного текста данными из буфера обмена воспользуйтесь пунктом контекстного меню "
Insert" (Вставить). Если нанести все вставленные числа на график, его форма будет напоминать ту, которую вы уже видели в Audacity при записи звукового клипа.**
Программа для Arduino
Прежде чем приступить к компиляции и запуску программы, необходимо установить библиотеку PCM. Загрузите ZIP-архив с GitHub (
https://github.com/damellis/PCM/zipball/master), распакуйте его, переименуйте папку в "PCM" и переместите ее в каталог своих библиотек Arduino.
Программа для Arduino (если проигнорировать звуковые данные) имеет весьма скромный размер, но массив данных представлен очень длинной строкой!
Код: Выделить всё
#include <PCM.h>
const unsigned char sample[] PROGMEM = {125, 119, 115, 115, 112, 116, 114, 113, 124, 126, 136, 145, 139};//1
void setup() {
startPlayback(sample, sizeof(sample));//2
}
void loop() {//3
}
Уточним некоторые моменты этого скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Данные хранятся в массиве типа `
unsigned 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)" (Размер двоичной программы: 11,596 байтов (из максимально возможных 32,256 байтов)). Если звуковой файл окажется слишком большим, вы получите сообщение об ошибке.