2020-12-31
md
Radio internet avec le ESP32
<-Lecteur de postes de radio sur Internet avec MOC

Initialement; c'était un lecteur de radio Internet basé sur le Raspberry Pi ou un autre petit ordinateur monocarte que je voulais construire. D'ailleurs, un prototype qui canalisait la sortie audio vers l'entrée AUX d'un récepteur stéréo compact dans le salon fonctionnait. Cependant, c'est une version minimaliste basée sur la puce ESP32 dont la réalisation a demandé moins de trois heures qui est en place actuellement. Ce temps inclut le débogage d'un problème auto-infligé et la construction d'un châssis et boîtier en carton. Ce n'est pas joli, mais c'est fonctionnel et c'est un excellent banc d'essai.

Table of contents

  1. La genèse
  2. Matériel
  3. Logiciel
  4. Problèmes initiaux et succès
  5. La carte ESP32 devkit v1 de DOIT
  6. Amélioration
  7. Affichage LCD1602
  8. Intégration domotique
  9. À venir

La genèse toc

En avril, Andreas Spiess The Guy with the Swiss Accent a publié une vidéo intitulée DIY Internet Radio using an ESP32 (Arduino IDE) qui m'a fait penser que je pourrais peut-être essayer cette approche. Cependant, à l'époque, je n'avais pas d'ESP32. Il y a environ un mois, Ralph S Bacon présentait une vidéo, TFT Touch Screen ILI9341 SPI for ESP32 (Internet Radio Research), sur le même sujet. Cette fois, j'avais un devkit v1 de DOIT, une autre carte de développement ESP32 générique à 38 broches et quelques cartes TTGO T-Display sous la main. J'ai donc commandé un décodeur/lecteur MP3 basé sur la puce VS1053. En fait, j'en ai commandé quelques-uns auprès de différents fournisseurs, car obtenir des pièces en provenance de Chine donne des résultats aléatoires en cette période de pandémie. Étonnamment, le décodeur est arrivé par la poste il y a deux jours. Je ne me souviens pas avoir jamais reçu un petit article de Chine en moins d'un mois.

Un projet GitHub, ESP32-Radio, d'Ed Smallenburg (Edzelf) est le point de départ pour Andreas et Ralph (*), mais fidèles à leur nature, ils ont adopté des approches très différentes pour ce qui est du logiciel. Andreas, toujours l'ingénieur rationnel, à mis en œuvre le projet Ed Smallenburg montrant comment il a résolu quelques problèmes rencontrés. Par contre, Ralph, voulait apprendre quelque chose et a donc décidé de mettre en œuvre le micrologiciel à partir de zéro. Normalement, j'imiterais Ralph pour la même raison que lui. Cependant, un mois plus tard, il publie toujours des vidéos sur le sujet. Bien que je trouve les vidéos intéressantes, je n'ai pas vraiment le temps à consacrer à ce projet. J'ai donc décidé d'emprunter la voie facile et de simplement mettre en œuvre un projet basé sur ESP32-Radio.

(*)
Désolé pour la familiarité; je n'ai jamais rencontré ces deux messieurs. Cependant, je les ai régulièrement invités chez moi par l'entremise de YouTube, bien sûr, et j'ai donc l'impression qu'ils font en quelque sorte partie de mon cercle. Ça doit être dur d'être une star ;-).

Matériel toc

Voici une liste exhaustive de pièces pour une radio Internet minimaliste.

Voici le schéma de câblage, qui est copié du document LibreOffice intitulé ESP32-radio.odt, provenant du référentiel du projet ESP32-radio.

ESP32VS1053Signal
GPIO321XDCS
GPIO52XCS
EN3XRST
GPIO44DREQ
GPIO185SCK
GPIO236MOSI
GPIO197MISO
GND8GND
5V95 V

Logiciel toc

J'ai créé un projet PlatformIO vide nommé esp32_radio pour une carte DOIT ESP32 DEVKIT V1. Ensuite, j'ai modifié le fichier de configuration platformio.ini comme suit.

; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library storages ; Advanced options: extra scripting ; ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html [platformio] default_envs = esp32dev [extra] baud = 115200 [env] platform = espressif32 framework = arduino monitor_speed = ${extra.baud} [env:esp32dev] board = esp32dev build_flags = -D LED_BUILTIN=2 -D SERIAL_BAUD=${extra.baud} [env:esp32doit-devkit-v1] board = esp32doit-devkit-v1 monitor_speed = ${extra.baud} build_flags = -D SERIAL_BAUD=${extra.baud}

C'est une version un peu simplifiée de mon fichier de configuration "standard" pour les projets ESP32 qui me permet de basculer entre différents types de cartes ESP32 que je possède. Notez comment defaul_envs dans la section [platformio] est défini esp32dev parce qu'en fin de compte j'ai utilisé la carte de développement générique. Après avoir ouvert un terminal dans le répertoire du projet, j'ai téléchargé le package ESP32-Radio depuis le référentiel.

michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ wget https://github.com/Edzelf/ESP32-Radio/archive/master.zip --2020-12-04 17:09:54-- https://github.com/Edzelf/ESP32-Radio/archive/master.zip ... master.zip [ <=> ] 7,36M 11,4MB/s ds 0,6s 2020-12-04 17:09:55 (11,4 MB/s) - «master.zip» enregistré [7718518] michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ unzip -j master ESP32-Radio-master/Esp32_radio/* -d src Archive: master.zip cac92801382b67c0ba14378fa94804a65714a662 inflating: src/CH376.h inflating: src/Dummytft.h ... inflating: src/radio_css.h

Dans les étapes suivantes, la source main.cpp par défaut créée par PlatfomIO dans a été supprimée et l'extension .ino du croquis Arduino a été renommée.

michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ ls src about_html.h config_html.h favicon_ico.h LCD2004.h oled.h bluetft.h defaultprefs.h ILI9341.h main.cpp radio_css.h bluetft_ucg.h Dummytft.h index_html.h mp3play_html.h SDcard.h CH376.h Esp32_radio.ino LCD1602.h NEXTION.h SSD1306.h michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ rm src/main.cpp michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ mv src/Esp32_radio.ino src/Esp32_radio.cpp michel@hp:~/Documents/PlatformIO/Projects/esp32/esp32_radio$ ls src about_html.h config_html.h favicon_ico.h LCD2004.h radio_css.h bluetft.h defaultprefs.h ILI9341.h mp3play_html.h SDcard.h bluetft_ucg.h Dummytft.h index_html.h NEXTION.h SSD1306.h CH376.h Esp32_radio.cpp LCD1602.h oled.h

En fait, je n'ai pas utilisé la ligne de commande pour faire ces choses, préférant travailler avec le gestionnaire de fichiers Double Commander qui est très utile pour de telles tâches. L'étape suivante consistait à modifier un peu le code source. Premièrement, comme une carte SD et une clé USB ne sont pas utilisées comme systèmes de fichiers locaux, leur bibliothèque respective a été éliminée. Deuxièmement, l'écran TFT factice est sélectionné, car encore une fois, ce matériel ne fait pas partie de la configuration minimaliste. Tout cela est près de la ligne 171 de Esp32_radio.cpp.

// Define type of local filesystem(s). See documentation. //#define CH376 // For CXH376 support (reading files from USB stick) //#define SDCARD // For SD card support (reading files from SD card) // Define (just one) type of display. See documentation. //#define BLUETFT // Works also for RED TFT 128x160 //#define OLED // 64x128 I2C OLED #define DUMMYTFT // Dummy display //#define LCD1602I2C // LCD 1602 display with I2C backpack //#define LCD2004I2C // LCD 2004 display with I2C backpack //#define ILI9341 // ILI9341 240*320 //#define NEXTION // Nextion display. Uses UART 2 (pin 16 and 1

J'ai aussi changé Serial.begin(115200) (ligne 3239 environ) dans la fonction setup() à Serial.begin(SERIAL_BAUD) par souci de cohérence avec avec le fichier de configuration. Plein d'espoir, j'ai essayé de compiler le programme et j'ai eu une erreur: une fonction a été utilisée avant d'être déclarée. Ce n'est pas rare lors du portage de projets Arduino vers PlatformIO. Il existe 3 façons de gérer le problème.

J'ai choisi la troisième option en pensant qu'il pourrait y avoir de nombreux problèmes de ce type dans les 5500 lignes de code. En fait, il n'y en avait qu'un. La solution la plus rapide aurait donc été d'ajouter

// forward declaration void scan_content_length ( const char* metalinebf );

après la série de directives #include aux alentours de la ligne 199 du Esp32_radio.cpp. La source a ensuite été compilée et platformIO n'a eu aucun problème à télécharger le micrologiciel sur l'ESP32.

On pourrait s'arrêter ici puisque que le projet fonctionne, mais j'ai corrigé une faute de frappe et changé "mqqprefix" en "mqttprefix" à la ligne 19 du fichier defaultprefs.h. Dans le même fichier, j'ai supprimé la ligne 11 gpio_17 = resume car la commande resume a été abandonnée en 2018 pour autant que je sache. La commande stop est en fait une commande à bascule, une sorte de commande stop/reprendre ou, comme indiqué dans l'interface Web de ESP32Radio, une commande (un)STOP.

Problèmes initiaux et succès toc

Après avoir appuyé sur le bouton de réinitialisation de l'ESP32, il restait à connecter l'ESP au réseau Wi-Fi. Comme c'est souvent le cas avec les puces ESP qui ne peuvent pas se connecter à un réseau local, un point d'accès Wi-Fi a été créé. Le nom de ce réseau et son mot de passe sont ESP32Radio. Quand l'ordinateur de bureau est connecté à ce réseau, le serveur Web de Radio ESP32 est atteint à l'adresse habituelle: 192.168.4.1.

Après avoir cliqué sur Config dans le menu du haut et découvert que les préférences n'avaient pas été trouvées, j'ai cliqué sur le bouton Default au bas de la fenêtre comme suggéré. De nombreux paramètres ont alors été affichés dans la fenêtre.

# Example configuration # Programmable input pins: gpio_00 = uppreset = 1 gpio_12 = upvolume = 2 gpio_13 = downvolume = 2 gpio_14 = stop gpio_17 = resume (will not appear if correcitons to defaultprefs.h done) gpio_34 = station = icecast.omroep.nl:80/radio1-bb-mp3 # # MQTT settings mqttbroker = none mqttport = 1883 mqttuser = none mqttpasswd = none mqqprefix = none (sic - will be mqttprefix if the corrections to defaultsprefs.h) # Enter your WiFi network specs here: wifi_00 = SSID1/PASSWD1 wifi_01 = SSID2/PASSWD2 # volume = 72 toneha = 0 tonehf = 0 tonela = 0 tonelf = 0 # preset = 6 # Some preset examples preset_00 = 109.206.96.34:8100 # 0 - NAXI LOVE RADIO, Belgrade, Serbia preset_01 = airspectrum.cdnstream1.com:8114/1648_128 # 1 - Easy Hits Florida 128k preset_02 = us2.Internet-radio.com:8050 # 2 - CLASSIC ROCK MIAMI 256k preset_03 = airspectrum.cdnstream1.com:8000/1261_192 # 3 - Magic Oldies Florida preset_04 = airspectrum.cdnstream1.com:8008/1604_128 # 4 - Magic 60s Florida 60s Classic Rock preset_05 = us1.Internet-radio.com:8105 # 5 - Classic Rock Florida - SHE Radio preset_06 = icecast.omroep.nl:80/radio1-bb-mp3 # 6 - Radio 1, NL preset_07 = 205.164.62.15:10032 # 7 - 1.FM - GAIA, 64k preset_08 = skonto.ls.lv:8002/mp3 # 8 - Skonto 128k preset_09 = 94.23.66.155:8106 # 9 - *ILR CHILL and GROOVE preset_10 = ihr/IHR_IEDM # 10 - iHeartRadio IHR_IEDM preset_11 = ihr/IHR_TRAN # 11 - iHeartRadio IHR_TRAN # # Clock offset and daylight saving time clk_server = pool.ntp.org # Time server to be used clk_offset = 1 # Offset with respect to UTC in hours clk_dst = 1 # Offset during daylight saving time (hours) # Some IR codes ir_40BF = upvolume = 2 ir_C03F = downvolume = 2 # GPIO pinnings pin_ir = 35 # GPIO Pin number for IR receiver VS1838B pin_enc_clk = 25 # GPIO Pin number for rotary encoder "CLK" pin_enc_dt = 26 # GPIO Pin number for rotary encoder "DT" pin_enc_sw = 27 # GPIO Pin number for rotary encoder "SW" # pin_tft_cs = 15 # GPIO Pin number for TFT "CS" pin_tft_dc = 2 # GPIO Pin number for TFT "DC" # pin_sd_cs = 21 # GPIO Pin number for SD card "CS" # pin_vs_cs = 5 # GPIO Pin number for VS1053 "CS" pin_vs_dcs = 32 # GPIO Pin number for VS1053 "DCS" pin_vs_dreq = 4 # GPIO Pin number for VS1053 "DREQ"

On peut revoir cette définition en tout temps en appuyant sur le bouton Default plus tard. Voici la configuration que j'ai utilisée, sauf pour les données "secrètes" ou locales qui seront différentes dans chaque situation.

# MQTT settings mqttbroker = aaa.bbb.yyy.zzz mqttport = 1883 mqttuser = none mqttpasswd = none mqttprefix = ESP32Radio # Enter your WiFi network specs here: wifi_00 = NOM-DU-RESEAU/mot-de-passe # volume = 72 # preset = 6 # Some preset examples preset_00 = 109.206.96.34:8100 # 0 - NAXI LOVE RADIO, Belgrade, Serbia preset_01 = airspectrum.cdnstream1.com:8114/1648_128 # 1 - Easy Hits Florida 128k preset_02 = us2.Internet-radio.com:8050 # 2 - CLASSIC ROCK MIAMI 256k preset_03 = airspectrum.cdnstream1.com:8000/1261_192 # 3 - Magic Oldies Florida preset_04 = airspectrum.cdnstream1.com:8008/1604_128 # 4 - Magic 60s Florida 60s Classic Rock preset_05 = us1.Internet-radio.com:8105 # 5 - Classic Rock Florida - SHE Radio preset_06 = icecast.omroep.nl:80/radio1-bb-mp3 # 6 - Radio 1, NL preset_07 = 205.164.62.15:10032 # 7 - 1.FM - GAIA, 64k preset_08 = skonto.ls.lv:8002/mp3 # 8 - Skonto 128k preset_09 = 94.23.66.155:8106 # 9 - *ILR CHILL and GROOVE preset_10 = ihr/IHR_IEDM # 10 - iHeartRadio IHR_IEDM preset_11 = ihr/IHR_TRAN # 11 - iHeartRadio IHR_TRAN #

Si vous utilisez un serveur MQTT, je suggère de régler le préfixe mqttprefix sur autre chose que none car, avec cette valeur le logiciel créera une rubrique MQTT basée sur l'adresse MAC de l'ESP qui ne sera pas indélébile. Attention, cette rubrique doit être unique. J'ai gardé la liste des URL de stations Web préréglées, il est relativement simple de les changer plus tard.

Notez que toutes les définitions de broches d'entrée/sortie ont été supprimées, en particulier les trois concernant le codeur rotatif utilisé comme contrôle de volume. Lors de mon premier test, j'ai utilisé la configuration proposée par défaut et n'ai modifié que les paramètres MQTT et Wi-Fi ce qui a été la source d'un problème déroutant. En laissant ces définitions dans le fichier de configuration

  pin_enc_clk = 25      # GPIO Pin number for rotary encoder "CLK"
  pin_enc_dt = 26       # GPIO Pin number for rotary encoder "DT"
  pin_enc_sw = 27       # GPIO Pin number for rotary encoder "SW"

des fonctions d'interruption ont été attachées aux trois broches E/S. Or ces broches flottantes non connectées déclenchaient régulièrement une interruption CLK ou DT qui a été interprétée comme une baisse du volume. Assez rapidement, le volume était ramené à 0, et parce qu'on n'entendait aucun son je croyais à tort que le projet ne fonctionnait pas. Erreur stupide de ma part, qui est devenue évidente une fois que j'ai regardé la sortie de débogage sur le terminal alors que l'ESP était toujours connecté à l'ordinateur de bureau.

Pour utiliser cette nouvelle configuration, il faut cliquer sur le bouton Save pour enregistrer la configuration. Le message Config saved s'affiche pour confirmer que l'action a été exécutée. Pour que cette configuration soit utilisée, il faut redémarrer l'ESP en appuyant sur le bouton Restart. la confirmation Command accepted est écrite à l'écran, puis le point d'accès est fermé et le ESP redémarre. L'appareil a réussi à se connecter au réseau Wi-Fi local et il était facile de s'y connecter à partir d'un ordinateur Linux sur lequel avahi est installé. Tout ce que j'avais à faire est d'ouvrir l'URL esp32radio.local avec un navigateur Web.

On pourrait recourir à une recherche des services publiés selon le protocole ZeronConf sur le réseau.

michel@hp:~$ avahi-browse -d local _arduino._tcp --resolve + enp4s0 IPv4 ESP32Radio _arduino._tcp local = enp4s0 IPv4 ESP32Radio _arduino._tcp local hostname = [ESP32Radio.local] address = [192.168.1.140] port = [3232] txt = ["board=doitESP32devkitV1" "tcp_check=no" "ssh_upload=no" "auth_upload=no"]

Ce n'est pas tout à fait idiot de faire cela puisqu'il devrait être possible d'accéder directement à esp32radio.local avec le navigateur Web si avahi-browse est disponible. Cependant, c'est une astuce utile si plus d'un EsP32Radio est installé. En l'état, le nom d'hôte ne peut pas être configuré, donc tous les périphériques ESP32Radio seront annoncés comme ESP32Radio, ce qui crée un conflit. Zeroconf contourne ce problème en ajoutant un suffixe numérique pour distinguer les périphériques supplémentaires avec le même nom d'hôte. Ci-dessous, on peut voir deux instances d'ESP32Radio s'exécutant simultanément sur le réseau local.

michel@hp:~$ avahi-browse -d local _arduino._tcp --resolve + enp4s0 IPv4 ESP32Radio-2 _arduino._tcp local + enp4s0 IPv4 ESP32Radio _arduino._tcp local = enp4s0 IPv4 ESP32Radio-2 _arduino._tcp local hostname = [ESP32Radio-2.local] address = [192.168.1.138] port = [3232] txt = ["board=esp32" "tcp_check=no" "ssh_upload=no" "auth_upload=no"] = enp4s0 IPv4 ESP32Radio _arduino._tcp local hostname = [ESP32Radio.local] address = [192.168.1.140] port = [3232] txt = ["board=doitESP32devkitV1" "tcp_check=no" "ssh_upload=no" "auth_upload=no"]

Si ZeroConf n'est pas installé, mais si le serveur MQTT est disponible et si ESP32Radio a été configuré pour l'utiliser, abonnez-vous simplement à tous les messages de la radio. Un message ne contenant que l'adresse IP s'affichera à intervalles réguliers.

michel@hp:~$ mosquitto_sub -h aaa.bbb.yyy.zzz -t "ESP32Radio/#" 192.168.1.140

Puisqu'on peut définir mqttprefix dans la configuration, on peut s'assurer que chaque instance d'ESP32Radio possède un préfix différent pour qu'il soit facile de repérer l'adresse IP de chaque instance.

Si aucune des solutions ci-dessus ne fonctionne, les méthodes traditionnelles de recherche de clients IP sur le réseau devront être utilisées, telles que la recherche d'appareils connectés sur le routeur Wi-Fi.

Malheureusement, il faut avoir un peu d'expérience pour identifier l'addresse affectée à ESP32Radio que celle-ci n'est pas identifié du moins avec certains modèles de routeur. Des utilitaires tels que AngryBird Scanner ou nmap peuvent être utilisés.

Enfin, un conseil pour ceux qui découvrent la radio Internet. Soyez patient en syntonisant une station. Il peut y avoir un délai d'une minute, voire davantage, avant que ne débute la lecture d'une nouvelle station. Les impatients qui appuient successivement sur les boutons PREV ou NEXT trop rapidement seront déçus.

L'ESP32Radio fonctionne en général très bien, à quelques reprises pendant de nombreuses heures. Le flux audio peut être embrouillé pendant quelques secondes ou la connexion est peut être carrément perdue, mais cela s'est rarement produit dans les premières deux semaines d'utilisation.

On peut voir que je ne plaisantais pas sur la boîte en carton. C'est beaucoup plus joli de l'avant où il n'y a pas d'étiquette. Il y a beaucoup de place pour expérimenter avec du matériel supplémentaire.

La carte ESP32 devkit v1 de DOIT toc

En écrivant ce billet, j'ai utilisé une carte DOIT ESP32 devkit v1 tout en écoutant la radio sur la première radio Internet illustrée ci-dessus qui est construite autour d'une carte ESP32 générique. J'ai rencontré des problèmes avec la carte du DOIT comme d'autres avant. Tout d'abord, j'ai vu que certaines versions de esptool.py ne détectaient pas correctement le type de puce. C'est pourquoi j'ai ajouté l'option de ligne de commande --chip esp32 dans le fichier de configuration platformio.ini. Même avec cette addition, il faut à l'occasion essayer plus d'une fois de télécharger le micrologiciel sur l'appareil.

Lors de l'exécution, le ESP32 signalait des baisses de tension même lorsque le VS1053 n'était pas connecté à la carte et que la connexion USB du DOIT se faisait via un concentrateur alimenté. L'ESP redémarrait et s'engageait parfois dans un cycle de démarrage. J'ai fait une petite recherche sur le Web et j'ai trouvé que cela était, sans surprise, associé à la fonction WiFi.begin() connue pour demander plus de courant. Certains ont signalé une amélioration en désactivant la détection des baisses de tension Disabling the ESP32 Brownout detector and Brownout detector was triggered #168). J'ai mis en œuvre cette démarche de contournement. Pour en faire autant, incluez deux bibliothèques près du début de l'esquisse, vers la ligne 199.

#include "soc/soc.h" #include "soc/rtc_cntl_reg.h"

Puis au début de la fonction bool connectwifi() vers la ligne 2120 de Esp32_radio.cpp ajoutez les lignes:

WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector delay(100);

Enfin réactivéz la détection just avant de quitter la fonction.

WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1); //enable brownout detector return ( localAP == false ) ; // Return result of connection }

Malheureusement, ces changements n'ont pas eu de conséquences positives appréciables. De même, désactiver la détection des baisses de tension en tout temps ne donne pas de meilleurs résultats. Ed Smallenburg a proposé une solution matérielle: un gros condensateur sur terre et Vcc sur la carte DOIT. D'autres ajoutent un condensateur entre EN et la masse.

Au cours des derniers jours, j'ai éprouvé de plus en plus de difficultés avec le devkit de DOIT. J'ai essayé d'ajouter quelques condensateurs, malheureusement sans succès. Mes suspicions se portant sur la connexion USB et sur le régulateur de tension, j'ai essayé d'alimenter la carte directement sur les broches GND et VIN. Ai-je inversé les connexions ? Il n'y a eu aucune fumée ou odeur âcre, mais toujours est-il que la carte ne fonctionne plus du tout. Même le concrateur USB sur lequel était branché l'ESP a aussi écopé. À première vue, il semble que ce soit le fusible de ce dernier qui a été endommagé. Heureusement les ports USB de l'ordinateur de bureau fonctionnent correctement. Cependant, j'ai tiré leçon de ce contretemps, et il y a maintenant un module s'isolation basé sur la puce ADUM3160 entre le concentrateur USB et le port USB de l'ordinateur pour accroître la protection de ce dernier.

Amélioration toc

D²ès que mon épouse a appris qu'une station de radio Web pouvait être sélectionnée à partir de l'interface Web, elle a décrété que c'était trop complexe. En utilisant seulement quelques boutons, ou la télécommande, elle peut facilement sélectionner une station radio préréglée, pourquoi ne serait-ce pas aussi simple avec la radio Internet? Elle a raison.

Le projet ESP32-Radio peut prendre en charge un récepteur infrarouge. Heureusement, la télécommande infrarouge du système audio utilise le protocole NEC que reconnaît l'ESP32-Radio. Certaines touches n'ont aucun effet lorsque le système de son obtient son entrée à partir de la connexion AUX utilisée par la radio Internet. L'ajout du récepteur IR n'exige que trois connections: l'alimentation (3,3 V), la masse (GND) et le signal. ESP32-Radio suggère de relier le signal à la broche E/S GPIO 35, alors c'est ce que j'ai fait. L'activation de la prise en charge de l'interface infrarouge se réaliset avec une simple déclaration dans le fichier de configuration. En même temps, il faut spécifier les codes IR qui seront interceptés et l'action à prendre à leur réception. Voici ce que j'ai ajouté au fichier de configuration.

pin_ir = 35 # GPIO pin connected IR receiver data signal ir_38C7 = downpreset = 1 ir_40BF = downvolume = 2 ir_55AA = uppreset = 5 ir_956A = downpreset = 5 ir_D827 = uppreset = 1 ir_F906 = upvolume = 2

La partie la plus délicate consiste à obtenir les codes IR des boutons de la télécommande. Le moyen le plus simple est de connecter l'ESP32 par câble USB à un ordinateur de bureau et d'ouvrir un terminal avec le port série du ESP. Lorsque les boutons de la télécommande IR sont enfoncés, ESP32Radio signale les codes IR captés. J'ai utilisé une autre approche avec une mini télécommande infrarouge BlitzWolf BW-RC1 sur laquelle TASMOTA-IR a été installé en suivant les instructions de deux articles: Flashing the BlitzWolf BW-RC1 Infrared Blaster with Tasmota at Mat's Hideout et Flashing the BlitzWolf BW-RC1 with Tasmota by Matthew Harrold. Tout ce que j'avais à faire était de m'abonner au serveur MQTT et d'enregistrer les messages en notant quel bouton de la télécommande infrarouge du système audio était enfoncé.

michel@hp:~$ mosquitto_sub -h domo.local -t 'tele/teleman/RESULT' {"IrReceived":{"Protocol":"NEC","Bits":32,"Data":"0x1EE140BF", "DataLSB":"0x788702FD","Repeat":0}} {"IrReceived":{"Protocol":"NEC","Bits":32,"Data":"0x1EE1F906","DataLSB":"0x78879F60","Repeat":0}} ...

La mise en évidence ajoutée indique comment identifier le code IR dont ESP32Radio a besoin. Cet agencement des touches n'est que provisoire, le temps de vérifier que tout fonctionne. J'espère qu'il sera possible de fixer une fois pour toutes le volume d'ESP32Radio. Jusqu'ici il ne semble pas y avoir de problème avec une valeur élevée comme 95, voire 100. Il est alors possible de régler le volume du son avec le codeur rotatif de la chaîne stéréo et des boutons de volume +/- de la télécommande uniquement, sans modifier le niveau du signal provenant de la radio Internet. Il reste à voir si c'est vraiment utile de pouvoir sauter 5 postes en avant ou en arrière. Éventuellement, il pourrait être plus intéressant de grouper les postes par catégorie ou par région et d'utiliser les boutons « et » pour passer d'un groupe à l'autre.

Affichage LCD1602 toc

Ajouter un affichage est encore plus simple, pour autant qu'on en choisisse un parmi ceux pris en charge par ESP32Radio. J'ai essayé le LCD1602, qui est un écran LCD à 32 caractères disposé en deux lignes de 16 caractères, d'où son nom. Un écran LCD «nu» doté d'un bus de données parallèle de 8 bits ne peut pas être utilisé. Le logiciel peut s'interfacer avec l'écran via une connexion série I²C. Les cartes d'interface I²C basées sur l'extension d'E/S distantes 8 bits PCF8574 sont faciles à trouver. J'avais un tel adaptateur sous la main, et après une session fastidieuse pour dessouder les broches de l'adaptateur, j'ai pu le souder directement sur le connecteur du LCD1602. Si jamais j'achète un autre de ces écrans, je m'efforcerai d'en trouver un avec l'adaptateur I²C déjà en place. Les connexions série nécessitent des broches E/S pour les signaux SDL et SCL, une connexion à la terre et une connexion à 3,3 V. Tout cela était facile à faire. On termine l'installation avec l'ajout des connexions dans le fichier de configuration.

pin_tft_scl = 22 pin_tft_sda = 21

Ce sont les broches suggérées pour la connexion I²C du ESP32. N'oubliez pas d'enregistrer le fichier de configuration et de redémarrer la radio pour que la modification prenne effet.

Malheureusement, l'angle de vision du LCD1602 est si étroit qu'il est pratiquement illisible. De plus, deux lignes de 16 caractères ne suffisent pas pour afficher les métadonnées obtenues des stations de radio Web. Ed Smallenburg (Edzelf), l'auteur d' ESP32-Radio , a anticipé ce problème. Les métadonnées, telles que les titres de chansons ou les URL de radio Web, défilent horizontalement si elles sont trop longues, tout comme les titres de CD défilent par le lecteur CD de la voiture. Néanmoins, le résultat n'est pas satisfaisant. C'est navrant, car je pensais éventuellement ajouter avec deux codeurs rotatifs de part et d'autre de cet écran pour que la radio Internet ressemble à une radio d'automobile et soit aussi simple à utiliser. Une recherche rapide a révélé qu'il existe des affichages de type OLED de dimensions semblables qui pourraient remplacer le LCD1602. C'est à voir, car ces écrans coûtent plus que tous les autres composants du radio réunis.

Intégration domotique toc

L'ajout de quelques capteurs virtuels dans Domoticz, le système domotique utilisé à la maison depuis environ trois ans est tout simple. J'ai décidé de n'implémenter que l'équivalent des boutons de navigation des stations préréglées sur la télécommande IR. Ils sont configurés comme des boutons poussoirs.

La sélection du type de bouton et l'action à effectuer lors de l'activation du capteur virtuel se font dans son écran d'édition .

Bien sûr, le champ On Action de l'autre bouton contient http://esp32radio.local/?downpreset=1. L'URL peut être un problème sur certains systèmes. Rappelons-nous que esp32radio est attribué dans le micrologiciel à l'ESP32. Actuellement, cela n'est pas configurable et doit être modifié dans le code source. Des précautions seront nécessaires si plus d'une radio Internet est installée sur le réseau local. En raison d'éventuels conflits de noms, il n'est pas possible de savoir avec certitude quel ESP32 se verra attribuer le nom d'hôte esp32radio.local et lequel sera nommé esp32radio-2.local par le système mDNS. En effet, certains systèmes d'exploitation peuvent même ne pas avoir Zeroconf en cours d'exécution. La solution évidente serait d'utiliser l'adresse IP du radio internet. Mais encore une fois, le micrologiciel suppose que l'attribution de l'adresse IP se fait de façon dynamique (DHCP). Cela signifie que soit le code source devra être modifié pour chaque radio Internet, soit le service DHCP du réseau (généralement, mais pas toujours, un service du routeur) devra attribuer des adresses IP fixes en fonction sur les adresses MAC des ESP32.

La chose intéressante ici est qu'Alexa peut maintenant être utilisée pour passer au préréglage Web suivant ou précédent. Ma conjointe ne souhaite pas utiliser son téléphone intelligent pour sélectionner les préréglages, mais elle utilise les commandes vocales pour allumer ou éteindre certaines lumières. Je me demande ce qu'elle va penser de cet ajout.

À venir toc

Le sujet n'est pas tari. Je reviendrai sur l'utilisation d'un Raspberry Pi pour réaliser une radio Internet. Et il y a déjà une deuxième radio Internet qui fonctionne dans mon bureau. Dans cette version, l'ESP32, tout comme le Pi, effectue le décodage MP3. La sortie numérique est acheminée avec un connexion I²S vers un DAC (convertisseur numérique analogique). Un TTGO-T-DISPLAY est utilisé. Celui-ci dispose d'un écran couleur 135x240 intégré que je n'ai pas encore mis à contribution. Étant donné que les cartes DAC et ESP ont presque la même taille, il pourrait s'agir d'un appareil très compact. Pour le moment, il est encore au stade de la maquette, reposant sur un amplificateur Realistic S150 connecté à une paire de haut-parleurs Realistic Minimus-0.5. C'est du vieux matériel (circa 1986), mais le son est meilleur que ce qui sort des haut-parleurs intégrés au moniteur HDMI.

<-Lecteur de postes de radio sur Internet avec MOC