wav и mp3 c esp8266 без ЦАП

Аудио MP3 и WAV с ESP8266. Работа с файловой системой SPIFFS

от автора

в

Как мы знаем, в отличие от простых 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. Тема озвучки проектов на микроконтроллерах мне интересна, и как мне показалось, она достаточно слабо раскрыта.


Комментарии

2 комментария на ««Аудио MP3 и WAV с ESP8266. Работа с файловой системой SPIFFS»»

  1. Аватар пользователя Дмитрий
    Дмитрий

    Спасибо за подробную статью. Будем пробовать!

    1. Аватар пользователя lex232
      lex232

      Спасибо! Лучше сразу пробуйте на ЦАП, звук намного качественней получается.

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