Cada vez más personas parecen utilizar esto sin un servidor LMS, sólo para BT, AirPlay o Spotify. Está bien, pero comprenda que squeezeliteESP32 es principalmente un reproductor Logitech Media Server y ha sido diseñado en torno a ese concepto. Todos los demás son complementos incorporados, por lo que otros modos tienen sus deficiencias. Así que asegúrese de leer esto antes de abrir un problema.
Squeezelite-esp32 es un paquete de software de audio creado para ejecutarse en los chipsets wifi (b/g/n) y bluetooth esp32 y esp32-s3 de espressif. Ofrece las siguientes capacidades
Dependiendo del hardware conectado al esp32, puedes enviar audio a un DAC local, a SPDIF o a un altavoz Bluetooth. El hardware mínimo requerido es un módulo WROVER con 4 MB de Flash y 4 MB de PSRAM (https://www.espressif.com/en/products/modules/esp32). Con ese módulo independiente, simplemente aplique energía y podrá transmitir a un altavoz Bluetooth. También puede enviar audio a la mayoría de los DAC I2S, así como a receptores SPDIF, utilizando solo un cable o un transductor óptico.
Pero squeezelite-esp32 es altamente extensible y puedes agregar
Otras características incluyen
Para controlar el ecualizador o usar la pantalla en LMS, se requiere un nuevo modelo de reproductor y esto se proporciona a través de un complemento que forma parte de los repositorios de terceros de LMS.
(Las opiniones presentadas aquí son I = @philippe44) La construcción principal de squeezelite-esp32 es un núcleo interno de 16 bits con todos los cálculos en 32 bits o precisión flotante. Esta es una elección de diseño que hice para preservar el rendimiento de la CPU (ya está estirando mucho el chipset esp32) y optimizar el uso de la memoria, ya que solo tenemos 4 MB de RAM utilizable. Algunos podrían comentar correctamente que el módulo WROVER tiene 8MB de RAM, pero el procesador sólo es capaz de direccionar 4MB y los 4MB restantes deben ser paginados por bloques más pequeños y yo no tengo paciencia para eso.
Ahora, cuando hice la migración de squeezelite a esp32, también hice que el núcleo de 16 o 32 bits fuera compatible en tiempo de compilación. Hasta el momento funciona en 32 bits pero se han realizado menos pruebas. Puede optar por compilarlo en modo de 32 bits. No me interesan mucho las muestras superiores a 16 bits porque no aportan nada (tengo experiencia en ingeniería en teoría de la información).
Capacidad | 16 bits | 32 bits | comentario |
---|---|---|---|
tasa de muestreo máxima | 192k | 96k | 192k es un gran desafío, especialmente cuando se combina con la pantalla |
profundidad máxima de bits | 16 | 24 | 24 bits se truncan en modo de 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 | |
igualada | Y | norte | 48kHz máx. (después del remuestreo): se omite la ecualización en pistas >48k |
remuestreo | Y | norte | |
fundido cruzado | 10 | <5s | Depende del tamaño del buffer y de la frecuencia de muestreo. |
El esp32 debe funcionar a 240 MHz, con E/S Quad-SPI a 80 MHz y un reloj de 40 Mhz. Aún así, hay mucho que ejecutar, especialmente sabiendo que tiene Flash serial y PSRAM, así que felicitaciones a Espressif por la optimización de su chipset. Ahora bien, tener toda la decodificación, remuestreo, ecualización, ganancia, visualización, espectro/vu es un equilibrio muy (muy) delicado entre el uso de RAM interna/externa, las prioridades de las tareas y el manejo del buffer. No es perfecto y cuanto más lleve el sistema al límite, mayor será el riesgo de que algunos archivos no se reproduzcan (ver más abajo). En general, la pantalla siempre tendrá la prioridad más baja y notará una desaceleración en el desplazamiento y en las frecuencias de actualización de VU/Spectrum. Ahora, incluso el hilo de visualización tiene alguna sección crítica y afecta las capacidades. Por ejemplo, una pantalla a color de 16 bits de profundidad con baja velocidad SPI puede impedir que funcione 24/96 flac pero aún funciona con pcm 24/96
En el modo de 16 bits, aunque se informa 192 kHz como velocidad máxima, se recomienda limitar la frecuencia de muestreo informada a 96k (-Z 96000). Tenga en cuenta que algunas transmisiones en línea de alta velocidad de 24/96k pueden tartamudear debido al rendimiento de la pila TCP/IP. Generalmente se debe al hecho de que el servidor envía pequeños paquetes de datos y el esp32 no puede recibir audio codificado lo suficientemente rápido, independientemente de la configuración de prioridad de la tarea (he intentado modificarlo bastante). La mejor opción en ese caso es dejar que LMS represente la transmisión, ya que proporcionará fragmentos más grandes y una transmisión "más fluida" que luego podrá manejarse.
Tenga en cuenta también que algunos códecs consumen más CPU que otros o no se han optimizado tanto. He hecho todo lo posible para modificarlos, pero ese nivel de optimización incluye escribir algún ensamblado, lo cual es doloroso. Un códec muy exigente es el AAC cuando los archivos se codifican con SBR. Permite la reconstrucción de la parte superior del espectro y, por lo tanto, una frecuencia de muestreo más alta, pero la especificación del códec es tal que esto es opcional, puede decodificar simplemente la banda inferior y aceptar una frecuencia de muestreo más baja. Consulte la opción AAC_DISABLE_SBR a continuación.
IMPORTANTE: en esp32 (no esp32-s3), el uso de Spotify con SPDIF produce audio entrecortado cuando las "estadísticas" están habilitadas. DEBES desactivarlos
Cualquier hardware basado en esp32 con al menos 4 MB de flash y 4 MB de PSRAM será capaz de ejecutar squeezelite-esp32 y existen varias placas que incluyen dicho chip. Algunos se mencionan a continuación, pero cualquiera debería funcionar. Puede encontrar varias ayudas e instrucciones aquí.
Para mayor claridad, los módulos WROOM NO funcionan ya que no incluyen PSRAM. Algunos diseños pueden agregarlo externamente, pero es (muy) improbable.
Según la descripción anterior, un módulo WROVER es suficiente para ejecutar Squeezelite-esp32, pero eso requiere un poco de retoque para ampliarlo y tener audio analógico o botones de hardware (por ejemplo)
Tenga en cuenta que al enviar a un altavoz Bluetooth (fuente), solo se pueden usar 44,1 kHz, por lo que puede dejar que LMS haga el remuestreo, pero debe asegurarse de que solo envíe pistas de 44,1 kHz o habilitar la opción de remuestreo interno (usando -R). . Si conecta un DAC, la elección de las frecuencias de muestreo dependerá de sus capacidades. Consulte a continuación para obtener más detalles.
La mayoría de los DAC funcionarán de inmediato con simplemente una conexión I2S, pero algunos requieren que se envíen comandos específicos mediante I2C. Consulte la opción DAC a continuación para comprender cómo enviar estos comandos dedicados. Hay soporte integrado para TAS575x, TAS5780, TAS5713 y AC101 DAC.
Los módulos basados en esp32-s3 como este también son compatibles pero requieren esp-idf 4.4. Aún no forma parte de los lanzamientos oficiales, pero se compila y ejecuta. El s3 no tiene audio bluetooth. Tenga en cuenta que el rendimiento de la CPU mejora considerablemente.
Este es el principal complemento de hardware de Squeezelite-esp32 y se ha desarrollado juntos. Los detalles sobre las capacidades se pueden encontrar aquí y aquí.
Si desea reconstruir, utilice el archivo de configuración squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
.
NB: Puede utilizar los binarios precompilados SqueezeAMP4MBFlash que tienen todas las E/S de hardware configuradas correctamente. También puede utilizar el binario genérico I2S4MBFlash, en cuyo caso los parámetros NVS se configurarán para obtener exactamente el mismo comportamiento.
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
El IR se puede utilizar como señal de despertador usando (configurando sleep_config
con wake=0:0
). Es un pull-up, por lo que permanece en 1 cuando no recibe nada, lo que significa que no se puede usar junto con otros IO de activación. Consulte Dormir para obtener más detalles sobre la limitación del despertar tras múltiples entradas.
Este altavoz portátil que funciona con baterías es compatible con squeezelite-esp32, para el cual se suministra una versión dedicada con cada actualización. Si desea reconstruir, utilice el archivo de configuración squeezelite-esp32-Muse-sdkconfig.defaults
.
NB: Puede utilizar los binarios precompilados Muse4MBFlash que tienen todas las E/S de hardware configuradas correctamente. También puede utilizar el binario genérico I2S4MBFlash, en cuyo caso los parámetros NVS se configurarán para obtener exactamente el mismo comportamiento.
muse
channel=5,scale=7.48,atten=3,cells=1
"mosi=15,miso=2,clk=14
(este probablemente sea opcional)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"}}]
Funciona con módulo ESP32-A1S que incluye códec de audio y salida de auriculares. Aún necesitarás usar una placa de demostración como esta o un amplificador externo si deseas una conexión directa de los altavoces. Tenga en cuenta que hay una versión con códec AC101 y otra con ES8388 con probablemente dos variantes: estas placas son un desastre (ver más abajo)
La placa que se muestra arriba tiene el siguiente conjunto de IO
(tenga en cuenta que algunos GPIO necesitan pull-ups)
Entonces una posible configuración sería
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 " }}]
para AC101
model=AC101,bck=27,ws=26,do=25,di=35,sda=33,scl=32
para ES8388 (parece que hay variantes con el mismo número de versión - un desastre total)
model=ES8388,bck=5,ws=25,do=26,sda=18,scl=23,i2c=16
omodel=ES8388,bck=27,ws=25,do=26,sda=33,scl=32,i2c=16
Este es un divertido reloj inteligente basado en ESP32. Tiene una pantalla ST7789 de 240x240 y audio integrado. No es muy útil para escuchar nada pero funciona. Este es un ejemplo de un dispositivo que requiere un conjunto de comandos I2C para su DAC/APU (ver más abajo). Hay una opción de compilación si decide reconstruir todo usted mismo; de lo contrario, la opción predeterminada de I2S funciona con los siguientes parámetros
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 requiere un chipset esp32 y 4 MB de PSRAM. ESP32-WROVER cumple con estos requisitos. Para obtener una salida de audio se puede utilizar un DAC I2S. Los DAC PCM5102 I2S baratos funcionan, pero muchos otros también lo hacen. Los DAC PCM5012 se pueden conectar mediante:
I2S - WROVER
VCC-3,3 V
3,3 V - 3,3 V
Tierra - Tierra
FLT - TIERRA
DMP - TIERRA
SCL-TIERRA
BCK - (BCK - ver más abajo)
DIN - (DO - ver más abajo)
LCK - (WS - ver más abajo) FMT - GND
XMT-3,3 V
Utilice el archivo de configuración squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults
.
Y el proyecto genial https://github.com/rochuck/squeeze-amp-too
Para acceder a NVS, en la interfaz de usuario web, vaya a créditos y seleccione "muestra el editor de nvs". Vaya a la pestaña del editor NVS para cambiar los parámetros de NFS. En la descripción de sintaxis a continuación, <> significa un valor, mientras que [] describe parámetros opcionales.
Como se mencionó anteriormente, hay algunas compilaciones dedicadas que se proporcionan hoy: SqueezeAMP y Muse, pero si las compila usted mismo, también puede crear una compilación para T-WATCH2020. La compilación predeterminada es un firmware genérico llamado I2S que se puede configurar a través de NVS para producir exactamente los mismos resultados que las compilaciones dedicadas. La diferencia es que los parámetros deben ingresarse y pueden borrarse accidentalmente. La GUI también proporciona una gran ayuda para cargar "conjuntos de configuración conocidos".
Por elección de diseño, no hay código que solo esté integrado para una versión determinada, todo el código está siempre ahí. La filosofía es minimizar tanto como sea posible el código específico de la plataforma y el uso de #ifdef
específico está prohibido, pase lo que pase. Entonces, si desea agregar su propia plataforma, observe detenidamente mainKConfig.projbuild
para ver cómo puede, usando los parámetros a continuación, hacer de su dispositivo una solución puramente basada en configuración. Cuando realmente no haya otra opción, mire targets<target>
para agregar su propio código. No aceptaré relaciones públicas para códigos que puedan evitar la creación de dicho código dedicado siempre que sea posible. El "objetivo" NVS se utilizará para llamar al código específico del destino, pero nuevamente, esto es puramente tiempo de ejecución, no tiempo de compilación.
El parámetro NVS "i2c_config" establece el gpio del i2c utilizado para fines genéricos (por ejemplo, visualización). Déjelo en blanco para desactivar el uso de I2C. Tenga en cuenta que en SqueezeAMP, el puerto debe ser 1. La velocidad predeterminada es 400000, pero algunas pantallas pueden alcanzar hasta 800000 o más. La sintaxis es
sda=<gpio>,scl=<gpio>[,port=0|1][,speed=<speed>]
Tenga en cuenta que no puede utilizar el mismo GPIO o puerto que el DAC.
El esp32 tiene 4 subsistemas SPI, uno es inaccesible, por lo que la numeración es 0..2 y SPI0 está reservado para Flash/PSRAM. El parámetro NVS "spi_config" establece el gpio del spi utilizado para fines genéricos (por ejemplo, visualización). Déjelo en blanco para desactivar el uso de SPI. El parámetro DC es necesario para las pantallas. La sintaxis es
data|mosi=<gpio>,clk=<gpio>[,dc=<gpio>][,host=1|2][,miso=<gpio>]
El valor predeterminado y único "host" es 1, ya que flash y spiram ya utilizan otros. El parámetro opcional "miso" (MasterInSlaveOut) solo se usa cuando el bus SPI es bidireccional y se comparte con otros periféricos como ethernet o expansor gpio. Tenga en cuenta que los "datos" también pueden denominarse "mosi" (MasterOutSlaveIn).
El parámetro NVS "dac_config" establece el gpio utilizado para la comunicación de i2s con su DAC. Puede definir los valores predeterminados en el momento de la compilación, pero el parámetro nvs tiene prioridad, excepto para las configuraciones con nombre.
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 el "modelo" no está configurado o no se reconoce, entonces se utiliza el "I2S" predeterminado. La opción "mck" se utiliza para algunos códecs que requieren un reloj maestro (aunque no deberían hacerlo). De forma predeterminada, GPIO0 se usa como MCLK y solo las compilaciones recientes (posteriores a mediados de 2023) pueden usar 1 o 2. También tenga en cuenta que esto no puede coexistir con RMII Ethernet (consulte la sección de Ethernet a continuación). Los parámetros I2C son opcionales y solo son necesarios si su DAC requiere un control I2C (consulte 'dac_controlset' a continuación). Tenga en cuenta que los parámetros "i2c" son decimales, no se permite la notación hexadecimal.
Hasta ahora, TAS57xx, TAS5713, AC101, WM8978 y ES8388 son modelos reconocidos donde se envían los controles de secuencia de inicio/volumen/potencia adecuados. Para otros códecs que puedan requerir comandos I2C, utilice el parámetro "dac_controlset" que permite la definición de comandos simples que se enviarán a través de i2c para encender y apagar el inicio, el encendido, el altavoz y los auriculares usando una sintaxis JSON:
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
Donde <command>
es uno de init, encendido, apagado, altavoz encendido, altavoz apagado, auricular encendido, auricular apagado ( debe ser una matriz incluso para un solo elemento). El artículo es cualquiera de los siguientes elementos.
{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}
{"gpio":<gpio>,"level":0|1}
{"delay":<ms>}
Esta es la notación JSON estándar, por lo que si no está familiarizado con ella, Google es su mejor amigo. Tenga en cuenta que '...' significa que puede tener tantas entradas como desee, no forma parte de la sintaxis. Cada sección es opcional, pero no tiene sentido configurar i2c en el parámetro 'dac_config' y no configurar nada aquí.
La clave reg
permite escribir registros en el bus i2c. El mode
de parámetro permite o el registro con el valor o y él. No configure mode
si simplemente desea escribir. El parámetro val
puede ser una matriz [v1, v2,...] para escribir una serie de bytes en una única ráfaga i2c (en ese caso se ignora el 'modo'). Tenga en cuenta que todos los valores deben ser decimales . Puede utilizar un validador como este para verificar su sintaxis. La clave gpio
es simplemente configurar un gpio como parte de la acción del DAC y delay
permite una pausa entre elementos.
El comando 'encendido' se utiliza cuando se enciende/apaga el DAC después del período de inactividad (consulte la opción -C de squeezelite) y los comandos 'altavoz/auriculares' se envían al cambiar entre altavoces y auriculares (consulte Detección de conector de auriculares).
NB: Para configuraciones con nombre ((SqueezeAMP, Muse... todas excepto I2S), todo esto se ignora. Para códecs conocidos, las secuencias integradas se pueden sobrescribir usando dac_controlset
Tenga en cuenta que no puede utilizar el mismo GPIO o puerto que el I2C.
El parámetro NVS "spdif_config" establece el gpio del i2s necesario para SPDIF.
SPDIF está disponible reutilizando la interfaz i2s de una manera no estándar, por lo que aunque solo se necesita un pin (DO), el controlador debe inicializarse por completo, por lo que el reloj de bits (bck) y el reloj de palabra (ws) deben ser conjunto también. Como i2s y SPDIF son mutuamente excluyentes, puede reutilizar el mismo IO si su hardware lo permite.
Puede definir los valores predeterminados en el momento de la compilación, pero el parámetro nvs tiene prioridad, excepto para las configuraciones con nombre (SqueezeAMP, Muse...)
Déjelo en blanco para deshabilitar el uso de SPDIF; también puede definirlos en el momento de la compilación usando "make menuconfig". La sintaxis es
bck=<gpio>,ws=<gpio>,do=<gpio>
NB: Para configuraciones con nombre, esto se ignora
La profundidad máxima de bits es de 24 bits, incluso en modo de 32 bits (esta es una limitación de SPDIF; gracias a @UrbanLienert por la actualización de 20 a 24 bits). Ahora, también puedes obtener SPDIF usando un chip especializado que ofrece una interfaz I2S como un DAC pero escupe SPDIF (óptico y coaxial). Luego se refiere al capítulo DAC.
Si quieres coaxial, también puedes usar un truco de pobre para generar una señal desde un GPIO de 3.3V. Todo lo que hace es dividir los 3,3 V para generar 0,6 V pico a pico y luego eliminar la CC.
100nF
GPIO ----210ohm-----------||---- coax S/PDIF signal out
|
110ohm
|
Ground -------------------------- coax signal ground
El parámetro NVS "display_config" establece los parámetros para una pantalla opcional. Puede ser I2C (ver aquí para bus compartido) o SPI (ver aquí para bus compartido) La sintaxis es
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]]
Puedes modificar cómo se muestran el vu-metro y el analizador de espectro, así como el tamaño de la obra de arte a través de un menú dedicado en la configuración del reproductor (no olvides agregar el complemento).
El parámetro NVS "metadata_config" establece cómo se muestran los metadatos para AirPlay y Bluetooth. La sintaxis es
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
, %album%
, %title%
. Usando esa cadena de formato, las palabras clave se reemplazan por su valor para construir la cadena que se mostrará. Tenga en cuenta que se eliminará el texto sin formato que sigue a una palabra clave que esté vacía durante la reproducción de una pista. Por ejemplo, si ha configurado format= %artist% - %title%
y no hay ningún artista en los metadatos, entonces solo se mostrará <title>
, no - <title>
.Puedes utilizar cualquier receptor IR compatible con protocolo NEC (38KHz) o RC5. Vcc, GND y salida son los únicos pines que deben conectarse, sin pullup, sin condensador de filtrado, es una conexión recta.
Los códigos IR se envían "tal cual" al LMS, por lo que solo funcionará un control remoto Logitech SB de Boom, Classic o Touch. Creo que el archivo Slim_Devices_Remote.ir en el directorio "servidor" de LMS se puede modificar para adaptarlo a otros códigos, pero no lo he probado.
En modo AirPlay y Bluetooth, solo se admiten estos controles remotos nativos, no agregué la opción de crear tu propio mapeo
Consulte "configurar GPIO" a continuación para configurar el GPIO asociado al receptor de infrarrojos (opción "ir").
El parámetro "set_GPIO" se utiliza para asignar GPIO a varias funciones.
GPIO se puede configurar para proporcionar GND o Vcc en el arranque. Esto es conveniente para alimentar dispositivos que consumen menos de 40 mA desde el conector lateral. Tenga cuidado porque no se realizan comprobaciones de conflictos con respecto al GPIO que está cambiando, por lo que podría dañar su placa o crear un conflicto aquí.
El parámetro <amp>
se puede utilizar para asignar un GPIO que se establecerá en el nivel activo (predeterminado 1) cuando comience la reproducción. Se restablecerá cuando squeezelite quede inactivo. El tiempo de espera de inactividad se establece en la línea de comando de squeezelite mediante -C <timeout>
El parámetro <power>
se puede usar para asignar un GPIO que se establecerá en el nivel activo (predeterminado 1) cuando el reproductor esté encendido y se restablecerá cuando esté apagado (en LMS, no se aplica a AirPlay, Spotify o BT).
Si tiene un conector de audio que admite la inserción (use :0 o :1 para configurar el nivel cuando se inserta), puede especificar a qué GPIO está conectado. El uso del parámetro jack_mutes_amp permite silenciar el amplificador cuando se insertan auriculares (por ejemplo).
También puede configurar el LED de estado verde y rojo con su respectivo estado activo (:0 o :1) o especificar el conjunto de chips si usa un LED RGB direccionable.
El parámetro <ir>
establece el GPIO asociado a un receptor de IR. No es necesario agregar pullup ni condensador
La sintaxis es:
<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>]
Puede definir los valores predeterminados para los LED jack y spkfault en tiempo de compilación, pero el parámetro nvs tiene prioridad, excepto para las configuraciones con nombre ((SqueezeAMP, Muse...) donde se fuerzan en tiempo de ejecución. Tenga en cuenta que gpio 36 y 39 son solo de entrada y no pueden usarse interrupción Cuando se configura como falla del conector o del altavoz, un sondeo de 100 ms verifica su valor, pero eso es costoso.
Es posible agregar expansores GPIO mediante bus I2C o SPI. Deberían usarse principalmente para botones, pero también pueden admitir salidas con fines genéricos. Estos GPIO adicionales se pueden numerar a partir de un valor arbitrario (40 y superior, ya que esp32 tiene GPIO 0..39). Luego, estos nuevos GPIO "virtuales" de (por ejemplo) 100 a 115 se pueden usar en la configuración de botones, set_GPIO u otras configuraciones.
Cada expansor puede admitir hasta 32 GPIO. Para utilizar un expansor de botones, se debe proporcionar una interrupción; el modo de sondeo no es aceptable. Aún se puede configurar un expansor sin interrupción, pero solo se podrá utilizar la salida. Tenga en cuenta que la misma interrupción se puede compartir entre expansores, siempre que utilicen drenaje abierto o colectores abiertos (lo que probablemente todos hagan)
El parámetro "gpio_exp_config" es una lista separada por punto y coma (;) con la siguiente sintaxis para cada expansor
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
Tenga en cuenta que PWM ("led_brightness" a continuación) no es compatible con GPIO expandidos y no se pueden usar para señales de sincronización precisa o de alta velocidad como CS, D/C, Reset y Ready. Se admiten botones, codificador rotatorio, control de amplificador y alimentación. Dependiendo del conjunto de chips real, es posible que se admita pullup o pulldown, por lo que es posible que deba agregar resistencias externas (solo MCP23x17 realiza pullup). El pca8575 no es un gran chip, genera bastantes interrupciones falsas cuando se usa para salida GPIO. Cuando se utiliza un expansor SPI, el bus debe configurarse utilizando un bus SPI compartido
Consulte set_GPIO para saber cómo configurar los LED verde y rojo (incluidos los RGB direccionables). Además, su brillo se puede controlar mediante el parámetro "led_brigthness". La sintaxis es
[green=0..100][,red=0..100]
NB: Para la configuración con nombre, GPIO afectado al LED verde y rojo no se puede cambiar, pero se aplica la opción de brillo
Se puede configurar una tira de LED con hasta 255 LED direccionables para ofrecer visualizaciones mejoradas. El visualizador VU Meter incluye un indicador del estado de la batería (ver Batería). Actualmente solo se admiten LED WS2812B. Establezca la configuración del hardware de la tira de LED, o la sintaxis NVS led_vu_config es
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
donde <n>
es el número de LED en la tira (1..255). Se puede agregar un valor de ganancia <scale>
(porcentaje) para mejorar las respuestas del efecto.
Se requiere la última actualización del complemento LMS para configurar el modo del visualizador y el brillo en la página de configuración ESP32 para el reproductor o una pantalla controlable (consulte Menús Extra/SqueezeESP32). El complemento agrega comandos CLI de LMS adicionales.
Dominio | Notas |
---|---|
<playerid> led_visual [<modo>] [<brillo>] | Alterna o selecciona el "modo" del visualizador. El brillo del visualizador (0..255) se puede controlar mediante la etiqueta "brillo". |
<playerid> dmx <R,G,B,R,G,B, ... R,G,B> [<desplazamiento>] | Establece el color del LED comenzando en la posición "desplazamiento" con secuencias de colores "R" (rojo), "G" (verde) y "B" (azul). Agregue valores RGB adicionales a la cadena delimitada para configurar varios LED. |
Se admite un codificador rotatorio general, cambio de cuadratura con prensa. Estos codificadores suelen tener 2 pines para codificadores (A y B), un C común que debe conectarse a tierra y un pin SW opcional para presionar. A, B y SW deben estar levantados, por lo que ESP32 proporciona el pull-up automático, pero usted puede agregar sus propias resistencias. Un poco de filtrado en A y B (~470 nF) ayuda a eliminar el rebote que no se realiza mediante software.
El codificador normalmente está codificado para mover respectivamente hacia la izquierda, hacia la derecha y presionar LMS y para alternar bajar/subir/reproducir volumen en BT, AirPlay y Spotify. El uso de la opción 'volumen' hace que esté codificado para bajar/subir/reproducir alternar todo el tiempo (incluso en LMS). La opción 'pulsación larga' permite un modo alternativo cuando se mantiene presionada la tecla SW. En ese modo, la izquierda es la anterior, la derecha es la siguiente y presionar es alternar. Cada pulsación larga en SW alterna entre modos (el comportamiento real del modo principal depende del "volumen").
También existe la posibilidad de utilizar la opción 'knobonly' (exclusiva con 'volumen' y 'pulsación larga'). Este modo intenta ofrecer una navegación completa con una sola perilla que está un poco distorsionada debido a los principios de la interfaz de usuario de LMS. Izquierda, Derecha y Presionar obedecen a las reglas de navegación del LMS y, especialmente, Presionar siempre va al elemento del submenú inferior, incluso cuando se navega en la Biblioteca de música. Eso supone un desafío ya que no hay ningún botón "Reproducir", "Atrás" o "Pausa". Las soluciones alternativas son las siguientes:
La velocidad del doble clic (o izquierda-derecha) se puede configurar usando el parámetro opcional de 'knobonly'. Ésta no es una solución perfecta y otras ideas son bienvenidas. Tenga en cuenta que cuanto más tiempo establezca la velocidad del doble clic, menos receptiva será la interfaz. La razón es que necesito esperar ese retraso antes de decidir si se trata de un clic simple o doble. También puede hacer que las "vacilaciones" en la navegación del menú se interpreten fácilmente como "Pausa".
Utilice el parámetro Rotary_config con la siguiente sintaxis:
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]]|[[,volume][,longpress]]]]
Nota de hardware: todos los gpio utilizados para rotativos tienen pull-up interno, por lo que normalmente no es necesario proporcionar Vcc al codificador. Sin embargo, si la placa codificadora que estás usando también tiene sus propios pull-up que son más fuertes que los del ESP32 (que es probablemente el caso), entonces habrá interferencias entre gpio, por lo que debes traer Vcc. Mire el esquema de su tablero y comprenderá que estos pull-up de tablero crean un pull-down "ganador" cuando cualquier otro pin está conectado a tierra.
El SW gpio es opcional, puedes convertirlo en un botón puro si lo prefieres, pero las opciones de volumen, pulsación larga y solo perilla tienen poco sentido ya que el interruptor que falta juega un papel importante en estos modos. Aún podrías tener el modo "volumen", pero no podrás usarlo para nada excepto subir y bajar el volumen. Así que tenga en cuenta que el uso de la sintaxis [] es un poco engañoso.
Consulte también la "NOTA IMPORTANTE" en la sección "Botones" y recuerde que cuando se activa 'lms_ctrls_raw' (ver más abajo), no se aplica ninguna de estas opciones de solo perilla, volumen y pulsación larga; los códigos de botón sin procesar (no acciones) simplemente se envían al LMS.
Tenga en cuenta que en esp32, gpio 36 y 39 son solo de entrada y no pueden usar interrupción, por lo que no se pueden configurar en A o B. Cuando se usan para SW, se usa un sondeo de 100 ms, lo cual es costoso.
Se admite un codificador rotatorio de volumen dedicado, cambio de cuadratura con presión. El codificador está codificado para subir, bajar y alternar volumen para LMS, BT, AirPlay y Spotify (consulte la nota anterior para filtrar y la nota de HW, así como GPIO 36 y 39 en esp32)
Utilice el parámetro volume_rotary con la siguiente sintaxis:
A=<gpio>,B=<gpio>[,SW=gpio>]
Los botones se describen utilizando una cadena JSON con la siguiente sintaxis
[
{ "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> },
},
{ ... },
{ ... },
]
Donde (todos los parámetros son opcionales excepto gpio)
Donde <action>
es el nombre de otra configuración para cargar (reasignar) o uno entre
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,
Tenga en cuenta que actrls_sleep no es un botón real que se puede enviar a LMS, pero es un gancho para activar el modo de suspensión profunda (ver durmiendo).
Una de las que ha creado una cadena de este tipo, úsela para llenar un nuevo parámetro NVS con cualquier nombre por debajo de 16 (?) Caracteres. Puede tener tantas de estas configuraciones como pueda. Luego establezca el parámetro de configuración "actrls_config" con el nombre de su configuración predeterminada
Por ejemplo, una configuración llamada "Botones":
[{ "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 " }}]
Define dos botones
Mientras que la configuración se llama "Botones_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 " }}]
Define dos botones
A continuación se muestra una interfaz de 2 buttones difícil pero funcional para su placer de decodificación:
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 " }}
]
Nota importante : LMS también admite la posibilidad de enviar códigos de botones 'sin procesar'. Es un poco complicado, así que tengan paciencia conmigo. Los botones se pueden procesar mediante SqueezeSp32 y asignar a una "función" como Play/Pause o pueden enviarse a LMS como código simple (RAW) y la lógica completa de Press/Release/LongPress es manejada por LMS, usted no 'no' T tiene algún control sobre eso.
El beneficio del modo "en bruto" es que puede construir un reproductor que esté lo más cerca posible de un boom (por ejemplo), pero no puede usar la función de reasignación ni las lógicas longitudes o de cambio para hacer su propia asignación cuando tiene un conjunto limitado de botones. En el modo 'RAW', todo lo que realmente necesita definir es la asignación entre el GPIO y el botón. En lo que respecta a LMS, cualquier otra opción en estas cargas útiles JSON no importa. Ahora, cuando usa BT o AirPlay, la construcción JSON completa descrita anteriormente se aplica completamente, por lo que las opciones de cambio, longpress y reasignos todavía funcionan.
Tenga en cuenta que al usar el modo no "sin procesar", la CLI (interfaz de línea de comando) de LMS se usa y debe estar disponible sin contraseña
No hay una buena o mala opción, es su elección. Use el parámetro NVS "LMS_CTRLS_RAW" para cambiar esa opción
Tenga en cuenta que GPIO 36 y 39 son solo de entrada y no pueden usar la interrupción. Al usarlos para un botón, se inicia una votación de 100 ms que es costosa. Es probable que la prensa larga también no funcione muy bien
Ethernet cableado es compatible con ESP32 con varias opciones, pero SqueezeSp32 solo admite un Microchip LAN8720 con una interfaz RMII como esta o puentes Spihetnet como Davicom DM9051 que o W5500 así.
Nota: los botones táctiles que se pueden encontrar en algún tablero, como el Lyrat V4.3, no son compatibles actualmente.
GPIO | Señal RMII | Notas |
---|---|---|
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 | Reloj de 50MHz |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
Conectar un pin de reinicio para el LAN8720 es opcional, pero se recomienda evitar que GPIO0 (reloj de entrada de 50MHz) bloquea el ESP32 en el modo de descarga en el momento del arranque.
Se requiere el APLL del ESP32 para el códec de audio, por lo que necesitamos un LAN8720 que proporcione un