Как мы знаем, в отличие от простых Arduino с 8-128 кб памяти Flash на борту, ESP8266 содержит в себе от 1 до 4 мбайт памяти, что уже достаточно для размещения картинок и звуковых файлов, если проект небольшой. Хочу рассказать, как можно воспроизводить звук напрямую с контроллера, а попутно об интересной утилите для Arduino IDE – ESP8266FS, которая позволяет работать с файловой системой в удобном виде.
Для начала нужно установить недостающие библиотеки с репозитория GitHub. Первый отвечает за аудио декодирование и воспроизведение, а второй за работу с SPIRAM, если потребуется увеличить буфер ОЗУ. Качаем по следующим ссылкам Аудио ESP8266Audio и SPIRAM
Затем находим свою пользовательскую папку ARDUINO (в windows обычно находится в папке “мои документы”) и переносим туда распакованные папки вышеуказанных библиотек. Должно получится следующим образом.
Если вам необходимо вставить пару коротких аудио вставок, можно не заморачиваться с хранением MP3 файлов в памяти SPIFFS, а расположить пару коротких звуков в памяти программы PROGMEM. Для начала соберём схему. ЦАП можно подключить как и внешний, так и использовать эмуляцию i2s, подцепив аудио-сигнал на пин RX, что мы и сделаем. Самый простой пример, использует усилитель на базе транзистора, но у меня в запасе были дешёвые усилители на базе
PAM8403 (15 руб на алиэкспресс) – 3w двухканальный, его я и решил использовать. Усилитель отлично работает от 3.3В, так что нет нужды искать 5В для его питания, хотя их можно взять и от VIN входа, если плата подключена к USB порту. Не стал изображать, но перед усилителем я ещё поставил переменный резистор для регулировки громкости.
Перед тем как приступать к проекту, нужно установить пару параметров во вкладке утилит.
Tools->lwIP Variant->v1.4 Open Source, or V2 Higher Bandwidth
Tools->CPU Frequency->160MHz
Далее откроем пример воспроизведения потокового wav файла из памяти программы PROGMEM. Найти её можно здесь.
Собственно, загрузив его в устройство стандартным методом, вы сразу же услышите звук виолончели. Теперь попробуем заменить звук, например на сигнал тревоги, что более востребовано в IoT устройствах. Как вы уже заметили звук хранится в отдельном файле *.h, где звук представлен в виде массива данных, почти как изображения, которые мы хранили аналогичным образом. Как же сделать такую последовательность для звука? Для начала нужно скачать wav файл и правильно его преобразовать. Также обратим внимание на запись
AudioGeneratorWAV: Reads and plays Microsoft WAVE (.WAV) format files of 8 or 16 bits.
Для редактирования в Linux, и использую Audacity, который можно установить из менеджера приложений и он абсолютно бесплатен. Найти wav файл, думаю труда не составит, теперь откроем его в программе, уберём стерео и обрежем как нашей душе угодно.
Теперь важно его правильно сохранить. Изначально у меня после всей последовательности вместо звука был какой-то треск, пока я не выставил именно 8 бит, в без-знаковом варианте.
Сохранил я его под именем sound.wav для наглядности. Вообщем я толком так и не нашёл, как сделать преобразование wav звука в массив c в среде Windows, поэтому извиняйте. Есть пару странных программ, типа wav2hex и wav2code, после работы которых вместо звука также был непонятный треск. Зато в среде Linux стандартными средствами это сделать проще простого.
В команде xxd -i мы прописываем начальный файл wav и конечный файл h или c, который будет создан в результате преобразования
xxd -i sound.wav > file.h
Теперь из получившегося файла, нужно скопировать тело массива, и скопировать в файл *.h нашего примера, если вы открывали стандартный пример, это будет viola.h. Можете заменить массив прямо там, залить скетч и проверить.
Но качество и вес wav массива не очень хорошие, ведь возможности esp8266 позволяют декодировать mp3 файлы, поэтому открываем следующий пример PlayMP3fromSPIFFS. Но при компиляции и заливке работать он не будет, а почему? SPIFFS (Serial Peripheral Interface Flash File System) – файловая система ESP8266, изначально они никак не размечена, но мы можем поделить её под файловое хранилище для текстовых файлов, изображений, звуков и память программ. Вы наверное замечали такой пункт в настройках прошивки.
У нас 4МБ памяти, но мы можем использовать её по разному, например отдать под файловую систему 3МБ, а под память программы 1МБ (именно этот вариант лучше всего подойдёт для мп3 примера). Чтобы реализовать поддержку этой штуки, вам понадобится утилита ESP8266FS.
Для начала перейдите на страницу проекта GitHub и скачайте последний релиз. Собственно, там есть инструкция по установке, но объясню для удобства в статье, как заставить этот плагин работать. В директории скетчей arduino создаём папку tools и копируем туда релиз ESP8266FS, у меня это выглядит вот так. Путь должен получиться такой – “tools/ESP8266FS/tool/esp8266fs.jar “
Следующим шагом запускаем или перезагружаем (если была запущена) оболочку Arduino IDE и проверяем, появилось ли в нашем меню новая возможность.
Теперь ещё раз открываем пример из библиотеки PlayMP3fromSPIFFS, и очень важно обратить внимание, чтобы mp3 файлы лежали в папке data, которая должна быть в корне проекта.
Порядок следующий – сначала, выбираем пункт ESP8266 Sketch Data Upload, и все файлы из папки data попадают в файловую систему вашего МК. Затем прошиваем контроллер стандартным способом. У меня сразу заиграл звук. Как не трудно догадаться, звук можно подкорректировать здесь
file = new AudioFileSourceSPIFFS("/pno-cs.mp3");
Как вы можете заметить, возможности эмуляции i2s на ШИМ в программном виде, не слишком велики. Звук не очень хорошего качества, но для озвучки простых проектов подойдёт. Я заказал is2 DAC (ЦАП), и как только он приедет, сравню качество звучания, и заодно рассмотрим альтернативную библиотеку, а ещё посмотрим работу встроенного ЦАП на ESP32. Тема озвучки проектов на микроконтроллерах мне интересна, и как мне показалось, она достаточно слабо раскрыта.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.