ESP8266 I2S MP3 webradio streaming example

pvvx

Активный участник сообщества
Последнее редактирование:

shaman1010

Member
как использовать модуль I2S внутри ESP8266 для вывода звука
Это хороший шаг, плохого пока только то, что может стримить только в моно режиме. Удаленную стереосистему пока не соорудить, но в качестве удаленной говорилки (озвучивалки каких-либо действий) - вполне годный вариант.
 

pvvx

Активный участник сообщества
Дык всё зависит от кодека (ЦАП). Простые стерео в большинстве и дешевы. Модулю не хватало ЦАП - теперь можно навесить.
А "говорилки" - из 16M flash можно наговорить очень много. В том веке хватало озвучивать все названия объектов на карте, район, улица , дом, ларек и т.д. со склонениями и "приятным женским голосом" :) для крупных городов - Московской и Ленниградской области включительно с Киевом. Подпольная Гит-навигация кароче в авто (использование GPS с точностью более +-100 метров ещё было запрещено, и точных карт - тоже :) - мАсква запретила выпуск в продажу)... Словарный запас у некоторых меньше :)
 
Последнее редактирование:

shaman1010

Member
Дык всё зависит от кодека (ЦАП).
Как я понял, именно в декодировании стереопотока (по крайней мере пока) загвоздка.
Судя по их-же цитате:
"In the default configuration, this code will output 16-bit mono audio. Stereo audio is possible but hasn't been implemented yet: a stereo synth is available but has not been modified for ESP8266 use yet."
Они, похоже, пока не все из libmad смогли адаптировать.
 

pvvx

Активный участник сообщества
Как я понял, именно в декодировании стереопотока (по крайней мере пока) загвоздка.
Это у них. И выводят они звук через 5 бит ШИМ :) https://github.com/espressif/esp8266_mp3_decoder/blob/master/mp3/user/user_main.c#L83
Не всё ясно с DMA https://github.com/espressif/esp8266_mp3_decoder/blob/master/mp3/driver/i2s_freertos.c#L131
Какой-то мелкий буфер https://github.com/espressif/esp8266_mp3_decoder/blob/master/mp3/include/i2s_freertos.h#L5 :)
500кГц работает и прерывание у ESP8266 с записью пары регистров в свою тормозную внутреннюю шину к I/O периферии... Так что для стерео даже так хватит, но не останется время на софт декодирование и работу WiFi. При 44кГц - всего хватит, а если ещё есть DMA + FIFO - проблем вообще не должно быть.
 
Последнее редактирование:

shaman1010

Member
Какой-то мелкий буфер
Они там внешнюю RAM предлагают использовать под буфер.
Так что для стерео даже так хватит, но не останется время на софт декодирование и работу WiFi. При 44кГц - всего хватит, а если ещё есть DMA + FIFO - проблем вообще не должно быть.
Вот с декодированием стерео у них и загвоздка.
Здесь проще (и логичней ИМХО) использовать внешний декодер+усилитель+RAM и желательно в одном корпусе :) А на esp-шку возложить стрим потока, управление внешним корпусом, и оставить ресурсы на более привычные для микроконтроллера задачи.
Есть что-то вменяемое однокорпусное? (декодер+усилитель+RAM)
 

pvvx

Активный участник сообщества
Они там внешнюю RAM предлагают использовать под буфер.
Буфер тут нужен для другого. Для декодировальщика и входного потока, если принимаем по WiFi...

Вот с декодированием стерео у них и загвоздка.
Пишут что работает полное декодирование, но просто ещё либу не адаптировали на "стерео". Либа то тупая и похоже не работает по прерываниям... :)
Есть что-то вменяемое однокорпусное? (декодер+усилитель+RAM)
Бывает, но наф. не сдался.
Нужен только DAC для вывода двух каналов, остальное - пусть дети балуются с их либами.
Применение DAC не только для MP3 с одним типом кодирования. DAC - есть DAC и он выводит аналоговый сигнал к примеру для управления балансировкой сельсинами :)
 
Последнее редактирование:

amatron

New member

pvvx

Активный участник сообщества
Работает только с 1024 flash?
Смотря где хранятся данные mp3 и как всё используется...
Итог трансляции примера mp3 (без оптимизаций и изменений):
Код:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8678|    1656
    rodata|           ReadOnly Data (RAM)|    3FFE8680|    3FFE9F94|    6420
       bss|      Uninitialized Data (RAM)|    3FFE9F98|    3FFF5E30|   48792
      text|            Cached Code (IRAM)|    40100000|    40107EF0|   32496
irom0_text|           Uncached Code (SPI)|    402A0000|    402DF620|  259616
Total Used RAM : 56868
Free RAM : 25052
Free IRam : 290
Т.е. коду для flash всего 250 килобайт - успешно пакуется в 512к flash
------
Как продолжение, про:
Есть что-то вменяемое однокорпусное? (декодер+усилитель+RAM)
Похоже, в качестве DAC, можно повесить и простейший tda1545 (ставился в очень старых CD-ROM, в DIP корпусе :) ).
На STM32F4-Discovery стоит DAC/ADC с усилителем CS43L22 (у него управление конфигом по I2C).
Надо как-то протестировать I2S...

Полный декодер mp3 и т.д., без всяких буферов и прочего, делается из второго модуля типа ESP-12 на базе, к примеру SDKnoWiFi. Там выходит более 80 кило RAM + 30 кило IRAM + 512к Flash для кодека/декодека. Прибавив простой audio ADC/DAC получите то, что хотели. :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
По поводу вывода MP3 с данной либы можно написать буферизированный вывод по прерываниям в UART TX, в качестве ШИМ выхода. UART ставится хоть на 10Mbits/sec и имеет аппаратное FIFO в 128 байт (при 10Mbit/s FIFO надо обновлять по прерыванию всего в 8кГц). Получаем дискретизацию выхода ШИМ в 10MHz и будет работать на ESP-01 на выход TX отладки, оставив RX-TX от UART0 для другого использования. UART выход у ESP8266 работоспособен до 20Mbaud, но уже начинает сказываться биение частоты стробирования i/o...
На SPI сложнее - там буфер меньше (64 байта) и сложнее обслуживать, т.к. не дано, как связать её с DMA, но достигаемая дискретизация до 80MHz.
Возможно воспользоваться и встроенным в ESP8266 аппаратным ШИМ контроллером, но там ещё не до конца разобрали как ставить делитель и "прешкалер" и возможности использования буферизации с ним (типа DMA). Он работает на любой вывод GPIOx модуля.
 
Последнее редактирование:

pvvx

Активный участник сообщества
ESP8266 MP3 webradio streaming player для 512 килобайт Flash без дополнительного оборудования.
Используется буфер в IRAM на >20 килобайт, за счет уменьшения "кеш" для flash (процу вполне хватает 16к для "кеш", IRAM расширена на 48k).
Работает на ESP-01 и других модулях с 512 килобайт Flash, выход ШИМ на GPIO2.
Проверить можно напрямую подключив наушники через 200 Ом к GPIO3 (RXD) :)
Тот, что есть ШИМ, от оф. исходников пока не менял - он хрипучий (5 бит) :) Потом допинаю, если ноги дойдут до него... :)
Меняйте установки соединения тут: https://github.com/pvvx/mp3_decode/blob/master/app/user/playerconfig.h#L7
И что проигрывать, там-же, далее. Или прикручиваете какой интерфейс...
Код:
Number of segments: 3
SPI Flash Interface: QIO
SPI CLK: 80MHz
Flash size: 512K
Entry point: 40100004
Segment 1: offset: 40100000, size: 27240
Segment 2: offset: 3ffe8000, size: 1704
Segment 3: offset: 3ffe86b0, size: 6588
Found free IRAM: base:40106a68, size:21912 bytes


Hardware initialized. Waiting for network.
mode : sta(18:fe:34:9f:c0:bf)
add if0
scandone
add 0
aid 2
cnt

connected with mns.ru-6446, channel 1
dhcp client start...
ip:192.168.1.50,mask:255.255.255.0,gw:192.168.1.1
Connecting to server 145.58.52.149...
Reading into SPI RAM FIFO...
MAD: Decoder start.
dec err 0x0101 (lost synchronization)
dec err 0x0101 (lost synchronization)
dec err 0x0235 (bad main_data_begin pointer)
dec err 0x0235 (bad main_data_begin pointer)
Rate 48000
Buffer fill 14096, DMA underrun ct 0, buff underrun ct 0
Buffer fill 21865, DMA underrun ct 0, buff underrun ct 0
Buffer fill 21889, DMA underrun ct 0, buff underrun ct 0
Buffer fill 21881, DMA underrun ct 0, buff underrun ct 0
Buffer fill 21857, DMA underrun ct 0, buff underrun ct 0
...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Пока ещё есть беды в текущей версии вывода c декодека - поток медленно накрывается, после каких-то сбоев:
Код:
Buffer fill 1625, DMA underrun ct 31, buff underrun ct 131
Buffer fill 2845, DMA underrun ct 31, buff underrun ct 132
Buffer fill 2050, DMA underrun ct 31, buff underrun ct 133
Buffer fill 3406, DMA underrun ct 31, buff underrun ct 135
Buffer fill 2610, DMA underrun ct 31, buff underrun ct 136
Buffer fill 1814, DMA underrun ct 31, buff underrun ct 137
Buffer fill 3171, DMA underrun ct 31, buff underrun ct 138
Buffer fill 2375, DMA underrun ct 31, buff underrun ct 139
Что там надо поправить ещё не разбирался. Стартовый вариант с оф. сайта вообще работал 20 сек и скорость вывода уходила до сплошного шума... Что-то поправил, чтобы не уплывала - уже забыл.. :) Надо много там править, до полноценной рабочей версии. Кто-бы взялся... Но либы от RTOS там страшные и дремучие: ещё стоят опросы таймера в процедурах записи/стирания секторов flash как затычки...
------
Исправил программу для ESP-01 модулей. У них GPIO15 замкнут на GND и чип перегревается выводя туда I2SO_BCK :). Переключил выход на сигма-дельту преобразование...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вывод звука PWM/Delta-Sigma...
Звук к ролику записан с модуля как показано на фото, через резистор и конденсатор с порта GPIO3 (RXD) на саунд в комп. :)
На плате к модулю ESP-01 стабилизатор 5 в 3.3В, резисторы "подтяжки" пинов, переключатель и кнопка сброса + разъемы.
Играет этот канал: http://icecast.omroep.nl/3fm-sb-mp3
 
Последнее редактирование:

anakod

Moderator
Команда форума
pvvx, без преувеличения блестящая работа. Я начал изучение с нового проекта mp3_decode и не сразу въехал что все вкусное в Ваших старых проектах (а здесь только бинарнки).

Поделитесь подробностями? Я думаю, в принципе разобрался, но было бы интересно услышать больше деталей. Верно ли что:
  • Мы без каких либо проблем получаем дополнительные 16 Кб памяти (это фиксированное значение?) для использования в произвольных целях
  • Собственно вся магия через один из параметров Cache_Read_Enable
  • Единственное ограничение: доступ должен производиться по адресам кратным 32 бит и размерам кратными 32 бит
  • Все пространство которое раньше оставалось свободным в IRAM после компиляции, теперь может быть так же задействовано в интересующих нас целях
Вы уже задумывались об использовании этой памяти для веб буфферов (LWIP или пользовательских) либо переноса в них служебных буферов из Espressif SDK/Open SDK/RAM методов(?) которые сейчас съедают порядочное количество RAM памяти

Главное ни в коем случае не говорите LUA адептам. Это же реально граль - идеальное место для кеширования кода и хранения исполняемых прошивок не занимая основную память

(если что, я шучу)
 

pvvx

Активный участник сообщества
pvvx, без преувеличения блестящая работа. Я начал изучение с нового проекта mp3_decode и не сразу въехал что все вкусное в Ваших старых проектах (а здесь только бинарники).
Там патченные кривые-дремучие-китай-либы от RTOS. Патчено Cache_Read_Enable(0,0,0).
Вы уже задумывались об использовании этой памяти для веб буфферов (LWIP или пользовательских) либо переноса в них служебных буферов из Espressif SDK/Open SDK/RAM методов(?) которые сейчас съедают порядочное количество RAM памяти
У меня в Web хватает памяти и без этого. Этот кусок предполагается задействовать только для оверлеев. Тем более он включается/отключается от кеша flash находу.
Главное ни в коем случае не говорите LUA адептам. Это же реально граль - идеальное место для кеширования кода и хранения исполняемых прошивок не занимая основную память

(если что, я шучу)
LUA адептам сколько не дай IRAM - всё уйдет в Ноду :) Т.е. в код бездарных портировщиков.
 
Последнее редактирование:

anakod

Moderator
Команда форума
У меня в Web хватает памяти и без этого. Этот кусок предполагается задействовать только для оверлеев.
Вы же сами все жаловались что памяти в чипе мало ;)
А если серьезно это действительно очень интересное открытие, которое можно применить для множества разных задач, в том числе конечно и в оверлеях
 

pvvx

Активный участник сообщества
Вы же сами все жаловались что памяти в чипе мало ;)
А если серьезно это действительно очень интересное открытие, которое можно применить для множества разных задач, в том числе конечно и в оверлеях
Только не в Espressif SDK :) Я боялся его публиковать, т.к. Espressif его забьет свом бездарным кодом... Но для MP3 не было буфера....:(
В памяти ROM-BIOS есть ещё 2 кило на буфера в два куска. Они отмечены в Web свалке в ld. Но последний буфер может пересекаться со стеком CPU, если бездарно писано приложение, затерев и другие переменные ROM-BIOS... Он назначен для загрузки ROM-BIOS в режиме SIP или как-то так (название этого режима не известно и не придумано и не опубликовано китайцами), но не используется при стандартной загрузке...
Буфер, хвост, в IRAM я давно пользую - там для Web храню результаты сканирования станций и т.д... По этому всегда и говорил - нефиг пользовать IRAM для бездарного кода. Практически всё работает из Flash, включая и вызовы обработчиков аппаратных прерываний. Только писать код надо правильно...
А так пока беда с компиллером - он всю память сжирает под bss и кода, работающего по одному адресу делать не умеет (только если ему всё дать через ..опу).
 
Последнее редактирование:

goodwin

Member
Неплохой вариант audio DAC - UDA1334ATS. Недорого и доступно. Именно с такими буковками в конце. Он не требует внешнего сигнала тактирования, ибо у него есть внутренний PLL, синхронизирующийся от клока I2S. Получается весьма достойное качество звука без использования тактового генератора с малым джиттером. Есть встроенный фильтр на выходе. Поддерживает частоту сэмплирования от 8 до 96 кГц, моно/стерео, 16/24 бит. Усилителя мощности правда нет, как и управления по I2C. Делал на таком (+LPC1758 + 2 CAN драйвера) когда то MP3 плеер с USB флэшек для штатной магнитолы Ford, прикидывающийся CD чейнджером.
 

Вложения

Последнее редактирование:
Сверху Снизу