점점 더 많은 사람들이 LMS 서버 없이 BT, AirPlay 또는 Spotify용으로 이것을 사용하는 것 같습니다. 괜찮지만 squeezeliteESP32는 기본적으로 Logitech 미디어 서버 플레이어이며 해당 개념을 중심으로 설계되었다는 점을 이해하십시오. 다른 모든 모드는 여기에 추가 기능이 포함되어 있으므로 다른 모드에는 단점이 있습니다. 그러니 이슈를 열기 전에 이 글을 꼭 읽어주세요
Squeezelite-esp32는 espressif의 esp32 및 esp32-s3 wifi(b/g/n) 및 블루투스 칩셋에서 실행되도록 만들어진 오디오 소프트웨어 제품군입니다. 다음과 같은 기능을 제공합니다
esp32에 연결된 하드웨어에 따라 오디오를 로컬 DAC, SPDIF 또는 Bluetooth 스피커로 보낼 수 있습니다. 최소한으로 필요한 하드웨어는 4MB 플래시와 4MB PSRAM을 갖춘 WROVER 모듈입니다(https://www.espressif.com/en/products/modules/esp32). 해당 모듈을 독립형으로 사용하면 전원을 공급하기만 하면 Bluetooth 스피커로 스트리밍할 수 있습니다. 또한 케이블이나 광 변환기만 사용하여 대부분의 I2S DAC는 물론 SPDIF 수신기에도 오디오를 보낼 수 있습니다.
그러나 squeezelite-esp32는 확장성이 뛰어나므로 추가할 수 있습니다.
다른 기능은 다음과 같습니다
LMS에서 이퀄라이저를 제어하거나 디스플레이를 사용하려면 새로운 플레이어 모델이 필요하며 이는 LMS의 타사 저장소에 포함된 플러그인을 통해 제공됩니다.
(여기에 제시된 의견이므로 I = @philippe44) squeezelite-esp32의 주요 빌드는 모든 계산이 32비트 또는 부동 소수점 정밀도로 수행되는 16비트 내부 코어입니다. 이는 CPU 성능을 보존하고(이미 esp32 칩셋을 많이 확장하고 있음) 사용 가능한 RAM이 4MB에 불과하므로 메모리 사용을 최적화하기 위해 선택한 설계입니다. 어떤 사람들은 WROVER 모듈에 8MB의 RAM이 있다고 정확하게 설명할 수도 있지만 프로세서는 4MB만 처리할 수 있고 나머지 4MB는 더 작은 블록으로 페이지를 매겨야 하며 저는 이에 대해 인내심이 없습니다.
이제 squeezelite를 esp32로 포팅했을 때 컴파일 타임에 코어 16비트 또는 32비트도 호환되도록 만들었습니다. 지금까지는 32비트에서 작동하지만 테스트가 덜 수행되었습니다. 32비트 모드로 컴파일하도록 선택할 수 있습니다. 나는 16비트 샘플 위에는 아무 것도 가져오지 않기 때문에 그다지 관심이 없습니다(나는 정보 이론에 대한 엔지니어링 배경 지식을 가지고 있습니다).
능력 | 16비트 | 32비트 | 논평 |
---|---|---|---|
최대 샘플링 속도 | 192k | 96k | 192k는 특히 디스플레이와 결합할 때 매우 까다롭습니다. |
최대 비트 심도 | 16 | 24 | 16비트 모드에서는 24비트가 잘립니다. |
spdif | 16비트 | 20비트 | |
mp3, aac, opus, ogg/vorbis | 48,000 | 48,000 | |
alac, flac, ogg/flac | 96k | 96k | |
PCM, WAV, AIF | 192k | 96k | |
평형 장치 | 와이 | N | 최대 48kHz(리샘플링 후) - 48,000개가 넘는 트랙에서 이퀄라이제이션 건너뛰기 |
리샘플링 | 와이 | N | |
크로스페이드 | 10초 | 5초 미만 | 버퍼 크기와 샘플링 속도에 따라 다름 |
esp32는 80MHz의 Quad-SPI I/O 및 40Mhz의 클럭으로 240MHz에서 실행되어야 합니다. 그래도 실행해야 할 부분이 많으며 특히 직렬 플래시와 PSRAM이 있다는 점을 알고 있으므로 칩셋 최적화에 대해 Espressif에 찬사를 보냅니다. 이제 모든 디코딩, 리샘플링, 이퀄라이징, 게인, 디스플레이, 스펙트럼/VU를 갖추려면 내부/외부 RAM 사용, 작업 우선 순위 및 버퍼 처리 간의 매우 (매우) 섬세한 균형이 필요합니다. 완벽하지는 않으며 시스템을 한계까지 밀어붙일수록 일부 파일이 재생되지 않을 위험이 높아집니다(아래 참조). 일반적으로 디스플레이는 항상 가장 낮은 우선순위를 가지며 스크롤 및 VU/스펙트럼 새로 고침 빈도가 느려지는 것을 느낄 수 있습니다. 이제 디스플레이 스레드에도 몇 가지 중요한 섹션이 있으며 기능에 영향을 미칩니다. 예를 들어 SPI 속도가 낮은 16비트 심도 컬러 디스플레이에서는 24/96 flac가 작동하지 않을 수 있지만 여전히 pcm 24/96에서는 작동합니다.
16비트 모드에서는 192kHz가 최대 속도로 보고되지만 보고된 샘플링 속도를 96k(-Z 96000)로 제한하는 것이 좋습니다. 일부 고속 24/96k 온라인 스트림은 TCP/IP 스택 성능으로 인해 끊길 수 있습니다. 이는 일반적으로 서버가 작은 데이터 패킷을 전송하고 esp32가 작업 우선 순위 설정에 관계없이 인코딩된 오디오를 충분히 빠르게 수신할 수 없기 때문입니다(저는 이를 약간 조정하려고 했습니다). 이 경우 가장 좋은 옵션은 LMS가 스트림을 프록시하도록 하는 것입니다. 그러면 더 큰 청크와 처리할 수 있는 "부드러운" 스트림이 제공됩니다.
또한 일부 코덱은 다른 코덱보다 더 많은 CPU를 소비하거나 많이 최적화되지 않았습니다. 나는 이것을 조정하기 위해 최선을 다했지만 최적화 수준에는 고통스러운 어셈블리 작성이 포함됩니다. 매우 까다로운 코덱 중 하나는 파일이 SBR로 인코딩될 때 AAC입니다. 스펙트럼의 상위 부분을 재구성하여 더 높은 샘플링 속도를 허용하지만 코덱 사양은 선택 사항이므로 단순히 낮은 대역을 디코딩하고 더 낮은 샘플링 속도를 허용할 수 있습니다. 아래 AAC_DISABLE_SBR 옵션을 참조하세요.
중요: esp32(esp32-s3 아님)에서 SPDIF와 함께 Spotify를 사용하면 "통계"가 활성화된 경우 오디오가 끊기는 현상이 발생합니다. 반드시 비활성화해야 합니다.
최소 4MB의 플래시와 4MB의 PSRAM을 갖춘 모든 esp32 기반 하드웨어는 squeezelite-esp32를 실행할 수 있으며 이러한 칩을 포함하는 다양한 보드가 있습니다. 아래에 몇 가지가 언급되어 있지만 어떤 것이든 작동합니다. 여기에서 다양한 도움말과 지침을 찾을 수 있습니다.
명확성을 위해 WROOM 모듈은 PSRAM을 포함하지 않으므로 작동하지 않습니다. 일부 디자인에서는 외부적으로 추가할 수도 있지만 그럴 가능성은 매우 낮습니다.
위의 설명에 따르면 WROVER 모듈은 Squeezelite-esp32를 실행하는 데 충분하지만 아날로그 오디오 또는 하드웨어 버튼(예:)을 갖도록 확장하려면 약간의 손길이 필요합니다.
블루투스 스피커(소스)로 전송할 때는 44.1kHz만 사용할 수 있으므로 LMS가 리샘플링을 하도록 하되 44.1kHz 트랙만 전송하는지 확인하거나 내부 리샘플링(-R 사용) 옵션을 활성화해야 합니다. . DAC를 연결하는 경우 샘플링 속도 선택은 해당 기능에 따라 달라집니다. 자세한 내용은 아래를 참조하세요.
대부분의 DAC는 I2S 연결만으로 즉시 작동하지만 일부 DAC는 I2C를 사용하여 특정 명령을 전송해야 합니다. 이러한 전용 명령을 보내는 방법을 이해하려면 아래 DAC 옵션을 참조하세요. TAS575x, TAS5780, TAS5713 및 AC101 DAC에 대한 지원이 내장되어 있습니다.
이와 같은 esp32-s3 기반 모듈도 지원되지만 esp-idf 4.4가 필요합니다. 아직 공식 릴리스의 일부는 아니지만 컴파일 및 실행됩니다. s3에는 블루투스 오디오가 없습니다. CPU 성능이 크게 향상되었습니다.
이것은 Squeezelite-esp32의 주요 하드웨어 동반자이며 함께 개발되었습니다. 기능에 대한 자세한 내용은 여기 및 여기에서 확인할 수 있습니다.
다시 빌드하려면 squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
구성 파일을 사용하세요.
주의: 모든 하드웨어 I/O가 올바르게 설정된 사전 빌드 바이너리인 SqueezeAMP4MBFlash를 사용할 수 있습니다. 일반 바이너리 I2S4MBFlash를 사용할 수도 있습니다. 이 경우 NVS 매개변수는 정확히 동일한 동작을 얻도록 설정되어야 합니다.
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
IR은 ( wake=0:0
으로 sleep_config
설정)을 사용하여 깨우기 신호로 사용될 수 있습니다. 풀업이므로 아무것도 수신하지 않을 때 1로 유지됩니다. 즉, 다른 깨우기 IO와 함께 사용할 수 없습니다. 다중 입력 시 절전 모드 해제 제한에 대한 자세한 내용은 Sleeping을 참조하세요.
이 휴대용 배터리 구동 스피커는 모든 업데이트와 함께 제공되는 전용 빌드가 있는 squeezelite-esp32와 호환됩니다. 다시 빌드하려면 squeezelite-esp32-Muse-sdkconfig.defaults
구성 파일을 사용하십시오.
주의: 모든 하드웨어 I/O가 올바르게 설정된 사전 빌드 바이너리인 Muse4MBFlash를 사용할 수 있습니다. 일반 바이너리 I2S4MBFlash를 사용할 수도 있습니다. 이 경우 NVS 매개변수는 정확히 동일한 동작을 얻도록 설정되어야 합니다.
muse
channel=5,scale=7.48,atten=3,cells=1
"mosi=15,miso=2,clk=14
(이것은 아마도 선택 사항일 것입니다)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"}}]
오디오 코덱 및 헤드셋 출력을 포함하는 ESP32-A1S 모듈과 함께 작동합니다. 스피커를 직접 연결하려면 이와 같은 데모 보드나 외부 앰프를 사용해야 합니다. AC101 코덱이 포함된 버전과 아마도 두 가지 변형이 포함된 ES8388이 포함된 또 다른 버전이 있다는 점에 유의하세요. 이 보드는 엉망입니다(아래 참조).
위에 표시된 보드에는 다음과 같은 IO 세트가 있습니다.
(일부 GPIO에는 풀업이 필요함)
따라서 가능한 구성은 다음과 같습니다.
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 " }}]
AC101 용
model=AC101,bck=27,ws=26,do=25,di=35,sda=33,scl=32
ES8388 의 경우(동일한 버전 번호의 변형이 있는 것 같습니다 - 완전히 엉망입니다)
model=ES8388,bck=5,ws=25,do=26,sda=18,scl=23,i2c=16
또는model=ES8388,bck=27,ws=25,do=26,sda=33,scl=32,i2c=16
ESP32를 기반으로 한 재미있는 스마트워치입니다. 240x240 ST7789 화면과 온보드 오디오가 있습니다. 아무것도 듣는 데는 그다지 유용하지 않지만 작동합니다. 이는 DAC/APU에 대한 I2C 명령 세트가 필요한 장치의 예입니다(아래 참조). 모든 것을 직접 재구축하기로 결정한 경우 빌드 옵션이 있습니다. 그렇지 않으면 I2S 기본 옵션이 다음 매개변수와 함께 작동합니다.
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에는 esp32 칩셋과 4MB PSRAM이 필요합니다. ESP32-WROVER는 이러한 요구 사항을 충족합니다. 오디오 출력을 얻으려면 I2S DAC를 사용할 수 있습니다. 저렴한 PCM5102 I2S DAC는 작동하지만 다른 DAC도 작동합니다. PCM5012 DAC는 다음을 통해 연결할 수 있습니다.
I2S - 워버
VCC - 3.3V
3.3V - 3.3V
접지 - 접지
FLT-GND
DMP-GND
SCL-GND
BCK - (BCK - 아래 참조)
DIN - (DO - 아래 참조)
LCK - (WS - 아래 참조) FMT - GND
XMT - 3.3V
squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults
구성 파일을 사용하세요.
그리고 정말 멋진 프로젝트 https://github.com/rochuck/squeeze-amp-too
NVS에 액세스하려면 webUI에서 크레딧으로 이동하여 "nvs 편집기 표시"를 선택하세요. NFS 매개변수를 변경하려면 NVS 편집기 탭으로 이동하세요. 아래 구문 설명에서 <>는 값을 의미하고 []는 선택적 매개변수를 설명합니다.
위에서 언급한 대로 현재 제공되는 전용 빌드는 SqueezeAMP 및 Muse입니다. 하지만 직접 빌드하는 경우 T-WATCH2020용 빌드를 생성할 수도 있습니다. 기본 빌드는 전용 빌드와 정확히 동일한 결과를 생성하도록 NVS를 통해 구성할 수 있는 I2S라는 일반 펌웨어입니다. 차이점은 매개변수를 입력해야 하며 실수로 삭제될 수 있다는 것입니다. GUI는 "알려진 구성 세트"를 로드하는 데에도 큰 도움을 제공합니다.
설계상 특정 버전에만 포함되는 코드는 없으며 모든 코드는 항상 존재합니다. 플랫폼별 코드를 최대한 최소화하는 것이 철학이며, 어떤 경우에도 특정 #ifdef
의 사용은 금지됩니다. 따라서 자신만의 플랫폼을 추가하려면 mainKConfig.projbuild
를 자세히 살펴보고 아래 매개변수를 사용하여 장치를 순전히 구성 기반 솔루션으로 만드는 방법을 알아보세요. 실제로 다른 옵션이 없다면, targets<target>
을 보고 자신만의 코드를 추가하세요. 가능하면 이러한 전용 코드 생성을 피할 수 있는 코드에 대한 PR은 허용하지 않습니다. NVS "대상"은 대상별 코드를 호출하는 데 사용되지만 이는 컴파일 타임이 아니라 순전히 런타임입니다.
NVS 매개변수 "i2c_config"는 일반적인 목적(예: 디스플레이)으로 사용되는 i2c의 gpio를 설정합니다. I2C 사용을 비활성화하려면 공백으로 남겨두세요. SqueezeAMP에서 포트는 1이어야 합니다. 기본 속도는 400000이지만 일부 디스플레이는 최대 800000 이상을 수행할 수 있습니다. 구문은
sda=<gpio>,scl=<gpio>[,port=0|1][,speed=<speed>]
DAC와 동일한 GPIO나 포트를 사용할 수 없다는 점에 유의하세요.
esp32에는 4개의 SPI 하위 시스템이 있습니다. 그 중 하나는 액세스할 수 없으므로 번호는 0..2이고 SPI0은 Flash/PSRAM용으로 예약되어 있습니다. NVS 매개변수 "spi_config"는 일반적인 목적(예: 디스플레이)으로 사용되는 spi의 gpio를 설정합니다. SPI 사용을 비활성화하려면 비워 두십시오. 디스플레이에는 DC 매개변수가 필요합니다. 구문은
data|mosi=<gpio>,clk=<gpio>[,dc=<gpio>][,host=1|2][,miso=<gpio>]
기본적으로 "호스트"만 1입니다. 다른 호스트는 이미 플래시와 스피램에서 사용하고 있기 때문입니다. 선택적 "miso"(MasterInSlaveOut) 매개변수는 SPI 버스가 양방향이고 이더넷, gpio 확장기와 같은 다른 주변 장치와 공유되는 경우에만 사용됩니다. "데이터"는 "mosi"(MasterOutSlaveIn)로 명명될 수도 있습니다.
NVS 매개변수 "dac_config"는 DAC와의 i2s 통신에 사용되는 gpio를 설정합니다. 컴파일 타임에 기본값을 정의할 수 있지만 명명된 구성을 제외하면 nvs 매개변수가 우선 적용됩니다.
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>]]
"모델"이 설정되지 않았거나 인식되지 않으면 기본 "I2S"가 사용됩니다. "mck" 옵션은 마스터 클럭이 필요한 일부 코덱에 사용됩니다(그렇지는 않아도 됨). 기본적으로 GPIO0은 MCLK로 사용되며 최신 빌드(2023년 중반 이후)만 1 또는 2를 사용할 수 있습니다. 또한 이는 RMII 이더넷과 공존할 수 없다는 점에 유의하세요(아래 이더넷 섹션 참조). I2C 매개변수는 선택 사항이며 DAC에 I2C 제어가 필요한 경우에만 필요합니다(아래 'dac_controlset' 참조). "i2c" 매개변수는 10진수이므로 16진수 표기는 허용되지 않습니다.
지금까지 TAS57xx, TAS5713, AC101, WM8978 및 ES8388은 적절한 초기화 시퀀스/볼륨/전원 제어가 전송되는 모델로 인식됩니다. I2C 명령이 필요할 수 있는 다른 코덱의 경우 JSON 구문을 사용하여 초기화, 전원, 스피커 및 헤드셋 켜기 및 끄기를 위해 i2c를 통해 전송되는 간단한 명령 정의를 허용하는 "dac_controlset" 매개변수를 사용하십시오.
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
여기서 <command>
는 init, poweron, poweroff, 스피커온, 스피커오프, 헤드셋온, 헤드셋오프 중 하나입니다(단일 항목에 대해서도 배열이어야 합니다 ). 항목은 다음 요소 중 하나입니다.
{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}
{"gpio":<gpio>,"level":0|1}
{"delay":<ms>}
이는 표준 JSON 표기법이므로 익숙하지 않다면 Google이 가장 좋은 친구입니다. '...'는 원하는 만큼 많은 항목을 가질 수 있다는 의미이며 구문의 일부가 아니라는 점에 유의하세요. 모든 섹션은 선택 사항이지만 'dac_config' 매개변수에 i2c를 설정하고 여기서 아무것도 설정하지 않는 것은 의미가 없습니다.
reg
키를 사용하면 i2c 버스에 레지스터를 쓸 수 있습니다. 매개변수 mode
to 또는 값으로 등록하거나 to 및 it을 허용합니다. 단순히 글을 쓰고 싶다면 mode
설정하지 마세요. val
매개변수는 단일 i2c 버스트에서 일련의 바이트를 쓰기 위한 배열 [v1, v2,...]일 수 있습니다(이 경우 '모드'는 무시됩니다). 모든 값은 10진수여야 합니다 . 이와 같은 유효성 검사기를 사용하여 구문을 확인할 수 있습니다. gpio
키는 단순히 gpio를 DAC 작업의 일부로 설정하는 것이며 delay
요소 간 일시 중지를 허용합니다.
'power' 명령은 유휴 기간 후 DAC의 전원을 켜거나 끌 때 사용되며(squeelite의 -C 옵션 참조) 스피커와 헤드셋 간 전환 시 'speaker/headset' 명령이 전송됩니다(헤드셋 잭 감지 참조).
NB: 명명된 구성((SqueezeAMP, Muse ... I2S를 제외한 모두)의 경우 이 모든 것이 무시됩니다. 알려진 코덱의 경우 dac_controlset을 사용하여 내장 시퀀스를 덮어쓸 수 있습니다.
I2C와 동일한 GPIO나 포트를 사용할 수 없다는 점에 유의하세요.
NVS 매개변수 "spdif_config"는 SPDIF에 필요한 i2s의 gpio를 설정합니다.
SPDIF는 i2s 인터페이스를 비표준 방식으로 재사용하여 사용할 수 있게 되므로 핀(DO)이 1개만 필요하더라도 컨트롤러를 완전히 초기화해야 하므로 비트 클럭(bck)과 워드 클럭(ws)을 반드시 설정도 합니다. i2s와 SPDIF는 상호 배타적이므로 하드웨어에서 허용하는 경우 동일한 IO를 재사용할 수 있습니다.
컴파일 타임에 기본값을 정의할 수 있지만 명명된 구성(SqueezeAMP, Muse ...)을 제외하고 nvs 매개변수가 우선 적용됩니다.
SPDIF 사용을 비활성화하려면 공백으로 남겨두세요. "make menuconfig"를 사용하여 컴파일 타임에 정의할 수도 있습니다. 구문은
bck=<gpio>,ws=<gpio>,do=<gpio>
주의: 명명된 구성의 경우 이는 무시됩니다.
최대 비트 깊이는 32비트 모드에서도 24비트입니다(이것은 SPDIF 제한입니다. 20비트에서 24비트로 업데이트해 주신 @UrbanLienert에게 감사드립니다). 이제 DAC와 같은 I2S 인터페이스를 제공하지만 SPDIF(광 및 동축)를 생성하는 특수 칩을 사용하여 SPDIF를 얻을 수도 있습니다. 그런 다음 DAC 장을 참조하세요.
동축을 원할 경우 가난한 사람의 트릭을 사용하여 3.3V GPIO에서 신호를 생성할 수도 있습니다. 3.3V를 나누어 0.6V 피크-투-피크를 생성한 다음 DC를 제거하면 됩니다.
100nF
GPIO ----210ohm-----------||---- coax S/PDIF signal out
|
110ohm
|
Ground -------------------------- coax signal ground
NVS 매개변수 "display_config"는 선택적 디스플레이에 대한 매개변수를 설정합니다. I2C(공유 버스는 여기 참조) 또는 SPI(공유 버스는 여기 참조)일 수 있습니다. 구문은 다음과 같습니다.
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]]
플레이어 설정의 전용 메뉴를 통해 vu-미터 및 스펙트럼 분석기가 표시되는 방식과 아트워크의 크기를 조정할 수 있습니다(플러그인을 추가하는 것을 잊지 마세요).
NVS 매개변수 "metadata_config"는 AirPlay 및 Bluetooth에 대해 메타데이터가 표시되는 방식을 설정합니다. 구문은
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
, %album%
, %title%
3가지 키워드 중 하나가 포함될 수 있습니다. 해당 형식 문자열을 사용하여 키워드는 해당 값으로 대체되어 표시할 문자열을 구성합니다. 트랙 재생 중에 비어 있는 키워드 뒤에 나오는 일반 텍스트는 제거됩니다. 예를 들어, format= %artist% - %title%
설정하고 메타데이터에 아티스트가 없으면 <title>
만 표시되고 - <title>
표시되지 않습니다.NEC 프로토콜(38KHz) 또는 RC5와 호환되는 모든 IR 수신기를 사용할 수 있습니다. Vcc, GND 및 출력은 연결해야 하는 유일한 핀이며 풀업도 없고 필터링 커패시터도 없으며 직선 연결입니다.
IR 코드는 "있는 그대로" LMS로 전송되므로 Boom, Classic 또는 Touch의 Logitech SB 리모컨만 작동합니다. LMS의 "서버" 디렉토리에 있는 Slim_Devices_Remote.ir 파일을 수정하여 다른 코드에 적용할 수 있다고 생각하는데, 아직 시도해보지 않았습니다.
AirPlay 및 Bluetooth 모드에서는 이러한 기본 리모컨만 지원되며 나만의 매핑을 만드는 옵션은 추가하지 않았습니다.
적외선 수신기(옵션 "ir")에 연결된 GPIO를 설정하려면 아래의 "GPIO 설정"을 참조하세요.
"set_GPIO" 매개변수는 GPIO를 다양한 기능에 할당하는 데 사용됩니다.
부팅 시 GPIO를 GND 제공 또는 Vcc로 설정할 수 있습니다. 이는 측면 커넥터에서 40mA 미만의 전력을 소비하는 장치에 전원을 공급하는 데 편리합니다. 변경 중인 GPIO에 대해 충돌 검사가 수행되지 않으므로 주의하십시오. 따라서 보드가 손상되거나 여기에서 충돌이 발생할 수 있습니다.
<amp>
매개변수는 재생이 시작될 때 활성 레벨(기본값 1)로 설정될 GPIO를 할당하는 데 사용할 수 있습니다. squeezelite가 유휴 상태가 되면 재설정됩니다. 유휴 시간 초과는 squeezelite 명령줄에서 -C <timeout>
통해 설정됩니다.
<power>
매개변수는 플레이어 전원이 켜질 때 활성 레벨(기본값 1)로 설정되고 전원이 꺼지면 재설정되는 GPIO를 할당하는 데 사용할 수 있습니다(LMS에서는 AirPlay, Spotify 또는 BT에 적용되지 않음).
삽입을 지원하는 오디오 잭이 있는 경우(삽입 시 레벨을 설정하려면 :0 또는 :1 사용) 연결할 GPIO를 지정할 수 있습니다. jack_mutes_amp 매개변수를 사용하면 헤드셋(예:)이 삽입될 때 앰프를 음소거할 수 있습니다.
각각의 활성 상태(:0 또는 :1)를 사용하여 녹색 및 빨간색 상태 LED를 설정할 수 있으며, 주소 지정이 가능한 RGB LED를 사용하는 경우 칩셋을 구체적으로 설정할 수 있습니다.
<ir>
매개변수는 IR 수신기에 연결된 GPIO를 설정합니다. 풀업이나 커패시터를 추가할 필요가 없습니다.
구문은 다음과 같습니다
<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>]
컴파일 시간에 jack, spkfault LED에 대한 기본값을 정의할 수 있지만 nvs 매개변수는 런타임에 강제로 적용되는 명명된 구성((SqueezeAMP, Muse ...)을 제외하고 우선 적용됩니다. gpio 36 및 39는 입력 전용이므로 사용할 수 없습니다. 인터럽트. 잭 또는 스피커 결함으로 설정되면 100ms 폴링으로 해당 값을 확인하지만 비용이 많이 듭니다.
I2C 또는 SPI 버스를 사용하여 GPIO 확장기를 추가할 수 있습니다. 주로 버튼에 사용되어야 하지만 일반 용도의 출력도 지원할 수 있습니다. 이러한 추가 GPIO는 임의의 값부터 시작하여 번호를 매길 수 있습니다(esp32의 GPIO는 0..39이므로 40 이상). 그러면 100에서 115까지의 새로운 "가상" GPIO를 버튼 구성, set_GPIO 또는 기타 구성 설정에서 사용할 수 있습니다.
각 확장기는 최대 32개의 GPIO를 지원할 수 있습니다. 버튼 확장기를 사용하려면 인터럽트를 제공해야 하며 폴링 모드는 허용되지 않습니다. 중단 없이 확장기를 구성할 수 있지만 출력만 사용할 수 있습니다. 오픈 드레인이나 오픈 컬렉터(모두가 사용하는)를 사용하는 한 동일한 인터럽트를 확장자 간에 공유할 수 있습니다.
"gpio_exp_config" 매개변수는 각 확장기에 대해 다음 구문을 사용하는 세미콜론(;)으로 구분된 목록입니다.
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
확장된 GPIO에는 PWM(아래 "led_brightness")이 지원되지 않으며 CS, D/C, Reset 및 Ready와 같은 고속 또는 정밀 타이밍 신호에 사용할 수 없습니다. 버튼, 로터리 인코더, 앰프 제어 및 전원이 지원됩니다. 실제 칩셋에 따라 풀업 또는 풀다운이 지원될 수 있으므로 외부 저항을 추가해야 할 수도 있습니다(MCP23x17만 풀업을 수행함). pca8575는 훌륭한 칩이 아니며 GPIO 출력에 사용될 때 상당한 양의 의사 인터럽트를 생성합니다. SPI 확장기를 사용하는 경우 공유 SPI 버스를 사용하여 버스를 구성해야 합니다.
녹색 및 빨간색 LED(주소 지정이 가능한 RGB LED 포함)를 설정하는 방법은 set_GPIO를 참조하세요. 또한 "led_brigthness" 매개변수를 사용하여 밝기를 제어할 수 있습니다. 구문은 다음과 같습니다
[green=0..100][,red=0..100]
주의: 명명된 구성의 경우 녹색 및 빨간색 LED에 영향을 미치는 GPIO는 변경할 수 없지만 밝기 옵션이 적용됩니다.
최대 255개의 주소 지정 가능한 LED가 포함된 LED 스트립 1개를 구성하여 향상된 시각화를 제공할 수 있습니다. VU 미터 시각화 도우미에는 배터리 상태 표시기가 포함되어 있습니다(배터리 참조). 현재는 WS2812B LED만 지원됩니다. LED 스트립 하드웨어 구성을 설정하거나 NVS led_vu_config 구문은 다음과 같습니다.
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
여기서 <n>
은 스트립의 LED 수(1..255)입니다. 효과 반응을 향상시키기 위해 <scale>
게인 값(백분율)을 추가할 수 있습니다.
플레이어의 ESP32 설정 페이지 또는 제어 가능한 디스플레이에서 시각화 도우미 모드와 밝기를 설정하려면 최신 LMS 플러그인 업데이트가 필요합니다(Extra/SqueezeESP32 메뉴 참조). 플러그인은 추가 LMS CLI 명령을 추가합니다.
명령 | 메모 |
---|---|
<playerid> led_visual [<모드>] [<밝기>] | 시각화 도우미 "모드"를 전환하거나 선택합니다. 시각화 도우미 밝기(0..255)는 "밝기" 태그를 사용하여 제어할 수 있습니다. |
<playerid> dmx <R,G,B,R,G,B, ... R,G,B> [<오프셋>] | "오프셋" 위치에서 시작하여 LED 색상을 설정합니다. "R"(빨간색), "G"(녹색), "B"(파란색) 색상 순서로 구성됩니다. 여러 개의 LED를 설정하려면 구분된 문자열에 추가 RGB 값을 추가하세요. |
하나의 일반 로터리 엔코더가 지원되며 프레스를 통한 직교 이동이 가능합니다. 이러한 인코더에는 일반적으로 인코더용 핀 2개(A 및 B)와 접지로 설정해야 하는 공통 C 및 프레스용 옵션 SW 핀이 있습니다. A, B, SW를 풀업해야 하므로 ESP32에서 자동 풀업을 제공하지만 자체 저항을 추가할 수 있습니다. A와 B(~470nF)에 대한 약간의 필터링은 소프트웨어에서 수행되지 않는 디바운싱에 도움이 됩니다.
인코더는 일반적으로 왼쪽, 오른쪽 손잡이를 각각 누르고 LMS를 누르고 BT, AirPlay 및 Spotify에서 볼륨 낮추기/높이기/재생 토글을 위해 하드 코딩되어 있습니다. '볼륨' 옵션을 사용하면 항상 볼륨 낮추기/높이기/재생 전환이 하드 코딩됩니다(LMS에서도). 'longpress' 옵션을 사용하면 SW를 길게 눌렀을 때 대체 모드를 사용할 수 있습니다. 해당 모드에서 왼쪽은 이전, 오른쪽은 다음, 누르면 토글됩니다. SW를 길게 누를 때마다 모드가 전환됩니다(주 모드의 실제 동작은 '볼륨'에 따라 다름).
'knobonly' 옵션을 사용할 수도 있습니다('volume' 및 'longpress'에만 해당). 이 모드는 LMS UI 원칙으로 인해 약간 변형된 단일 손잡이 전체 탐색을 제공하려고 시도합니다. 왼쪽, 오른쪽 및 누르기는 LMS의 탐색 규칙을 따르며 특히 누르기는 음악 라이브러리에서 탐색할 때에도 항상 하위 하위 메뉴 항목으로 이동합니다. '재생', '뒤로' 또는 '일시 중지' 버튼이 없기 때문에 문제가 발생합니다. 해결 방법은 다음과 같습니다.
'knobonly'의 선택적 매개변수를 사용하여 더블클릭(또는 왼쪽-오른쪽) 속도를 설정할 수 있습니다. 이것은 완벽한 해결책은 아니며 다른 아이디어도 환영합니다. 두 번 클릭 속도를 길게 설정할수록 인터페이스의 반응이 느려집니다. 그 이유는 단일 클릭인지 더블 클릭인지 결정하기 전에 해당 지연을 기다려야 하기 때문입니다. 또한 메뉴 탐색 "머뭇거림"이 '일시 중지'로 쉽게 해석되도록 만들 수도 있습니다.
다음 구문과 함께 Rotary_config 매개변수를 사용하세요.
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]]|[[,volume][,longpress]]]]
HW 참고: 로터리에 사용되는 모든 gpio에는 내부 풀업이 있으므로 일반적으로 인코더에 Vcc를 제공할 필요가 없습니다. 그럼에도 불구하고 사용 중인 인코더 보드에 ESP32의 것보다 더 강한 자체 풀업이 있는 경우(이런 경우일 가능성이 높음) gpio 간에 혼선이 발생하므로 Vcc를 가져와야 합니다. 보드 회로도를 보면 이러한 보드 풀업이 다른 핀이 접지될 때 "승리" 풀다운을 생성한다는 것을 이해할 수 있습니다.
SW gpio는 선택 사항입니다. 원하는 경우 순수 버튼에 다시 영향을 미칠 수 있지만 볼륨, 길게 누르기 및 노브 전용 옵션은 누락된 스위치가 이러한 모드에서 중요한 역할을 하기 때문에 거의 의미가 없습니다. 여전히 "볼륨" 모드를 사용할 수 있지만 볼륨을 높이거나 낮추는 등의 용도 로는 사용할 수 없습니다. 따라서 위에서 구문 []을 사용하면 약간 오해의 소지가 있다는 점에 유의하세요.
"버튼" 섹션의 "중요 참고 사항"도 참조하고 'lms_ctrls_raw'(아래 참조)가 활성화되면 노브만, 볼륨, 길게 누르기 옵션 중 어느 것도 적용되지 않고 원시 버튼 코드(액션 아님)가 단순히 LMS로 전송된다는 점을 기억하세요.
esp32에서는 gpio 36, 39가 입력 전용이고 인터럽트를 사용할 수 없으므로 A 또는 B로 설정할 수 없습니다. SW용으로 사용할 경우 100ms 폴링을 사용하므로 비용이 많이 듭니다.
하나의 전용 볼륨 로터리 인코더가 지원되며 프레스를 통한 직교 이동이 가능합니다. 인코더는 LMS, BT, AirPlay 및 Spotify에 대한 볼륨 높이기, 낮추기 및 재생 토글로 하드 코딩되어 있습니다(esp32의 GPIO 36 및 39 필터링 및 HW 참고 사항은 위 참고 사항 참조).
다음 구문과 함께 매개변수 Volume_rotary를 사용합니다.
A=<gpio>,B=<gpio>[,SW=gpio>]
버튼은 다음 구문의 JSON 문자열을 사용하여 설명됩니다.
[
{ "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> },
},
{ ... },
{ ... },
]
여기서(gpio를 제외한 모든 매개변수는 선택사항임)
여기서 <action>
는로드 할 다른 구성 (REMAP)의 이름이거나 중 하나입니다.
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,
ACTRLS_SLEAP는 LMS로 전송할 수있는 실제 버튼이 아니지만 깊은 수면 모드를 활성화하는 후크입니다 (수면 참조).
그러한 문자열을 만든 것 중 하나는 16 (?) 문자 미만의 이름으로 새 NVS 매개 변수를 채우는 데 사용하십시오. 가능한 한 많은 구성을 가질 수 있습니다. 그런 다음 기본 구성의 이름으로 구성 매개 변수 "actrls_config"를 설정하십시오.
예를 들어 "버튼"이라는 구성.
[{ "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 " }}]
두 개의 버튼을 정의합니다
"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 " }}]
두 개의 버튼을 정의합니다
아래는 디코딩 즐거움을위한 어렵지만 기능적인 2 부 톤 인터페이스입니다.
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 " }}
]
중요 참고 : LMS는 또한 '원시'버튼 코드를 보낼 가능성을 지원합니다. 조금 복잡하므로 저와 함께하십시오. 버튼은 Squeezeesp32에 의해 처리 될 수 있고 Play (RAW) 코드로 LMS로 전송 될 수 있으며 Press/Release/Longpress의 전체 논리는 LMS에서 처리 할 수 있습니다. 그것에 대한 통제력이 있습니다.
"원시"모드의 이점은 가능한 한 붐에 가깝게 플레이어를 구축 할 수 있지만 재세포 함수를 사용하거나 Longpress 또는 Shift Logics를 사용하여 자신의 매핑을 수행 할 수 없다는 것입니다. 제한된 버튼 세트. 'RAW'모드에서는 GPIO와 버튼 사이의 매핑 만 있으면됩니다. LMS에 관한 한이 JSON 페이로드의 다른 옵션은 중요하지 않습니다. 이제 BT 또는 AirPlay를 사용하면 위에서 설명한 전체 JSON 구성이 완전히 적용되므로 교대, Longpress, 리핑 옵션은 여전히 작동합니다.
비 "원시"모드를 사용할 때 LMS의 CLI (명령 줄 인터페이스)를 사용하고 비밀번호없이 사용할 수 있어야합니다 .
좋은 선택 또는 나쁜 선택은 없습니다. 그것은 당신의 선택입니다. NVS 매개 변수 "LMS_CTRLS_RAW"를 사용하여 해당 옵션을 변경하십시오
GPIO 36 및 39는 입력 전용이며 인터럽트를 사용할 수 없습니다. 버튼에 사용하면 100ms 폴링이 시작되어 비쌉니다. Long Press도 잘 작동하지 않을 가능성이 높습니다.
유선 이더넷은 다양한 옵션으로 ESP32에서 지원하지만 SqueezeESP32는 이와 같은 Davicom DM9051과 같은이 스파이 에더넷 브리지와 같은 RMII 인터페이스가있는 마이크로 칩 LAN8720 만 지원합니다.
참고 : Lyrat v4.3과 같은 일부 보드에서 찾을 수있는 터치 버튼은 현재 지원되지 않습니다.
GPIO | RMII 신호 | 메모 |
---|---|---|
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 | 50MHz 시계 |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
LAN8720의 재설정 핀을 연결하는 것은 선택 사항이지만 GPIO0 (50MHz 입력 클록)을 피하기 위해 권장됩니다.
ESP32의 APLL은 오디오 코덱에 필요 하므로