Музыкальные аудиоплееры – одни из популярных самодельных проектов, реализуемых начинающими радиолюбителями. Ранее на нашем сайте мы уже рассматривали проект аудиоплеера на основе платы Arduino, в этой же статье мы рассмотрим создание аудиоплеера на основе модуля ESP32 и модуля усилителя LM386 (на нашем сайте вы можете посмотреть все проекты с использованием данного усилителя). Аудиоплеер будет работать на внешний громкоговоритель.
Возможно, громкость звука рассматриваемого в этом проекте аудиоплеера покажется вам не очень громкой, но ее можно повысить подключением более мощного усилителя. Цель данного проекта – продемонстрировать возможности модуля ESP32 по воспроизведению аудио файлов.
Ранее на нашем сайте мы рассматривали проект простого аудиоплеера и усилителя на Arduino Uno.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Модуль усилителя LM386 (купить на AliExpress).
- 8-омный громкоговоритель.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема аудиоплеера на основе модуля ESP32 представлена на следующем рисунке.
Для проигрывания звуков нам нужен громкоговоритель (динамик). В нашем проекте он подключен к модулю ESP32 через усилитель LM386. Контакты Vcc и GND модуля усилителя LM386 подключены к контактам VIN и GND модуля ESP32, а контакт IN модуля LM386 подключен к контакту 25 модуля ESP32, который является одним из двух контактов цифро-аналогового преобразования (ЦАП, на англ. DAC – Digital to Analog Converter) в данном модуле.
Внешний вид собранной конструкции аудиоплеера показан на следующем рисунке.
Подготовка модуля ESP32 для работы с аудио файлами
Для того, чтобы воспроизводить звуки с помощью модуля ESP32, нам необходимы аудиофайлы в формате .wav, потому что модуль ESP32 может работать только с аудиофайлами такого формата.
Чтобы получить аудиофайл .wav формата, вам необходимо скачать и установить приложение Audacity Audio Editor. Данное приложение позволяет изменять тип аудиофайла, его частоту дискретизации (Sample Rate) и другие его свойства.
После установки приложения Audacity выберите в нем пункт меню Open и откройте аудиофайл, который вы хотите изменить.
Первую вещь, которую вам необходимо изменить, изменить частоту дискретизации (sampling rate) файла. Для проигрывания аудиофайла с помощью модуля ESP32 его частота дискретизации должна лежать в диапазоне от 8000 до 16000 Гц поскольку у модуля ESP32 не так много памяти чтобы поддерживать более высокие частоты дискретизации. Мы использовали частоту дискретизации 16000 Гц.
После этого выберите пункт меню File > Export > Export as WAV чтобы сохранить аудиофайл в формате .wav.
В следующем открывшемся окне выберите в качестве типа файла WAV (Microsoft) и Unsigned 8-bit PCM в качестве формата кодирования (Encoding format) и нажмите на Save.
Далее нам будет необходим генератор шестнадцатеричных кодов (Hex Editor) для формирования шестнадцатеричных кодов для аудиофайла. Скачайте данный редактор по следующей ссылке – Hex Editor (HxD). Запустите его и в нем выберите пункт File > open, после чего откройте файл .wav. В результате этого для .wav файла будет сгенерирован шестнадцатеричный код (Hex code).
Выделите весь этот код, нажав комбинацию клавиш ctrl+A, затем выберите в редакторе Hex Editor пункт меню Edit > Copy as > C чтобы скопировать выделенный код в формат языка C.
Затем вставьте этот код в Arduino IDE.
Объяснение программы для модуля ESP32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В нашей программе мы будем использовать библиотеку для работы с аудиофайлами XT DAC Audio от компании XTronical. Саму библиотеку можно скачать по следующей ссылке.
Первым делом в программе мы подключим используемые библиотеки. Файл SoundData.h содержит шестнадцатеричный код .Wav файла, который мы будем воспроизводить с помощью модуля ESP32.
1 2 |
#include "SoundData.h" #include "XT_DAC_Audio.h" |
Далее создадим объект класса XT_Wav_Class, который используется аудиоклассом DAC, передающим данные .wav в качестве параметра. Dac Audio - это объект класса основного проигрывателя, в котором 25 - это номер контакта модуля ESP32, к которому подключен модуль усилителя.
1 2 |
XT_Wav_Class Sound(sample); XT_DAC_Audio_Class DacAudio(25,0); |
Внутри функции setup() мы инициализируем последовательную связь со скоростью 115200 для целей отладки.
1 2 |
void setup() { Serial.begin(115200); |
Внутри функции loop() мы будем заполнять буфер данных со звуками и проверять проигрывается ли звук или нет. Если нет, то мы будем воспроизводить звук в цикле.
1 2 3 4 5 6 |
void loop() { DacAudio.FillBuffer(); if(Sound.Playing==false) DacAudio.Play(&Sound); Serial.println(DemoCounter++); } |
Тестирование работы аудиоплеера
Подключите динамик (громкоговоритель) к контакту GPIO 25 модуля ESP32 через LM386 или другой подходящий модуль усилителя. Затем подключите модуль ESP32 к компьютеру и загрузите в модуль код программы. После загрузки кода программы в модуль ESP32 он начнет воспроизводить аудиофайл, записанный в файле SoundData.h. Громкость воспроизведения файла можно изменить с помощью потенциометра на модуле усилителя.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include "SoundData.h" #include "XT_DAC_Audio.h" XT_Wav_Class Sound(sample); XT_DAC_Audio_Class DacAudio(25,0); uint32_t DemoCounter=0; void setup() { Serial.begin(115200); } void loop() { DacAudio.FillBuffer(); if(Sound.Playing==false) DacAudio.Play(&Sound); Serial.println(DemoCounter++); } |
не получается вот такие ошибки
exit status 1
'class XT_Wav_Class' has no member named 'Completed'
Наверное, библиотеки с момента написания статьи немного изменились. Вы пробовали код, предложенный ниже в комментариях пользователем Rust?
Тоже проблема , Ошибка компиляции для платы ESP32 Dev Module. Пробовал разные платы в настройках ничего не меняется. Другие примеры работают нормально.
Наверное, что то с момента написания оригинала данной статьи изменилось в подключаемых в данном проекте библиотеках. К сожалению, пока не могу помочь в данном вопросе
При компиляции скетча из примера выдает ошибку exit status 1 "Sample" was not declared in this scope
А вы библиотеку для работы с аудиофайлами установили?
Да проверял всё , смотрел из исходника та же проблема
Сожалею. Но пока что не могу больше ничем помочь потому что нахожусь в отпуске
\\вот так всё работает
#include "SoundData.h";
#include "XT_DAC_Audio.h";
XT_Wav_Class ForceWithYou(Force);
XT_DAC_Audio_Class DacAudio(25,0);
void setup() {
Serial.begin(115200);
}
void loop() {
static uint32_t i=0;
if(ForceWithYou.Completed)
DacAudio.PlayWav(&ForceWithYou);
Serial.println(i);
i++;
Да, спасибо за ценный комментарий