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 бит, в без-знаковом варианте.

Смотрите также:  i2c передача данных между двумя arduino. Передаём числа float и int

Сохранил я его под именем 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.

Смотрите также:  hc-sr04

Для начала перейдите на страницу проекта 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”

Оставьте комментарий