De plus en plus de personnes semblent l'utiliser sans serveur LMS, uniquement pour BT, AirPlay ou Spotify. C'est bien, mais comprenez que squeezeliteESP32 est avant tout un lecteur Logitech Media Server et a été conçu autour de ce concept. Tous les autres sont des modules complémentaires cousus, donc les autres modes ont leurs défauts. Alors assurez-vous de lire ceci avant d'ouvrir un numéro
Squeezelite-esp32 est une suite logicielle audio conçue pour fonctionner sur les chipsets wifi (b/g/n) et bluetooth esp32 et esp32-s3 d'espressif. Il offre les capacités suivantes
Selon le matériel connecté à l'esp32, vous pouvez envoyer de l'audio vers un DAC local, vers SPDIF ou vers un haut-parleur Bluetooth. Le matériel minimum requis est un module WROVER avec 4 Mo de Flash et 4 Mo de PSRAM (https://www.espressif.com/en/products/modules/esp32). Avec ce module autonome, appliquez simplement l’alimentation et vous pouvez diffuser sur un haut-parleur Bluetooth. Vous pouvez également envoyer de l'audio à la plupart des DAC I2S ainsi qu'aux récepteurs SPDIF en utilisant simplement un câble ou un transducteur optique.
Mais squeezelite-esp32 est hautement extensible et vous pouvez ajouter
Les autres fonctionnalités incluent
Pour contrôler l'égaliseur ou utiliser l'affichage sur LMS, un nouveau modèle de lecteur est requis et celui-ci est fourni via un plugin qui fait partie des référentiels tiers de LMS.
(avis présentés ici donc I = @philippe44) La version principale de squeezelite-esp32 est un noyau interne de 16 bits avec tous les calculs en 32 bits ou précision float. C'est un choix de conception que j'ai fait pour préserver les performances du processeur (cela étend déjà beaucoup le chipset esp32) et optimiser l'utilisation de la mémoire car nous n'avons que 4 Mo de RAM utilisable. Certains pourraient commenter à juste titre que le module WROVER dispose de 8 Mo de RAM, mais le processeur n'est capable d'adresser que 4 Mo et les 4 Mo restants doivent être paginés par des blocs plus petits et je n'ai pas de patience pour cela.
Maintenant, lorsque j'ai fait le portage de squeezelite vers esp32, j'ai également rendu le noyau 16 ou 32 bits compatible au moment de la compilation. Jusqu'à présent, cela fonctionne en 32 bits mais moins de tests ont été effectués. Vous pouvez choisir de le compiler en mode 32 bits. Je ne suis pas très intéressé au dessus des échantillons 16 bits car ça n'apporte rien (j'ai une formation d'ingénieur en théorie de l'information).
Capacité | 16 bits | 32 bits | commentaire |
---|---|---|---|
taux d'échantillonnage maximum | 192k | 96k | 192k est très difficile, surtout lorsqu'il est combiné avec l'affichage |
profondeur de bits maximale | 16 | 24 | 24 bits sont tronqués en mode 16 bits |
SPDIF | 16 bits | 20 bits | |
mp3, aac, opus, ogg/vorbis | 48k | 48k | |
alac, flac, ogg/flac | 96k | 96k | |
pcm, wav, aif | 192k | 96k | |
égaliseur | Oui | N | 48 kHz max (après rééchantillonnage) - égalisation ignorée sur > 48 000 pistes |
rééchantillonnage | Oui | N | |
fondu enchaîné | 10s | <5s | dépend de la taille du tampon et du taux d'échantillonnage |
L'esp32 doit fonctionner à 240 MHz, avec des E/S Quad-SPI à 80 MHz et une horloge de 40 Mhz. Pourtant, c'est beaucoup à faire fonctionner, surtout sachant qu'il dispose d'un Flash série et d'une PSRAM, alors bravo à Espressif pour l'optimisation de son chipset. Maintenant, avoir tout le décodage, rééchantillonnage, égalisation, gain, affichage, spectre/vu est un équilibre très (très) délicat entre utilisation de la RAM interne/externe, priorités des tâches et gestion du buffer. Ce n'est pas parfait et plus vous poussez le système à l'extrême, plus le risque que certains fichiers ne soient pas lus est élevé (voir ci-dessous). En général, l'affichage aura toujours la priorité la plus basse et vous remarquerez un ralentissement du défilement et des taux de rafraîchissement VU/Spectrum. Désormais, même le fil d'affichage comporte une section critique et a un impact sur les capacités. Par exemple, un écran couleur d'une profondeur de 16 bits avec une faible vitesse SPI peut empêcher le flac 24/96 de fonctionner mais fonctionner toujours avec le pcm 24/96.
En mode 16 bits, bien que 192 kHz soit signalé comme taux maximum, il est fortement recommandé de limiter le taux d'échantillonnage signalé à 96k (-Z 96000). Notez que certains flux en ligne à haut débit 24/96k peuvent être saccadés en raison des performances de la pile TCP/IP. Cela est généralement dû au fait que le serveur envoie de petits paquets de données et que l'esp32 ne peut pas recevoir l'audio codé assez rapidement, quels que soient les paramètres de priorité des tâches (j'ai essayé de modifier un peu cela). La meilleure option dans ce cas est de laisser LMS proxy le flux car il fournira des morceaux plus gros et un flux « plus fluide » qui pourra ensuite être géré.
Notez également que certains codecs consomment plus de CPU que d’autres ou n’ont pas été autant optimisés. J'ai fait de mon mieux pour les peaufiner, mais ce niveau d'optimisation inclut l'écriture d'assemblys, ce qui est pénible. Un codec très exigeant est AAC lorsque les fichiers sont codés avec SBR. Il permet la reconstruction de la partie supérieure du spectre et donc un taux d'échantillonnage plus élevé, mais les spécifications du codec sont telles que cela est facultatif, vous pouvez simplement décoder la bande inférieure et accepter un taux d'échantillonnage plus faible - Voir l'option AAC_DISABLE_SBR ci-dessous.
IMPORTANT : sur esp32 (et non sur esp32-s3), l'utilisation de Spotify avec SPDIF produit un son saccadé lorsque les "statistiques" sont activées. Vous DEVEZ les désactiver
Tout matériel basé sur esp32 avec au moins 4 Mo de flash et 4 Mo de PSRAM sera capable d'exécuter squeezelite-esp32 et diverses cartes incluent une telle puce. Quelques-uns sont mentionnés ci-dessous, mais tous devraient fonctionner. Vous pouvez trouver diverses aides et instructions ici
Par souci de clarté, les modules WROOM NE fonctionnent PAS car ils n'incluent pas de PSRAM. Certaines conceptions peuvent l'ajouter en externe, mais c'est (très) peu probable.
Selon la description ci-dessus, un module WROVER est suffisant pour exécuter Squeezelite-esp32, mais cela nécessite un peu de bricolage pour l'étendre afin d'avoir des boutons audio analogiques ou matériels (par exemple)
Veuillez noter que lors de l'envoi vers un haut-parleur Bluetooth (source), seule la fréquence de 44,1 kHz peut être utilisée. Vous devez donc soit laisser LMS effectuer le rééchantillonnage, mais vous devez vous assurer qu'il n'envoie que des pistes à 44,1 kHz, soit activer l'option de rééchantillonnage interne (en utilisant -R). . Si vous connectez un DAC, le choix des fréquences d'échantillonnage dépendra de ses capacités. Voir ci-dessous pour plus de détails.
La plupart des DAC fonctionneront immédiatement avec une simple connexion I2S, mais certains nécessitent l'envoi de commandes spécifiques via I2C. Voir l'option DAC ci-dessous pour comprendre comment envoyer ces commandes dédiées. Il existe une prise en charge intégrée pour TAS575x, TAS5780, TAS5713 et AC101 DAC.
Les modules basés sur esp32-s3 comme celui-ci sont également pris en charge mais nécessitent esp-idf 4.4. Il ne fait pas encore partie des versions officielles, mais il se compile et s'exécute. Le S3 n'a pas d'audio Bluetooth. Notez que les performances du processeur sont grandement améliorées.
Il s'agit du principal compagnon matériel de Squeezelite-esp32 et a été développé ensemble. Des détails sur les capacités peuvent être trouvés ici et ici.
Si vous souhaitez reconstruire, utilisez le fichier de configuration squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
.
NB : Vous pouvez utiliser les binaires pré-construits SqueezeAMP4MBFlash qui ont toutes les E/S matérielles correctement définies. Vous pouvez également utiliser le binaire générique I2S4MBFlash, auquel cas les paramètres NVS doivent être définis pour obtenir exactement le même comportement.
12=green,13=red,34=jack,2=spkfault
channel=7,scale=20.24
model=TAS57xx,bck=33,ws=25,do=32,sda=27,scl=26,mute=14:0
bck=33,ws=25,do=15
L'IR peut être utilisé comme signal de réveil en utilisant (réglage sleep_config
avec wake=0:0
). Il s'agit d'un pull-up, donc il reste à 1 lorsqu'il ne reçoit rien, ce qui signifie qu'il ne peut pas être utilisé conjointement avec d'autres E/S de réveil. Voir Dormir pour plus de détails concernant la limitation du réveil lors de plusieurs entrées.
Ce haut-parleur portable alimenté par batterie est compatible avec squeezelite-esp32 pour lequel une version dédiée est fournie avec chaque mise à jour. Si vous souhaitez reconstruire, utilisez le fichier de configuration squeezelite-esp32-Muse-sdkconfig.defaults
.
NB : Vous pouvez utiliser les binaires pré-construits Muse4MBFlash dont toutes les E/S matérielles sont correctement définies. Vous pouvez également utiliser le binaire générique I2S4MBFlash, auquel cas les paramètres NVS doivent être définis pour obtenir exactement le même comportement.
muse
channel=5,scale=7.48,atten=3,cells=1
"mosi=15,miso=2,clk=14
(celui-ci est probablement facultatif)model=I2S,bck=5,ws=25,do=26,di=35,i2c=16,sda=18,scl=23,mck=0
{"init":[ {"reg":0,"val":128}, {"reg":0,"val":0}, {"reg":25,"val":4}, {"reg":1,"val":80}, {"reg":2,"val":0}, {"reg":8,"val":0}, {"reg":4,"val":192}, {"reg":0,"val":18}, {"reg":1,"val":0}, {"reg":23,"val":24}, {"reg":24,"val":2}, {"reg":38,"val":9}, {"reg":39,"val":144}, {"reg":42,"val":144}, {"reg":43,"val":128}, {"reg":45,"val":128}, {"reg":27,"val":0}, {"reg":26,"val":0}, {"reg":2,"val":240}, {"reg":2,"val":0}, {"reg":29,"val":28}, {"reg":4,"val":48}, {"reg":25,"val":0}, {"reg":46,"val":33}, {"reg":47,"val":33} ]}
[{"gpio":32, "pull":true, "debounce":10, "normal":{"pressed":"ACTRLS_VOLDOWN"}}, {"gpio":19, "pull":true, "debounce":40, "normal":{"pressed":"ACTRLS_VOLUP"}}, {"gpio":12, "pull":true, "debounce":40, "long_press":1000, "normal":{"pressed":"ACTRLS_TOGGLE"},"longpress":{"pressed":"ACTRLS_POWER"}}]
Fonctionne avec le module ESP32-A1S qui comprend un codec audio et une sortie casque. Vous devez toujours utiliser une carte de démonstration comme celle-ci ou un amplificateur externe si vous souhaitez une connexion directe aux haut-parleurs. Notez qu'il existe une version avec le codec AC101 et une autre avec ES8388 avec probablement deux variantes - ces cartes sont en désordre (voir ci-dessous)
La carte illustrée ci-dessus a le jeu d'E/S suivant
(notez que certains GPIO ont besoin de pullups)
Donc une configuration possible serait
21=amp,22=green:0,39=jack:0
[{ "gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_TOGGLE " }},{ "gpio" : 18 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_NEXT " }}, { "gpio" : 23 , "pull" : true , "shifter_gpio" : 5 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "shifted" :{ "pressed" : " ACTRLS_PREV " }}]
pour AC101
model=AC101,bck=27,ws=26,do=25,di=35,sda=33,scl=32
pour ES8388 (il semble qu'il existe des variantes avec le même numéro de version - un gâchis total)
model=ES8388,bck=5,ws=25,do=26,sda=18,scl=23,i2c=16
oumodel=ES8388,bck=27,ws=25,do=26,sda=33,scl=32,i2c=16
Il s'agit d'une montre intelligente amusante basée sur ESP32. Il dispose d'un écran ST7789 240x240 et d'un système audio intégré. Pas très utile pour écouter quoi que ce soit mais ça marche. Il s'agit d'un exemple d'appareil qui nécessite un ensemble de commandes I2C pour son DAC/APU (voir ci-dessous). Il existe une option build si vous décidez de tout reconstruire vous-même, sinon l'option par défaut d'I2S fonctionne avec les paramètres suivants
model=I2S,bck=26,ws=25,do=33,i2c=53,sda=21,scl=22
{ "init" : [ { "reg" : 41 , "val" : 128 }, { "reg" : 18 , "val" : 255 } ], "poweron" : [ { "reg" : 18 , "val" : 64 , "mode" : " or " } ], "poweroff" : [ { "reg" : 18 , "val" : 191 , "mode" : " and " } ] }
dc=27,data=19,clk=18
SPI,driver=ST7789,width=240,height=240,cs=5,back=12,speed=16000000,HFlip,VFlip
Squeezelite-esp32 nécessite un chipset esp32 et 4 Mo de PSRAM. ESP32-WROVER répond à ces exigences. Pour obtenir une sortie audio, un DAC I2S peut être utilisé. Les DAC PCM5102 I2S bon marché fonctionnent, mais beaucoup d'autres le font également. Les DAC PCM5012 peuvent être connectés via :
I2S - WROVER
VCC-3,3 V
3,3 V - 3,3 V
Masse - Masse
FLT-GND
DMP-GND
SCL-GND
BCK - (BCK - voir ci-dessous)
DIN - (DO - voir ci-dessous)
LCK - (WS - voir ci-dessous) FMT - GND
XMT-3,3 V
Utilisez le fichier de configuration squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults
.
Et le projet super cool https://github.com/rochuck/squeeze-amp-too
Pour accéder à NVS, dans l'interface Web, accédez aux crédits et sélectionnez « affiche l'éditeur nvs ». Accédez à l'onglet de l'éditeur NVS pour modifier les paramètres NFS. Dans la description de la syntaxe ci-dessous, <> signifie une valeur tandis que [] décrit les paramètres facultatifs.
Comme mentionné ci-dessus, quelques versions dédiées sont fournies aujourd'hui : SqueezeAMP et Muse, mais si vous les construisez vous-même, vous pouvez également créer une version pour T-WATCH2020. La version par défaut est un micrologiciel générique nommé I2S qui peut être configuré via NVS pour produire exactement les mêmes résultats que les versions dédiées. La différence est que les paramètres doivent être saisis et peuvent être accidentellement effacés. L'interface graphique fournit également une aide précieuse pour charger les "ensembles de configuration connus".
Par choix de conception, aucun code n'est intégré uniquement pour une version donnée, tout le code est toujours là. La philosophie est de minimiser autant que possible le code spécifique à la plate-forme et l'utilisation de #ifdef
spécifiques est interdite, quoi qu'il arrive. Donc, si vous souhaitez ajouter votre propre plate-forme, veuillez examiner très attentivement le mainKConfig.projbuild
pour voir comment vous pouvez, en utilisant les paramètres ci-dessous, faire de votre appareil une solution purement basée sur la configuration. Lorsqu'il n'y a vraiment pas d'autre option, regardez targets<target>
pour ajouter votre propre code. Je n'accepterai pas de relations publiques pour du code qui peut éviter de créer un tel code dédié autant que possible. La "cible" NVS sera alors utilisée pour appeler du code spécifique à la cible, mais encore une fois, il s'agit purement d'exécution, pas de compilation.
Le paramètre NVS "i2c_config" définit le gpio de l'i2c utilisé à des fins génériques (par exemple, affichage). Laissez-le vide pour désactiver l'utilisation d'I2C. Notez que sur SqueezeAMP, le port doit être 1. La vitesse par défaut est de 400 000 mais certains écrans peuvent en faire jusqu'à 800 000 ou plus. La syntaxe est
sda=<gpio>,scl=<gpio>[,port=0|1][,speed=<speed>]
Veuillez noter que vous ne pouvez pas utiliser le même GPIO ou port que le DAC.
L'esp32 dispose de 4 sous-systèmes SPI, l'un d'entre eux est inaccessible donc la numérotation est de 0 à 2 et SPI0 est réservé au Flash/PSRAM. Le paramètre NVS "spi_config" définit le gpio du spi utilisé à des fins génériques (par exemple, affichage). Laissez-le vide pour désactiver l'utilisation de SPI. Le paramètre DC est nécessaire pour les affichages. La syntaxe est
data|mosi=<gpio>,clk=<gpio>[,dc=<gpio>][,host=1|2][,miso=<gpio>]
Par défaut et seul "hôte" est 1 car les autres sont déjà utilisés par Flash et Spiram. Le paramètre facultatif "miso" (MasterInSlaveOut) n'est utilisé que lorsque le bus SPI est bidirectionnel et partagé avec d'autres périphériques comme Ethernet, expandeur gpio. Notez que « data » peut également être nommé « mosi » (MasterOutSlaveIn).
Le paramètre NVS "dac_config" définit le gpio utilisé pour la communication i2s avec votre DAC. Vous pouvez définir les valeurs par défaut au moment de la compilation mais le paramètre nvs est prioritaire, sauf pour les configurations nommées.
bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|ES8388|I2S][,sda=<gpio>,scl=<gpio>[,i2c=<addr>]]
si le « modèle » n'est pas défini ou n'est pas reconnu, alors « I2S » par défaut est utilisé. L'option "mck" est utilisée pour certains codecs qui nécessitent une horloge maître (bien qu'ils ne devraient pas le faire). Par défaut, GPIO0 est utilisé comme MCLK et seules les versions récentes (après mi-2023) peuvent utiliser 1 ou 2. Sachez également que cela ne peut pas coexister avec RMII Ethernet (voir la section Ethernet ci-dessous). Les paramètres I2C sont facultatifs et nécessaires uniquement si votre DAC nécessite un contrôle I2C (voir « dac_controlset » ci-dessous). Notez que les paramètres "i2c" sont décimaux, la notation hexadécimale n'est pas autorisée.
Jusqu'à présent, les TAS57xx, TAS5713, AC101, WM8978 et ES8388 sont des modèles reconnus où les commandes de séquence d'initialisation/volume/puissance appropriées sont envoyées. Pour les autres codecs pouvant nécessiter des commandes I2C, veuillez utiliser le paramètre "dac_controlset" qui permet de définir des commandes simples à envoyer via i2c pour l'initialisation, l'alimentation, l'activation et la désactivation du haut-parleur et du casque en utilisant une syntaxe JSON :
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
Où <command>
est l'un des éléments suivants : init, poweron, poweroff, speakeron, speakeroff, earphoneon, earphoneoff (il doit s'agir d'un tableau même pour un seul élément). L'article est l'un des éléments suivants
{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}
{"gpio":<gpio>,"level":0|1}
{"delay":<ms>}
Il s'agit d'une notation JSON standard, donc si vous ne la connaissez pas, Google est votre meilleur ami. Sachez que le '...' signifie que vous pouvez avoir autant d'entrées que vous le souhaitez, cela ne fait pas partie de la syntaxe. Chaque section est facultative, mais cela n'a pas de sens de définir i2c dans le paramètre 'dac_config' et de ne rien définir ici.
La clé reg
permet d'écrire des registres sur le bus i2c. Le mode
paramètre permet de ou de s'inscrire avec la valeur ou de et elle. Ne définissez pas mode
si vous souhaitez simplement écrire. Le paramètre val
peut être un tableau [v1, v2,...] pour écrire une série d'octets en une seule rafale i2c (dans ce cas, le « mode » est ignoré). Notez que toutes les valeurs doivent être décimales . Vous pouvez utiliser un validateur comme celui-ci pour vérifier votre syntaxe. La touche gpio
sert simplement à définir un gpio dans le cadre de l'action DAC et delay
permet une pause entre les éléments.
La commande « power » est utilisée lors de la mise sous/hors tension du DAC après la période d'inactivité (voir l'option -C de squeezelite) et les commandes « haut-parleur/casque » sont envoyées lors du basculement entre les haut-parleurs et les casques (voir détection de la prise casque).
NB : Pour les configurations nommées ((SqueezeAMP, Muse... toutes sauf I2S), tout cela est ignoré. Pour les codecs connus, les séquences intégrées peuvent être écrasées à l'aide de dac_controlset
Veuillez noter que vous ne pouvez pas utiliser le même GPIO ou port que l'I2C.
Le paramètre NVS "spdif_config" définit le gpio du i2 nécessaire pour SPDIF.
SPDIF est rendu disponible en réutilisant l'interface i2s de manière non standard, donc bien qu'une seule broche (DO) soit nécessaire, le contrôleur doit être entièrement initialisé, donc le bit clock (bck) et le word clock (ws) doivent être réglé également. Comme i2s et SPDIF s'excluent mutuellement, vous pouvez réutiliser la même E/S si votre matériel le permet.
Vous pouvez définir les valeurs par défaut au moment de la compilation mais le paramètre nvs est prioritaire sauf pour les configurations nommées (SqueezeAMP, Muse...)
Laissez-le vide pour désactiver l'utilisation du SPDIF, vous pouvez également les définir au moment de la compilation en utilisant "make menuconfig". La syntaxe est
bck=<gpio>,ws=<gpio>,do=<gpio>
NB : Pour les configurations nommées, ceci est ignoré
La profondeur de bits maximale est de 24 bits, même en mode 32 bits (c'est une limitation SPDIF - merci @UrbanLienert pour la mise à jour de 20 à 24 bits). Désormais, vous pouvez également obtenir du SPDIF à l'aide d'une puce spécialisée qui offre une interface I2S comme un DAC mais crache du SPDIF (optique et coaxial). Fait alors référence au chapitre DAC.
Si vous voulez du coaxial, vous pouvez également utiliser une astuce du pauvre pour générer un signal à partir d'un GPIO 3,3 V. Tout ce que cela fait, c'est diviser le 3,3 V pour générer un 0,6 V crête à crête, puis supprimer le courant continu.
100nF
GPIO ----210ohm-----------||---- coax S/PDIF signal out
|
110ohm
|
Ground -------------------------- coax signal ground
Le paramètre NVS "display_config" définit les paramètres d'un affichage optionnel. Il peut s'agir d'I2C (voir ici pour le bus partagé) ou de SPI (voir ici pour le bus partagé). La syntaxe est
I2C,width=<pixels>,height=<pixels>[address=<i2c_address>][,reset=<gpio>][,HFlip][,VFlip][driver=SSD1306|SSD1326[:1|4]|SSD1327|SH1106]
SPI,width=<pixels>,height=<pixels>,cs=<gpio>[,back=<gpio>][,reset=<gpio>][,speed=<speed>][,HFlip][,VFlip][driver=SSD1306|SSD1322|SSD1326[:1|4]|SSD1327|SH1106|SSD1675|ST7735|ST7789[:x=<offset>][:y=<offset>]|ILI9341[:16|18][,rotate]]
Vous pouvez modifier la façon dont le vu-mètre et l'analyseur de spectre sont affichés, ainsi que la taille des illustrations via un menu dédié dans les paramètres du lecteur (n'oubliez pas d'ajouter le plugin).
Le paramètre NVS « metadata_config » définit la façon dont les métadonnées sont affichées pour AirPlay et Bluetooth. La syntaxe est
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
, %album%
, %title%
. A l'aide de cette chaîne de format, les mots-clés sont remplacés par leur valeur pour construire la chaîne à afficher. Notez que le texte brut suivant un mot-clé qui s'avère être vide lors de la lecture d'une piste sera supprimé. Par exemple, si vous avez défini format= %artist% - %title%
et qu'il n'y a aucun artiste dans les métadonnées, seul <title>
sera affiché et non - <title>
.Vous pouvez utiliser n'importe quel récepteur IR compatible avec le protocole NEC (38KHz) ou RC5. Vcc, GND et sortie sont les seules broches qui doivent être connectées, pas de pullup, pas de condensateur de filtrage, c'est une connexion droite.
Les codes IR sont envoyés "tels quels" au LMS, donc seule une télécommande Logitech SB de Boom, Classic ou Touch fonctionnera. Je pense que le fichier Slim_Devices_Remote.ir dans le répertoire "server" de LMS peut être modifié pour s'adapter à d'autres codes, mais je n'ai pas essayé ça.
En mode AirPlay et Bluetooth, seules ces télécommandes natives sont supportées, je n'ai pas ajouté la possibilité de réaliser votre propre mapping
Voir "set GPIO" ci-dessous pour définir le GPIO associé au récepteur infrarouge (option "ir").
Le paramètre "set_GPIO" permet d'attribuer GPIO à diverses fonctions.
GPIO peut être défini sur GND Provide ou Vcc au démarrage. Ceci est pratique pour alimenter des appareils qui consomment moins de 40 mA à partir du connecteur latéral. Soyez prudent car aucune vérification de conflit n'est effectuée par rapport au GPIO que vous modifiez, vous pourriez donc endommager votre carte ou créer un conflit ici.
Le paramètre <amp>
peut être utilisé pour attribuer un GPIO qui sera réglé au niveau actif (par défaut 1) au démarrage de la lecture. Il sera réinitialisé lorsque squeezelite deviendra inactif. Le délai d'inactivité est défini sur la ligne de commande squeezelite via -C <timeout>
Le paramètre <power>
peut être utilisé pour attribuer un GPIO qui sera réglé au niveau actif (par défaut 1) lorsque le lecteur est allumé et réinitialisé lorsqu'il est éteint (dans LMS, ne s'applique pas à AirPlay, Spotify ou BT).
Si vous disposez d'une prise audio prenant en charge l'insertion (utilisez :0 ou :1 pour définir le niveau une fois inséré), vous pouvez spécifier à quel GPIO elle est connectée. L'utilisation du paramètre jack_mutes_amp permet de couper l'ampli lorsqu'un casque (par exemple) est inséré.
Vous pouvez également définir les voyants d'état vert et rouge avec leur état actif respectif (:0 ou :1) ou spécifier le chipset si vous utilisez des voyants RVB adressables.
Le paramètre <ir>
définit le GPIO associé à un récepteur IR. Pas besoin d'ajouter un pullup ou un condensateur
La syntaxe est :
<gpio>=Vcc|GND|amp[:1|0]|power[:1:0]|ir[:nec|rc5]|jack[:0|1]|green[:0|1|ws2812]|red[:0|1|ws2812]|spkfault[:0|1][,<repeated sequence for next GPIO>]
Vous pouvez définir les valeurs par défaut des voyants jack et spkfault au moment de la compilation mais le paramètre nvs est prioritaire sauf pour les configurations nommées ((SqueezeAMP, Muse ...) où celles-ci sont forcées au moment de l'exécution. Notez que les gpio 36 et 39 sont uniquement en entrée et ne peuvent pas être utilisés. interruption Lorsqu'il est réglé sur un défaut de prise ou de haut-parleur, une interrogation de 100 ms vérifie leur valeur mais cela coûte cher.
Il est possible d'ajouter des extensions GPIO en utilisant le bus I2C ou SPI. Ils doivent principalement être utilisés pour les boutons, mais ils peuvent également prendre en charge des sorties à usage générique. Ces GPIO supplémentaires peuvent être numérotés à partir d'une valeur arbitraire (40 et plus car esp32 a GPIO 0..39). Ensuite, ces nouveaux GPIO "virtuels" de (par exemple) 100 à 115 peuvent être utilisés dans la configuration des boutons, set_GPIO ou d'autres paramètres de configuration.
Chaque extenseur peut prendre en charge jusqu'à 32 GPIO. Pour utiliser un extenseur de boutons, une interruption doit être fournie, le mode d'interrogation n'est pas acceptable. Un expandeur sans interruption peut toujours être configuré, mais seule la sortie sera utilisable. Notez que la même interruption peut être partagée entre les extenseurs, à condition qu'ils utilisent un drain ouvert ou des collecteurs ouverts (ce qu'ils font probablement tous)
Le paramètre "gpio_exp_config" est une liste séparée par des points-virgules (;) avec la syntaxe suivante pour chaque extenseur
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
Notez que PWM ("led_brightness" ci-dessous) n'est pas pris en charge pour les GPIO étendus et ils ne peuvent pas être utilisés pour des signaux de synchronisation à grande vitesse ou précis comme CS, D/C, Reset et Ready. Les boutons, l'encodeur rotatif, le contrôle de l'amplificateur et l'alimentation sont pris en charge. En fonction du chipset réel, le pullup ou le pulldown peuvent être pris en charge, vous devrez donc peut-être ajouter des résistances externes (seul le MCP23x17 effectue le pullup). Le pca8575 n'est pas une excellente puce, il génère pas mal d'interruptions parasites lorsqu'il est utilisé pour la sortie GPIO. Lors de l'utilisation d'un module d'extension SPI, le bus doit être configuré à l'aide d'un bus SPI partagé
Voir set_GPIO pour savoir comment définir les LED vertes et rouges (y compris celles RVB adressables). De plus, leur luminosité peut être contrôlée grâce au paramètre "led_brigthness". La syntaxe est
[green=0..100][,red=0..100]
NB : Pour la configuration nommée, le GPIO affecté aux LED verte et rouge ne peut pas être modifié mais l'option de luminosité s'applique
Une bande LED avec jusqu'à 255 LED adressables peut être configurée pour offrir des visualisations améliorées. Le visualiseur VU Meter comprend un indicateur d'état de la batterie (voir Batterie). Actuellement, seules les LED WS2812B sont prises en charge. Définissez la configuration matérielle de la bande LED ou la syntaxe NVS led_vu_config est
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
où <n>
est le nombre de LED dans la bande (1..255). Une valeur de gain <scale>
(pourcentage) peut être ajoutée pour améliorer les réponses aux effets.
La dernière mise à jour du plugin LMS est requise pour définir le mode de visualisation et la luminosité dans la page Paramètres ESP32 du lecteur, ou un affichage contrôlable (voir les menus Extra/SqueezeESP32). Le plugin ajoute des commandes LMS CLI supplémentaires.
Commande | Remarques |
---|---|
<playerid> led_visual [<mode>] [<luminosité>] | Bascule ou sélectionne le « mode » du visualiseur. La luminosité du visualiseur (0..255) peut être contrôlée à l'aide de la balise "luminosité". |
<ID du lecteur> dmx <R,G,B,R,G,B, ... R,G,B> [<offset>] | Définit la couleur de la LED à partir de la position "offset" avec des séquences de couleurs « R » (rouge), « G » (vert) et « B » (bleu). Ajoutez des valeurs RVB supplémentaires à la chaîne délimitée pour définir plusieurs LED. |
Un encodeur rotatif général est pris en charge, décalage en quadrature avec pression. De tels encodeurs ont généralement 2 broches pour les encodeurs (A et B), un commun C qui doit être mis à la terre et une broche SW en option pour la presse. A, B et SW doivent être tirés vers le haut, donc le pull-up automatique est fourni par ESP32, mais vous pouvez ajouter vos propres résistances. Un peu de filtrage sur A et B (~470nF) aide à anti-rebond qui n'est pas effectué par logiciel.
L'encodeur est normalement codé en dur pour respectivement tourner à gauche, à droite et appuyer sur LMS et pour baisser/augmenter/lire le volume sur BT, AirPlay et Spotify. L'utilisation de l'option « volume » permet de codé en dur la commutation du volume vers le bas/l'augmentation/la lecture à tout moment (même dans LMS). L'option 'longpress' permet un mode alternatif lorsque SW est enfoncé longuement. Dans ce mode, la gauche est la précédente, la droite est la suivante et appuyer pour basculer. Chaque appui long sur SW alterne entre les modes (le comportement réel du mode principal dépend du « volume »).
Il y a aussi la possibilité d'utiliser l'option 'knobonly' (exclusive avec 'volume' et 'longpress'). Ce mode tente d'offrir une navigation complète à un seul bouton, ce qui est un peu compliqué en raison des principes de l'interface utilisateur LMS. Gauche, Droite et Appuyez sur obéissent aux règles de navigation de LMS et surtout Appuyez toujours sur l'élément de sous-menu inférieur, même lors de la navigation dans la bibliothèque musicale. Cela pose un défi car il n'y a pas de bouton « Lecture », « Retour » ou « Pause ». Les solutions de contournement sont les suivantes :
La vitesse du double-clic (ou gauche-droite) peut être définie à l'aide du paramètre optionnel « knobonly ». Ce n’est pas une solution parfaite et d’autres idées sont les bienvenues. Sachez que plus vous définissez la vitesse du double-clic, moins l'interface sera réactive. La raison est que je dois attendre ce délai avant de décider s'il s'agit d'un simple ou d'un double clic. Cela peut également faire en sorte que les "hésitations" dans la navigation dans les menus soient facilement interprétées comme une "Pause".
Utilisez le paramètre Rotary_config avec la syntaxe suivante :
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]]|[[,volume][,longpress]]]]
Remarque matérielle : tous les gpio utilisés pour le rotatif ont un pull-up interne, il n'est donc normalement pas nécessaire de fournir du Vcc à l'encodeur. Néanmoins, si la carte encodeur que vous utilisez possède également son propre pull-up plus puissant que celui de l'ESP32 (ce qui est probablement le cas), alors il y aura une diaphonie entre gpio, vous devez donc apporter Vcc. Regardez le schéma de votre carte et vous comprendrez que ces pull-up de carte créent un pull-down "gagnant" lorsqu'une autre broche est mise à la terre.
Le SW gpio est facultatif, vous pouvez le réaffecter à un bouton pur si vous préférez, mais les options de volume, de pression longue et de bouton uniquement n'ont pas de sens car le commutateur manquant joue un rôle important dans ces modes. Vous pouvez toujours avoir le mode « volume », mais vous ne pourrez pas l'utiliser pour quoi que ce soit, sauf pour augmenter ou diminuer le volume. Sachez donc que l'utilisation de la syntaxe [] est un peu trompeuse ci-dessus.
Voir aussi la "REMARQUE IMPORTANTE" dans la section "Boutons" et rappelez-vous que lorsque 'lms_ctrls_raw' (voir ci-dessous) est activé, aucune de ces options de bouton uniquement, de volume et d'appui long ne s'applique, les codes de bouton bruts (pas les actions) sont simplement envoyés au LMS.
Notez que sur esp32, les gpio 36 et 39 sont uniquement en entrée et ne peuvent pas utiliser d'interruption, ils ne peuvent donc pas être définis sur A ou B. Lorsque vous les utilisez pour SW, une interrogation de 100 ms est utilisée, ce qui coûte cher.
Un encodeur rotatif de volume dédié est pris en charge, décalage en quadrature avec pression. L'encodeur est codé en dur pour augmenter, diminuer et jouer pour LMS, BT, AirPlay et Spotify (voir la note ci-dessus pour le filtrage et la note matérielle ainsi que GPIO 36 et 39 sur esp32)
Utilisez le paramètre volume_rotary avec la syntaxe suivante :
A=<gpio>,B=<gpio>[,SW=gpio>]
Les boutons sont décrits à l'aide d'une chaîne JSON avec la syntaxe suivante
[
{ "gpio" : <num>,
"type" : " BUTTON_LOW | BUTTON_HIGH " ,
"pull" :[ true|false ],
"long_press" : <ms>,
"debounce" : <ms>,
"shifter_gpio" : <-1|num>,
"normal" : { "pressed" : " <action> " , "released" : " <action> " },
"longpress" : { <same> },
"shifted" : { <same> },
"longshifted" : { <same> },
},
{ ... },
{ ... },
]
Où (tous les paramètres sont facultatifs sauf gpio)
Où <action>
est soit le nom d'une autre configuration à charger (remap), soit un parmi
ACTRLS_NONE, ACTRLS_POWER, ACTRLS_VOLUP, ACTRLS_VOLDOWN, ACTRLS_TOGGLE, ACTRLS_PLAY,
ACTRLS_PAUSE, ACTRLS_STOP, ACTRLS_REW, ACTRLS_FWD, ACTRLS_PREV, ACTRLS_NEXT,
BCTRLS_UP, BCTRLS_DOWN, BCTRLS_LEFT, BCTRLS_RIGHT,
BCTRLS_PS1, BCTRLS_PS2, BCTRLS_PS3, BCTRLS_PS4, BCTRLS_PS5, BCTRLS_PS6, BCTRLS_PS7, BCTRLS_PS8, BCTRLS_PS9, BCTRLS_PS10,
KNOB_LEFT, KNOB_RIGHT, KNOB_PUSH,
ACTRLS_SLEEP,
Notez que ACTRLS_SLEET n'est pas un bouton réel qui peut être envoyé à LMS, mais c'est un crochet pour activer le mode de sommeil profond (voir dormir).
Celui que vous avez créé une telle chaîne, utilisez-le pour remplir un nouveau paramètre NVS avec un nom en dessous de 16 (?) Caractères. Vous pouvez avoir autant de ces configurations que possible. Définissez ensuite le paramètre de configuration "actrls_config" avec le nom de votre configuration par défaut
Par exemple une configuration nommée "boutons":
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " ACTRLS_VOLDOWN " }, "longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " ACTRLS_VOLUP " }, "shifted" :{ "pressed" : " ACTRLS_TOGGLE " }}]
Définit deux boutons
Tandis que la configuration nommée "Buttons_remap"
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "normal" :{ "pressed" : " BCTRLS_DOWN " }, "longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "shifter_gpio" : 4 , "normal" :{ "pressed" : " BCTRLS_UP " }}]
Définit deux boutons
Vous trouverez ci-dessous une interface à 2 boutons difficiles mais fonctionnelle pour votre plaisir de décodage:
actrls_config
:
buttons
buttons
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " ACTRLS_VOLDOWN " },
"longpress" :{ "pressed" : " buttons_remap " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " ACTRLS_VOLUP " },
"shifted" :{ "pressed" : " ACTRLS_TOGGLE " },
"longpress" :{ "pressed" : " ACTRLS_NEXT " }}
]
buttons_remap
:
[{ "gpio" : 4 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 ,
"normal" :{ "pressed" : " BCTRLS_DOWN " },
"longpress" :{ "pressed" : " buttons " }},
{ "gpio" : 5 , "type" : " BUTTON_LOW " , "pull" : true , "long_press" : 1000 , "shifter_gpio" : 4 ,
"normal" :{ "pressed" : " BCTRLS_UP " },
"shifted" :{ "pressed" : " BCTRLS_PUSH " },
"longpress" :{ "pressed" : " ACTRLS_PLAY " },
"longshifted" :{ "pressed" : " BCTRLS_LEFT " }}
]
Remarque importante : LMS prend également en charge la possibilité d'envoyer des codes de bouton «bruts». C'est un peu compliqué, alors supportez-moi. Les boutons peuvent être traités par SresseSP32 et mappés sur une "fonction" comme Play / Pause, soit ils peuvent être envoyés à LMS comme un code simple (brut) et la logique complète de la presse / de la libération / LongPress est gérée par LMS, vous ne faites pas ' t avoir un contrôle à ce sujet.
L'avantage du mode "brut" est que vous pouvez construire un lecteur qui est aussi proche que possible d'un boom (par exemple), mais vous ne pouvez pas utiliser la fonction de remappage ni LongPress ou Shift Logics pour faire votre propre cartographie lorsque vous avez un Ensemble limité de boutons. En mode «brut», tout ce dont vous avez vraiment besoin pour définir est le mappage entre le GPIO et le bouton. En ce qui concerne LMS, toute autre option de ces charges utiles JSON n'a pas d'importance. Désormais, lorsque vous utilisez BT ou AirPlay, la construction JSON complète décrite ci-dessus s'applique complètement, donc les options de remappage de changement de quart, de LongPress, fonctionnent toujours.
Sachez que lorsque vous utilisez le mode non "brut", l'interface CLI (interface de ligne de commande) de LMS est utilisée et doit être disponible sans mot de passe
Il n'y a pas de bonne ou de mauvaise option, c'est votre choix. Utilisez le paramètre NVS "LMS_CTRLS_RAW" pour modifier cette option
Notez que GPIO 36 et 39 sont uniquement entrés et ne peuvent pas utiliser l'interruption. Lorsque vous les utilisez pour un bouton, un sondage de 100 ms est démarré, ce qui est cher. Long Press est également susceptible de ne pas fonctionner très bien
Wired Ethernet est pris en charge par ESP32 avec diverses options, mais SPAILSP32 ne prend en charge qu'un Microchip LAN8720 avec une interface RMII comme celle-ci ou les ponts SPI-ETHERNET comme DM9051 comme celui-ci ou W5500 comme celui-ci.
Remarque: les boutons tactiles qui peuvent être trouvés sur une planche comme le Lyrat v4.3 ne sont pas pris en charge actuellement.
GPIO | Signal RMII | Remarques |
---|---|---|
Gpio21 | Tx_en | EMAC_TX_EN |
Gpio19 | Tx0 | EMAC_TXD0 |
Gpio22 | Tx1 | EMAC_TXD1 |
Gpio25 | RX0 | EMAC_RXD0 |
Gpio26 | RX1 | EMAC_RXD1 |
Gpio27 | CRS_DV | EMAC_RX_DRV |
Gpio0 | Ref_clk | Horloge de 50 MHz |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
La connexion d'une broche de réinitialisation pour le LAN8720 est facultative mais recommandée pour éviter que GPIO0 (horloge d'entrée 50MHz) verrouille l'ESP32 en mode de téléchargement au moment du démarrage.
L'APLL de l'ESP32 est requis pour le codec audio, nous avons donc besoin d'un LAN8720 qui fournit un