Odtwarzacz radia internetowego na ESP8266, cz. 1

Napisano dnia 10.08.2015 r. o godzinie 9:00
Autor: Piotr Sperka

Wstęp

Około rok temu pracowałem nad odtwarzaczem radia internetowego (SHOUTcast). Wtedy realizowałem go na zestawie STM32, VS1053 jako dekoder MP3, OGG, itp. oraz ENC28J60 do połączenia z siecią LAN. Projekt ten doprowadziłem do działania, jednak nigdy nie wyszedł poza prototyp złożony na płytkach prototypowych. Stało się tak głównie z uwagi na jego największą wadę – konieczność połączenia z siecią poprzez kabel.

ESP8266

Kilka miesięcy wstecz dowiedziałem się od kolegi o ciekawym układzie – ESP8266. Dostępny jest on w postaci niewielkich modułów składających się z mikrokontrolera, pamięci i innych niezbędnych do działania elementów. Układ ten posiada wbudowane peryferia do obsługi sieci WiFi, a co więcej, jego producent dostarcza SDK składające się z wszystkich potrzebnych składników umożliwiających stosunkowo proste pisanie na niego programów. Standardowo do układu wgrane jest oprogramowanie umożliwiające obsługiwanie go poprzez komendy AT. Największą jednak jego zaletą jest niska cena – około 25zł. Początkowo byłem do niego nieco sceptycznie nastawiony, jednak z uwagi na cenę zakupiłem jeden do eksperymentów i bardzo miło się zaskoczyłem. Moduł działa bardzo stabilnie, jest do niego dostępna duża ilość różnego alternatywnego oprogramowania, np. wspierającego język skryptowy LUA. Jednakże największa siła ESP8266 tkwi w dostarczonym SDK, gdyż w krótkim czasie można napisać sprawnie działające oprogramowanie. Do zaprogramowania modułu nie potrzeba żadnych specjalnych narzędzi, gdyż posiada bootloader umożliwiający programowanie poprzez UART. Testowany przeze mnie układ miał wtedy w zasadzie jedną zasadniczą wadę – mało wyprowadzeń. Posiadał tylko UART w najprostszej postaci (Rx i Tx) i chyba 2 GPIO. Biorąc pod uwagę moje wcześniejsze testy postanowiłem wskrzesić projekt odtwarzacza radia internetowego, jednak tym razem korzystający z sieci bezprzewodowej.

Moduł ESP8266 - ESP-01

Moduł ESP8266 – ESP-01

Pierwsza koncepcja

W pierwszym wariancie układ miał być konfigurowany poprzez UART i następnie tą samą drogą odsyłać dane do mikrokontrolera STM32, który zajmować się miał ich buforowaniem i przesyłaniem do układu VS1053, a także obsługą interfejsu użytkownika (LCD, itd.). Wykonałem nawet prototyp układu, jednak z uwagi na brak kontroli przepływu przez UART, konieczne by było stosowanie bardzo dużych pamięci buforujących i pojawiały się problemy przesłaniem jakichkolwiek innych danych (np. metadanych stacji) podczas odtwarzania. Wtedy też ponownie porzuciłem projekt.

Druga koncepcja

Nieco później pojawiły się w sprzedaży nowe wersje modułów – ESP-07 i ESP-12, posiadające już nieco więcej wyprowadzeń, w tym sprzętowe SPI, co otwarło nowe możliwości. Postanowiłem pozbyć się z projektu mikrokontrolera STM32, a dane do dekodera VS1053 przesyłać poprzez SPI bezpośrednio z układu ESP8266. Obecnie układ w wersji prototypowej gra, jednak nie posiada jeszcze wszystkich elementów, jak np. „sprzętowego” interfejsu użytkownika, który będzie się komunikował z ESP8266 poprzez UART, czy dołączonej pamięci EEPROM do zapisu stacji.

Prototyp odtwarzacza radia internetowego

Działający prototyp odtwarzacza radia internetowego

Podsumowanie

Na chwilę obecną zaimplementowana jest obsługa VS1053, działa prosty klient i serwer www do wyświetlania panelu administracyjnego. Sam panel posiada już działające najprostsze funkcje. W najbliższym czasie opublikuję ostateczny schemat urządzenia, natomiast powstający kod można zobaczyć na GitHubie. W kolejnych częściach artykułu opiszę więcej szczegółów oraz postępy z prac. Planuję także zamieścić tutorial na temat instalacji środowiska programistycznego dla ESP8266 pod linuksem, gdyż pomimo istnienia wielu poradników nie jest to takie oczywiste i proste zadanie. Na koniec standardowo – jeżeli masz jakieś pytania lub pomysły, napisz do mnie. Z chęcią się do nich ustosunkuję.

Zapraszam do drugiej części artykułu.

Panel administracyjny odtwarzacza radia internetowego

Panel administracyjny odtwarzacza radia internetowego – prototyp

Komentarze

  • i didnt wanted to disturb you again in github…
    this time i hooked up ESP8266-12e with VS1053 (same board as in your pic).
    and again no luck. In app/user/user_main.c i changed:
    UART_SetBaudrate(0,115200);
    sprintf(config->ssid, „xxxx”);
    sprintf(config->password, „xxxx”);
    compiled without errors:
    !!!
    Support boot_v1.4 and +
    Generate user1.4096.new.6.bin successully in folder bin/upgrade.
    boot.bin————>0x00000
    user1.4096.new.6.bin—>0x01000
    !!!

    using ./flash.sh boot and bin is flashed. Rebooting ESP and nothing on serial and nothing on my wifi acces point (does not trying to connect to wifi)

    rechecked all wires, esp connected to 3.3v and vs1053 to 5v.
    both modules works, esp was checked with LUA and Arduino IDE, also vs1053 is working fine when coonected to my different arduino mp3 player.

    Any ideas?

  • seems like i burned rx on esp-12e as it was not 5v tolerant
    i manage to flash esp-01 and i therte was console output ons it connected to my wifi.
    When i tryed to play custom url it reboots.
    Which esp is suggested? and flash size? 512k or 4MB ?

    • I am developing this device on ESP12 with 4MB (32Mbits) flash. You can use smaller flash, but a least 1MB (8Mbits). However, you need to change build and flash settings and change EEPROM_START definition in eeprom.c. Fatal exception (28) that you get is probably caused by wrong linker script used to compile code (ex. code compiled with script for 4MB flash used in device with 1MB flash).

  • what could be reason for :
    reconnect
    scandone
    add 0
    aid 1
    cnt
    rm 0
    reconnect
    scandone
    add 0
    aid 1
    cnt
    rm 0
    reconnect
    scandone
    add 0
    aid 1
    cnt
    ……

    it just repeats when tryed to play custom url

  • another error when trying play custom url:

    Name: /instant_play

    ##CLI.STOPPED#

    ##CLI.URLSET#

    ##CLI.PATHSET#

    ##CLI.PORTSET#
    Socket created
    Socket connected
    Fatal exception (28):
    epc1=0x4000bf80
    epc2=0x00000000
    epc3=0x4000bf80
    epcvaddr=0x00000000
    depc=0x00000000
    rtn_add=0x40002ad0

    ets Jan 8 2013,rst cause:1, boot mode:(3,0)

    load 0x40100000, len 1396, room 16
    tail 4
    chksum 0x89
    load 0x3ffe8000, len 776, room 4
    tail 4
    chksum 0xe8
    load 0x3ffe8308, len 540, room 4
    tail 8
    chksum 0xc0
    csum 0xc0

    2nd boot version : 1.4(b1)
    SPI Speed : 40MHz
    SPI Mode : QIO
    SPI Flash Size & Map: 32Mbit(512KB+512KB)
    jump to run user1 @ 1000

  • got esp-7 with 32mbit flash, flashed bin from github, connected to wifi and played sample from readme: ant-kat-01.cdn.eurozet.pl.
    On my router i see that there is active connection to ESP so i belive it receives stream, also on web interface it shows radio info.
    But unfortunately there is no sound on vs1053 module output.
    i have verified that vs1053 gpio0 and gpio1 is pulled down thought 100k resistor. also vs1053 module works ok with arduino

  • one more thing….
    on your chematic on esp gpio15 is connected directly to xcs of vs1053.
    does gpio15 have to be pulled down to ground on esp?

    • First thing you can try is calling VS1053_SineTest() after VS1053_Start(). You should get sine, about 1kHz on headphones output. Next thing is calling VS1053_regtest() after VS1053_Start() – it prints some VS1053’s registers values. You can also check your wires. If you have too long wires, VS1053 will hang. Last thing – yes, I have 15k pull-down on GPIO15, and also 15k pull-up on GPIO0, GPIO2 and EN (CH_PD).

  • it works, i was going through your schematic and source code and found that in schematic you incorrectly swapped esp gpio’s 4 and 5 while on vs1053.h it’s defined:
    #define XDCS_PIN 5 //GPIO5 (!)
    #define DREQ_PIN 4 //GPIO4 (!)

    so i swapped those 2 cables on my breadboard and now sound is coming out.

  • my vs1053 board by default is missing a trace or resistor to make it play mp3’s. The board boots the VS1053 chip in midi mode. To force it boot into mp3 mode it is necessary connecting pin 33 and 34 together. example shown in pic:
    http://www.bajdi.com/wp-content/uploads/2013/06/LCsoft-VS1053-MP3-module.jpg

    i soldered pins together and board booted into mp3 mode. But i did not liked this solution as it involves soldering and hardware modification.

    So solution was to do changes in software: vs1053.c
    ICACHE_FLASH_ATTR void VS1053_Start(){
    VS1053_ResetChip();

    // these 4 lines makes board to run on mp3 mode, no soldering required anymore
    VS1053_WriteRegister(SPI_WRAMADDR, 0xc0,0x17); //address of GPIO_DDR is 0xC017
    VS1053_WriteRegister(SPI_WRAM, 0x00,0x03); //GPIO_DDR=3
    VS1053_WriteRegister(SPI_WRAMADDR, 0xc0,0x19); //address of GPIO_ODATA is 0xC019
    VS1053_WriteRegister(SPI_WRAM, 0x00,0x00); //GPIO_ODATA=0

    while(VS1053_checkDREQ() == 0);
    …….

    i disconect pin 34 from 33 and software mod did the trick.

  • Własnie tego szukałem od dawna!!!!
    Jest wiele projektow nawet z softwerowym mp3 ale ja chcialem to podłaczyc do vs1053 ze wzgledu na jakosc dzwieku .Znalazlem na ruskiej stronce dzialajcy soft z oledem na ssd1306 ,jednak bez bufora tnie mimo dobrego neta.Probowalem tez na avrku z enc28j60 działa ale wole cos bezprzewodowo ;)Fajnie by bylo tez z lcd np.ls020 ,kolorowy il lub zwykly hd44780 .Goraco Pozdrawiam !!!!

    • Do odtwarzacza będzie dorobiony „interfejs użytkownika” z kilkoma przyciskami, enkoderem i właśnie wyświetlaczem, prawdopodobnie graficznym 128×32, jak tylko znajdę dłuższą chwilę żeby to wszystko dokończyć.

      • Ja zamiast enkodera dodam prosty rc5 (coz lenistwo :)) na avrku mam juz gotowe biblioteki.Mozna i by bylo ir na esp ale znalazlem tylko pod arduino.Wszystko fajnie tylko niemoge wyprobowac softu kolegi bo pod win7 sypie bledami,instaluje toolchaina na debiana bo niepotrafie znalezc przyczyny.Wchodzi do folderu i po pewnym czasie mam caly ram zajety(8gB).Cos jest z tym makefilem bo inne kompiluje bez problemu.

  • Hi peter.Great project.
    I have esp-12 with 512kB flash,all working but playing only 10sec max..where is the problem??I am using your final bin

  • Witam.Mógłbyś zamieścić schemat układu w pdf gdyż brakuje mi niektórych bibliotek w kicad i nie mam pełnego schematu

  • Hello Peter!
    Really great work, i have one question: is it possible to use your code with the PWM-Hack like espressif did? https://github.com/espressif/ESP8266_MP3_DECODER
    https://github.com/pvvx/mp3_decode

    There is no need of audio decoder. The RX-Pin outputs an PWM that can be filtered with an RC components and you have sound…. and in my opinion great quality!
    https://www.youtube.com/watch?v=XIneZEfahmQ

    I use the code from espressif on my ESP12E but your solution with the webinterface is better, because you can change the stream-url without to flash new binary.

    Is it possible that you compile one version with the espressif (https://github.com/espressif/ESP8266_MP3_DECODER) code and with your configuration webserver? Please give it a try

    Best regards

  • this code from espressif with PWM/Delta-Sigma and your webserver (maybe one button to switch the radio stations) would be really great!

    see my example video https://www.youtube.com/watch?v=0x3uky_B_20
    i used source from https://github.com/pvvx/mp3_decode

  • Witam
    zastanawiam się czy nie da się zrobić tego bez vs1053.
    Jest on stanowczo za drogi więc czy da się jakoś zrobic radio internetowe po wifi bez tego układu

  • Hi,

    I made some minor improvements on your great project.
    Added m3u and pls redirection, stability and many little upgrade.
    https://github.com/karawin/ESP8266-WebRadio

    Thanks

  • Could you please provide a schema with pin connections so that it will be more obvious which pin from ESP8266 should be connected to VS1053 module?

    Thanks in advance.

  • Napisz odpowiedź lub komentarz

    Twój adres email nie zostanie upubliczniony.

    Możesz używać następujących tagów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>