tutoriel : streaming wifi http avec esp32 & esp32_lyrat

Notre objectif :

Mette en oeuvre la technologie ESP32 et sa variante ESP32-LyraT au travers d’un exemple consacré à la restitution locale d’un flux audio transporté en Http sur Wifi.

Nous nous donnons l’objectif d’être courts, de renvoyer vers les références documentaires disponibles sur le web, plutôt que de paraphraser les sources d’informations disponibles autour de l’ESP32 et de sa variante ESP32-LyraT.

Ce guide a été mis à jour le 3/12/2020. Les modifications portent sur des points de détail, de nature à faciliter la compréhension, et donnent plus d’explication sur l’installation des ateliers esp-adf et esp-idf pour esp32.

Diffusion du flux Deezer au sein de la maison

Les contraintes de Deezer et le choix du Wifi

Quand on souscrit un contrat Deezer, tout est fait, et c’est bien comme çà, pour limiter l’usage à la restitution des titres du catalogue sur votre smartphone ou sur votre ordinateur. Deezer ne propose pas d’application permettant par elle-même de disposer du flux d’une playlist en DLNA ou en tant que flux réseau. Le mode d’utilisation privilégié consiste à utiliser le player Deezer ou son navigateur Internet pour jouer les titres en instantané sur son smartphone ou son ordinateur portable.

Pour rappel, nous avions déjà consacré un tutoriel permettant alors de rediriger le son Deezer vers un ensemble Hifi de qualité par le biais de Bluetooth.

Ici, nous allons privilégier la rediffusion locale du son Deezer à partir du Wifi, dans la mesure où cela offre plus de flexibilité pour atteindre les différentes pièces de la maison à partir d’un diffuseur central.

La rediffusion en Wifi depuis une plateforme Linux

J’ai expérimenté deux options permettant de repiquer le signal sonore de puis la carte son de l’ordinateur Linux installé dans la pièce qui me sert de bureau et de le diffuser ensuite vers des récepteurs situés dans les autres pièces de la maison.

  • Option 1 : le serveur audio DLNA intégré à PulseAudio. Il s’installe à partir du package pulseaudio-dlna disponible sur Debian et Ubuntu. Il permet de rediffuser le flux numérisé depuis la carte son vers les récepteurs du réseau local.
xxx@debian:/etc$ sudo aptitude install pulseaudio pavucontrol pulseaudio-dlna
  • OPtion 2 : encapsulation du signal audio en tant que flux HTTP disponible à partir  un serveur local intégré à ma configuration Linux. Il s’agit pour faire cela de mettre en oeuvre les applications darkice et icecast2 disponibles sous Debian et Ubuntu.

La première solution a été testée avec la rediffusion vers mon ensemble Home-Cinema, équipé d’un player DLNA bien intégré. Par contre l’exemple de player dlna proposé sur la carte ESP32-LyraT n’a pas permis d’obtenir de résultat correct.

En tout état de cause, la configuration de pulseaudio est complexe, voire même dissuasive, ce qui conduit à la déconseiller.

C’est donc la deuxième option qui a été privilégiée, et qui se révèle d’une très bonne stabilité. Nous l’avons expérimentée sur la carte ESP32-LyraT, en adaptant l’exemple pipeline_http_select_decoder disponible sur l’atelier de développement esp-adf pour ESP32-LyraT. Les modifications proposées sur pipeline_http_mp3 permettent de sélectionner le type de codec audio, au delà du mp3, avec une liste déjà assez fournie (aac, ogg, …).

Configuration darkice et icecast2 – Linux Debian

Installation

xxx@debian:/etc$ sudo apt-get install icecast2 darkice

Configuration

La ligne de commande suivante permet de lancer la configuration du service icecast2 (fichier /etc/icecast2/icecast.xml) et de relancer le service.

xxx@debian:/etc$ sudo dpkg-reconfigure 

xxx@debian:/etc$ ps -aux | grep icecast2
icecast2  1331  0.0  0.0 443220  9988 ?        Sl   mars10   1:01 /usr/bin/icecast2 -b -c /etc/icecast2/icecast.xml
xxx 29097  0.0  0.0  12784   968 pts/0    S+   10:56   0:00 grep icecast2


Choix du codec audio utilisé par darkice

Nous choisissons de coder le flux en mp3, avce un bitrate constant. Nous avons essayé les valeurs de 192 kbit/s et 320 kbit/s, pour une qualité en 1.0, mais nous avons constaté un niveau de bruit parasite qui a disparu avec le repli à 128 kbit/s, en qualité 0.8. Notons que l’échantillonnage sous 24 bits n’est pas disponible sous darkice.

Contenu du fichier /etc/darkice.cfg
ls darkice[general]			# CONFIGURATION GENERALE DE DARKICE
duration=0                      # Durée du stream en seconde, mettre 0 pour un stream en continu
bufferSecs=1                    # Durée du buffer en seconde
reconnect=yes                   # Reconnexion automatique en cas de déconnexion
                                
[input]                         # CONFIGURATION DU DISPOSITIF D'ENTREE ET D'ECHANTILLONAGE
device=default                  # Choix du dispositif audio pour envoyer tout ce qui sort de la carte son
sampleRate=44100                # Fréquence d’échantillonnage du flux
bitsPerSample=16                # Nombre de bits
channel=2                       # Nombre de canaux
                                
[icecast2-0]                    # CONFIGURATION DE L'ENCODAGE ET DE L'ENVOI DU FLUX
bitrateMode=cbr                 # Mode d'encodage ici variable
bitrate=128
quality=0.8                     # Réglage de la qualité de 0.0 à 1.0
format=mp3                      # Choix du format du flux
server=localhost                # Adresse du server Icecast2
port=8090                       # Port du server Icecast2
password=XXXXXX                 # Mot de passe configuré pour la source Icecast2
mountPoint=toto                 # Point de montage du flux Icecast
name=phil                       # Nom de votre radio
description=Une super radio...  # La description de votre radio
url=http://localhost            # Un site utile
genre=hardcore                  # Le style de votre radio

Rendre homogène la configuration icecast2 & darkice

Port & mot de passe serveur

xxx@debian:/etc$ sudo vi /etc/icecast2/icecast.xml
xxx@debian:/etc$ sudo service icecast2 restart

Lancement du service darkice et vérification sous chrome

xxx@debian:/etc$ sudo darkice

Il est possible de vérifier la disponibilité du service par le biais du navigateur (chrome pour ce qui nous concerne) , en utilisant  l’URL qui devient la référence pour l’accès au service :

http://localhost:8090/toto

Un player reproduisant le flux audio de la carte son devrait s’ouvrir …

Configuration ESP32-LyraT

1. Création d’un répertoire projet

xxx@debian:/home/xxx$ mkdir /home/xxx/esp
xxx@debian:/home/xxx$ cd /home/xxx/esp


2. Installation de l’atelier de développement ( esp-adf ) et de la chaine de compilation ( toolchain )

Installer l’atelier esp-adf (variante esp32-lyrat), qui intègre en son sein l’atelier esp-idf (coeur esp32). Il est disponible  depuis github. Ensuite il faudra pouvoir disposer de la chaine de compilation ( toolchain esp32 ).

Ce point où il faut disposer d’éléments installés de façon compatible mériterait d’être mieux documenté dans les guides.

Pour ce qui concerne l’installation de l’atelier esp-adf, le lien actuel de documentation est celui du README.md  :

https://docs.espressif.com/projects/esp-adf/en/latest/get-started/index.html#step-1-set-up-esp-idf

J’ai choisi de m’en écarter pour ne pas avoir à installer l’atelier esp-idf de façon globale, préférant avoir recours au sous-répertoire esp-idf disponible sous esp-adf, et aussi disposer d’une toolchain dans le répertoire /home/xxx/esp plutôt que dans /home/xxx/.espressif.

Je considère que c’est plus sûr ainsi, dès lors que l’on doit pouvoir disposer d’autres versions de esp-idf, comme dans le cadre de l’atelier Arduino pour esp32, qui fait l’objet d’un autre tutoriel sur le site.

Etape 1 : 
installer esp-adf : l'atelier de développement d'applications
-------------------------------------------------------------

xxx@debian:/home/xxx/esp$ git clone --recursive https://github.com/espressif/esp-adf.git

Etape 2 :
installer esp32-idf en sous-répertoire de esp-adf
-------------------------------------------------

xxx@debian: sh /home/xxx/esp/esp-adf/esp-idf/install.sh
Mais on ne lance pas la création des liens proposée avec export.sh, elle est incomplète pour notre cas avec esp-adf.

Etape 3 :
installer la chaine de compilation pour esp32
--------------------------------------------- On peut la télécharger depuis le site espressif (32/64 bit ). J'ai utilisé le lien visible par un grep de xtensa sous /home/xxx/esp/esp-adf/esp-idf/tools:
https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
Depuis cette archive téléchargée, on pourra copier le répertoire xtensa-esp32-elf dans /home/xxx/esp. Etape 4 : vérification de l'arborescence de développement
---------------------------------------------------------
Examinons le sous-répertoire principal /home/xxx/esp :

- il contient 2 sous-répertoires : esp-adf & xtensa-esp32-elf
- le sous-répertoire esp-adf contient lui-même esp-idf en tant
que sous-répertoire.

3. Définition des variables d’environnement

xxx@debian:/home/xxx/esp$ export IDF_PATH=/home/xxx/esp/esp-adf/esp-idf
xxx@debian:/home/xxx/esp$ export ADF_PATH=/home/xxx/esp/esp-adf
xxx@debian:/home/xxx/esp$ export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"

4. Création d’un sous-répertoire pour développer notre application à partir du dossier contenant les exemples

xxx@debian:/home/xxx/esp$ cp -R  esp-adf/examples/player/pipeline_http_select_decoder .
xxx@debian:/home/xxx/esp$ cd pipeline_http_select_decoder

Notes :
- le répertoire principal /home/xxx/esp contient maintenant 3 sous-répertoires
- nous avons choisi de garder le nom de l'exemple comme nom d'application, pour mémoriser plus facilement la référence à l'origine.

5. Création de la configuration

  • La carte dispose de 2 ports micro-usb qu’il faut connecter ; 1 pour l’alimentation, 1 pour la liaison avec le PC.

Ensuite il faut renseigner des options non documentées dans le menu de configuration avec les valeurs ci-dessous. Sinon ça me marche pas !

  • Example Configuration : renseigner le SSID et mot de passe Wifi
  • Partition table : custom CSV avec le nom du fichier contenu dans le répertoire exemple : partitions_http_select_decoder_example.csv
  • Component Configuration/Wifi : décocher l’option Wifi NVS Flash
  • Component Configuration/Phy : décocher les 2 options de stockage
xxx@debian:/home/xxx/esp/pipeline_http_select_decoder$ make menuconfig

6. Modification du fichier source de l’exemple

L’objectif est de renseigner le type de codec choisi (mp3) et l’URL du flux réseau Http produit par l’équipement diffuseur

  • Il s’agit de 2 lignes du fichier play_http_select_decoder_example.c, présent dans le répertoire « main »
  • Ajouter : #define SELECT_MP3_DECODER 1 et mettre en commentaires tous les autres définitions de codecs et notamment /* #define SELECT_AAC_DECODER 1 */
  • Commenter :  /* // audio_element_set_uri(http_stream_reader, selected_file_to_play); */
  • Remplacer par : audio_element_set_uri(http_stream_reader, « http://adresse_diffuseur:8090/toto »);
xxx@debian:/home/xxx/esp/pipeline_http_select_decoder$ gedit main/play_http_select_decoder_example.c

7. Compilation et chargement sur la carte esp32-lyrat

Pour placer la carte esp32-lyrat en attente de téléchargement, il faut presser la touche boot par un appui long, au milieu duquel on doit aussi presser la touche reset.

Quand la carte est en attente de chargement, on constate la présence du lien :  /dev/ttyUSB0

xxx@debian:/home/xxx/esp/pipeline_http_select_decoder$ make flash monitor

8. Lancement de l’application

  • La carte esp32-lyrat sera alimentée par son port micro-usb dédié.
  • Il faut ensuite connecter la carte esp32-lyrat à une entrée de niveau AUX sur une configuration ampli HiFi par l’intermédiaire du connecteur minijack. Attention le niveau son n’est pas réglable par l’application que nous avons chargée sur la carte esp32-lyrat elle-même !
  • En cas de coupure WiFi, il peut être nécessaire d’avoir à relancer la carte par un appui sur sa touche reset (un point faible, c’est certain).