越來越多的人似乎在沒有 LMS 伺服器的情況下使用它,僅用於 BT、AirPlay 或 Spotify。這很好,但請注意,squeezeliteESP32 主要是羅技媒體伺服器播放器,並且是圍繞該概念設計的。所有其他模式都是附加元件,因此其他模式也有其缺點。因此,請確保在打開問題之前閱讀此內容
Squeezelite-esp32 是一款音訊軟體套件,可在 espressif 的 esp32 和 esp32-s3 wifi (b/g/n) 和藍牙晶片組上運行。它提供以下功能
根據連接到 esp32 的硬件,您可以將音訊傳送到本機 DAC、SPDIF 或藍牙揚聲器。所需的最低硬體是具有 4MB 快閃記憶體和 4MB PSRAM 的 WROVER 模組 (https://www.espressif.com/en/products/modules/esp32)。獨立使用此模組後,只需接通電源,您就可以傳輸到藍牙揚聲器。您也可以僅使用電纜或光纖感測器將音訊傳送到大多數 I2S DAC 以及 SPDIF 接收器。
但是squeezelite-esp32是高度可擴展的,你可以添加
其他功能包括
要控制均衡器或使用 LMS 上的顯示,需要新的播放器模型,這是透過作為 LMS 第三方儲存庫一部分的插件提供的
(這裡提出的意見所以我=@philippe44) squeezelite-esp32的主要構建是一個16位內部核心,所有計算都以32位或浮點精度進行。這是我為了保持 CPU 效能(它已經大大擴展了 esp32 晶片組)並優化記憶體使用而做出的設計選擇,因為我們只有 4MB 的可用 RAM。有些人可能正確地評論說 WROVER 模組有 8MB RAM,但處理器只能尋址 4MB,其餘 4MB 必須由較小的區塊進行分頁,我對此沒有耐心。
現在,當我將squeezelite移植到esp32時,我還讓核心在編譯時相容16位元或32位元。到目前為止,它可以在 32 位元下運行,但進行的測試較少。您可以選擇以32位元模式編譯它。我對 16 位以上的樣本不是很感興趣,因為它沒有帶來任何東西(我有資訊理論的工程背景)。
能力 | 16位 | 32位 | 評論 |
---|---|---|---|
最大取樣率 | 192k | 96k | 192k 非常具有挑戰性,尤其是與顯示器結合使用時 |
最大位元深度 | 16 | 24 | 16 位元模式下 24 位元被截斷 |
斯普迪夫 | 16位 | 20位 | |
mp3、aac、opus、ogg/vorbis | 48k | 48k | |
阿拉克、弗拉克、奧格 | 96k | 96k | |
PCM、WAV、AIF | 192k | 96k | |
均衡器 | 是 | 氮 | 最大 48kHz(重採樣後)- 在 >48k 軌道上跳過等化 |
重採樣 | 是 | 氮 | |
交叉淡入淡出 | 10秒 | <5秒 | 取決於緩衝區大小和取樣率 |
esp32 必須以 240 MHz 運行,Quad-SPI I/O 為 80 MHz,時脈為 40 Mhz。儘管如此,它的運行量仍然很大,特別是知道它有串行閃存和 PSRAM,所以值得稱讚 Espressif 的晶片組優化。現在,要實現所有解碼、重採樣、均衡、增益、顯示、頻譜/視覺效果,需要在內部/外部 RAM 的使用、任務優先級和緩衝區處理之間實現非常(非常)微妙的平衡。它並不完美,您將系統推向極限越多,某些檔案無法播放的風險就越高(請參閱下文)。一般來說,顯示器始終具有最低優先級,您會注意到滾動和 VU/頻譜刷新率減慢。現在,甚至顯示線程也有一些關鍵部分並影響功能。例如,具有低 SPI 速度的 16 位元深度彩色顯示器可能會阻止 24/96 flac 工作,但仍可與 pcm 24/96 一起工作
在 16 位元模式下,雖然報告的最大速率為 192 kHz,但強烈建議將報告的取樣率限制為 96k (-Z 96000)。請注意,由於 TCP/IP 堆疊效能的原因,某些高速 24/96k 線上串流可能會出現卡頓。這通常是由於伺服器發送小資料包而 esp32 無法足夠快地接收編碼音頻,無論任務優先級設定如何(我已經嘗試稍微調整一下)。在這種情況下,最好的選擇是讓 LMS 代理流,因為它將提供更大的區塊和可以處理的「更平滑」的流。
另請注意,某些編解碼器比其他編解碼器消耗更多的 CPU,或沒有進行太多最佳化。我已盡力調整這些,但這種優化等級包括編寫一些令人痛苦的程序集。當文件使用 SBR 編碼時,AAC 是一種要求非常高的編解碼器。它允許重建頻譜的上部部分,從而提高取樣率,但編解碼器規格是可選的,您可以簡單地解碼較低頻段並接受較低的取樣率 - 請參閱下面的 AAC_DISABLE_SBR 選項。
重要提示:在 esp32(不是 esp32-s3)上,啟用「統計」時,將 Spotify 與 SPDIF 結合使用會產生斷斷續續的音訊。你必須禁用它們
任何具有至少 4MB 快閃記憶體和 4MB PSRAM 的基於 esp32 的硬體都能夠運行queuelite-esp32,並且有各種包含此類晶片的主機板。下面提到了一些,但任何一個都應該有效。您可以在這裡找到各種幫助和說明
為了清楚起見,WROOM 模組無法運作,因為它們不包含 PSRAM。有些設計可能會在外部添加它,但這(非常)不可能。
根據上面的描述,WROVER 模組足以運行 Squeezelite-esp32,但這需要一些修補才能將其擴展為具有模擬音訊或硬體按鈕(例如)
請注意,當傳送到藍牙揚聲器(來源)時,只能使用 44.1 kHz,因此您可以讓 LMS 進行重採樣,但必須確保它僅發送 44.1 kHz 曲目或啟用內部重採樣(使用 -R)選項。如果您連接 DAC,則取樣率的選擇將取決於其功能。請參閱下文以了解更多詳細資訊。
大多數 DAC 只需透過 I2S 連接即可開箱即用,但有些需要使用 I2C 發送特定命令。請參閱下面的 DAC 選項以了解如何傳送這些專用命令。內建對 TAS575x、TAS5780、TAS5713 和 AC101 DAC 的支援。
也支援像這樣的基於 esp32-s3 的模組,但需要 esp-idf 4.4。它尚未成為正式版本的一部分,但它可以編譯並運行。 s3沒有藍牙音訊。請注意,CPU 效能大大增強。
這是 Squeezelite-esp32 的主要硬體伴侶,是一起開發的。有關功能的詳細資訊可以在此處和此處找到。
如果要重建,請使用squeezelite-esp32-SqueezeAmp-sdkconfig.defaults
設定檔。
注意:您可以使用預先建置的二進位檔案 SqueezeAMP4MBFlash,它已正確設定所有硬體 I/O。您也可以使用通用二進位 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 可用作喚醒訊號(設定sleep_config
為wake=0:0
)。它是一個上拉電阻,因此在未接收任何資料時它會保持在 1,這意味著它不能與其他喚醒 IO 結合使用。有關多個輸入喚醒限制的更多詳細信息,請參閱睡眠。
這款便攜式電池供電揚聲器與squeezelite-esp32相容,每次更新都會提供專用版本。如果要重建,請使用squeezelite-esp32-Muse-sdkconfig.defaults
設定檔。
注意:您可以使用預先建置的二進位檔案 Muse4MBFlash,它已正確設定所有硬體 I/O。您也可以使用通用二進位 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-WROVER
VCC-3.3V
3.3V - 3.3V
接地 - 接地
FLT-接地
DMP-接地
SCL-接地
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 編輯器」。進入 NVS 編輯器標籤以變更 NFS 參數。在下面的語法描述中,<>表示一個值,而[]描述可選參數。
如上所述,今天提供了一些專用構建:SqueezeAMP 和 Muse,但如果您自己構建,您也可以為 T-WATCH2020 建立構建。預設版本是名為 I2S 的通用韌體,可以透過 NVS 進行配置,以產生與專用版本完全相同的結果。不同之處在於參數必須輸入並且可能會意外刪除。 GUI 也為載入「已知配置集」提供了很大的幫助。
根據設計選擇,不存在僅針對給定版本嵌入的程式碼,所有程式碼始終存在。其理念是盡可能減少特定於平台的程式碼,並且無論如何都禁止使用特定的#ifdef
。因此,如果您想添加自己的平台,請仔細查看mainKConfig.projbuild
看看如何使用下面的參數使您的裝置純粹是基於配置的解決方案。當確實沒有其他選擇時,請查看targets<target>
以添加您自己的程式碼。我不會接受那些可以盡可能避免創建此類專用程式碼的程式碼的 PR。 NVS「目標」將用於呼叫特定於目標的程式碼,但這又是純粹的執行時間,而不是編譯時。
NVS 參數「i2c_config」設定用於通用目的(例如顯示)的 i2c GPIO。將其留空以停用 I2C 使用。請注意,在 SqueezeAMP 上,連接埠必須為 1。語法是
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>]
預設且只有“host”為 1,因為其他值已被 flash 和 spiram 使用。可選的「miso」(MasterInSlaveOut)參數僅在 SPI 總線為雙向且與其他週邊裝置(如乙太網路、gpio 擴充器)共用時使用。請注意,「data」也可以命名為「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>]]
如果“model”未設定或無法識別,則使用預設的“I2S”。選項“mck”用於某些需要主時鐘的編解碼器(儘管它們不應該)。預設情況下,GPIO0 用作 MCLK,只有最近的版本(2023 年中後)可以使用 1 或 2。 I2C 參數是可選的,僅當您的 DAC 需要 I2C 控制時才需要(請參閱下面的「dac_controlset」)。請注意,「i2c」參數是十進位的,不允許使用十六進位表示法。
到目前為止,TAS57xx、TAS5713、AC101、WM8978 和 ES8388 都是公認的型號,其中發送了正確的初始化序列/音量/電源控制。對於可能需要 I2C 命令的其他編解碼器,請使用參數“dac_controlset”,該參數允許使用 JSON 語法透過 i2c 發送用於初始化、電源、揚聲器和耳機開啟和關閉的簡單命令的定義:
{ <command>: [ <item1>, <item2>, ... <item3> ],
<command>: [ <item1>, <item2>, ... <item3> ],
... }
其中<command>
是 init、poweron、poweroff、speakeron、speakeroff、headseton、headsetoff 之一(即使對於單一項目,它也必須是一個陣列)。 Item 是以下任一元素
{"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
參數可以是一個陣列 [v1, v2,...],用於在單一 i2c 突發中寫入一系列位元組(在這種情況下,「mode」將被忽略)。請注意,所有值都必須是十進制。您可以使用這樣的驗證器來驗證您的語法。 gpio
鍵只是將 gpio 設定為 DAC 操作的一部分,並且delay
允許元素之間暫停。
在空閒時間後開啟/關閉DAC 電源時會使用「power」指令(請參閱squeezelite 的-C 選項),而在揚聲器和耳機之間切換時會發送「speaker/headset」指令(請參閱耳機插孔偵測)。
注意:對於命名配置((SqueezeAMP、Muse ...除 I2S 之外的所有配置),所有這些都將被忽略。對於已知的編解碼器,可以使用 dac_controlset 覆蓋內建序列
請注意,您不能使用與 I2C 相同的 GPIO 或連接埠。
NVS 參數「spdif_config」設定 SPDIF 所需的 i2s GPIO。
SPDIF 是透過以非標準方式重複使用 i2s 介面來實現的,因此雖然只需要一個引腳(DO),但控制器必須完全初始化,因此位元時鐘(bck)和字時鐘(ws)必須設定為好。由於 i2s 和 SPDIF 是互斥的,因此如果您的硬體允許,您可以重複使用相同的 IO。
您可以在編譯時定義預設值,但 nvs 參數優先,命名配置除外(SqueezeAMP、Muse ...)
將其留空以停用 SPDIF 使用,您也可以使用「make menuconfig」在編譯時定義它們。語法是
bck=<gpio>,ws=<gpio>,do=<gpio>
注意:對於命名配置,這將被忽略
即使在 32 位元模式下,最大位元深度也是 24 位元(這是 SPDIF 限制 - 感謝 @UrbanLienert 從 20 位元更新到 24 位元)。現在,您還可以使用專門的晶片來獲得 SPDIF,該晶片提供像 DAC 一樣的 I2S 接口,但可以輸出 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]]
您可以透過播放器設定中的專用選單調整音量計和頻譜分析儀的顯示方式以及藝術品的大小(不要忘記添加插件)。
NVS 參數「metadata_config」設定如何為 AirPlay 和藍牙顯示元資料。語法是
[format=<display_content>][,speed=<speed>][,pause=<pause>][,artwork[:0|1]]
%artist%
、 %album%
、 %title%
3 個關鍵字中的任何一個。使用該格式字串,關鍵字將被其值替換以建立要顯示的字串。請注意,在播放曲目期間碰巧為空的關鍵字後面的純文字將被刪除。例如,如果您設定了 format= %artist% - %title%
且元資料中沒有藝術家,則僅顯示<title>
而不是- <title>
。您可以使用任何相容 NEC 協定 (38KHz) 或 RC5 的紅外線接收器。唯一需要連接的腳位是Vcc、GND和輸出,沒有上拉,沒有濾波電容,是直連。
IR 代碼「按原樣」發送到 LMS,因此只有來自 Boom、Classic 或 Touch 的 Logitech SB 遙控器才可以工作。我認為LMS“server”目錄中的檔案Slim_Devices_Remote.ir可以修改以適應其他程式碼,但我沒有嘗試過。
在 AirPlay 和藍牙模式下,僅支援這些本機遙控器,我沒有添加進行自己的映射的選項
請參閱下方的「設定 GPIO」來設定與紅外線接收器(選項「ir」)關聯的 GPIO。
參數“set_GPIO”用於將GPIO指派給各種功能。
GPIO 可在啟動時設定為 GND 或 Vcc。這對於從側面連接器消耗小於 40mA 電流的設備供電非常方便。請小心,因為不會對您要更改的 GPIO 進行衝突檢查,因此可能會損壞您的電路板或在此處產生衝突。
<amp>
參數可用於指派一個 GPIO,在播放開始時該 GPIO 將被設定為活動等級(預設為 1)。當squeezelite空閒時它將被重置。空閒超時在squeezelite命令列上透過-C <timeout>
設置
<power>
參數可用於分配一個 GPIO,當播放器開機時,該 GPIO 將被設定為活動等級(預設 1),並在關機時重設(在 LMS 中,不適用於 AirPlay、Spotify 或 BT)。
如果您有支援插入的音訊插孔(插入時使用 :0 或 :1 設定電平),您可以指定它連接到哪個 GPIO。使用參數 jack_mutes_amp 可以在插入耳機(例如)時使擴大機靜音。
您可以設定綠色和紅色狀態 LED 以及它們各自的活動狀態(:0 或 :1),或者如果您使用可尋址 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 可以從任意值開始編號(40 及以上,因為 esp32 具有 GPIO 0..39)。然後,這些新的「虛擬」GPIO(例如)100 到 115 可用於按鈕配置、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 匯流排來設定匯流排
請參閱 set_GPIO 以了解如何設定綠色和紅色 LED(包括可尋址 RGB LED)。此外,它們的亮度可以使用“led_brigthness”參數進行控制。語法是
[green=0..100][,red=0..100]
注意:對於命名配置,無法變更受綠色和紅色 LED 影響的 GPIO,但適用亮度選項
一條 LED 燈條可配置多達 255 個可尋址 LED,以提供增強的視覺化效果。 VU Meter 視覺化工具包含一個電池狀態指示器(請參閱電池)。目前僅支援 WS2812B LED。設定LED燈條硬體配置,或NVS led_vu_config語法為
type=[WS2812],length=<n>,gpio=<dataPin>[,scale=<gain>]
其中<n>
是燈帶中 LED 的數量 (1..255)。可以加入<scale>
增益值(百分比)來增強效果響應。
需要最新的 LMS 外掛程式更新才能在播放器或可控制顯示器的 ESP32 設定頁面中設定視覺化模式和亮度(請參閱 Extra/SqueezeESP32 選單)。該插件添加了額外的 LMS CLI 命令。
命令 | 筆記 |
---|---|
<playerid> led_visual [<模式>] [<亮度>] | 切換或選擇視覺化工具“模式”。 可視化器亮度(0..255)可以使用“亮度”標籤進行控制。 |
<玩家ID> dmx <R,G,B,R,G,B,... R,G,B> [<偏移>] | 設定從“offset”位置開始的 LED 顏色 具有“R”(紅色)、“G”(綠色)和“B”(藍色)顏色序列。 將額外的 RGB 值新增至分隔字串以設定多個 LED。 |
支援1個通用旋轉編碼器,帶壓力正交移位。此類編碼器通常有 2 個用於編碼器的引腳(A 和 B),公共 C 必須設定為接地,以及一個可選的用於壓機的 SW 引腳。 A、B 和 SW 必須上拉,因此 ESP32 提供自動上拉,但您可以添加自己的電阻。 A 和 B 上的一點濾波 (~470nF) 有助於去抖,這不是由軟體實現的。
編碼器通常被硬編碼為分別向左、向右旋鈕和按下 LMS,以及在 BT、AirPlay 和 Spotify 上調低/調高/播放音量。使用“音量”選項可以使其始終硬編碼為音量調低/調高/播放切換(即使在 LMS 中)。選項「長按」允許在長按 SW 時使用替代模式。在該模式下,左為上一個,右為下一個,按下即可切換。每次長按 SW 都會在模式之間交替(主模式的實際行為取決於「音量」)。
也可以使用“knobonly”選項(不包括“音量”和“長按”)。此模式嘗試提供單一旋鈕完整導航,但由於 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。
支援一個專用的音量旋轉編碼器,透過按下進行正交移位。編碼器被硬編碼為 LMS、BT、AirPlay 和 Spotify 的音量增大、減小和播放切換(有關過濾和硬體註釋以及 esp32 上的 GPIO 36 和 39,請參閱上面的註釋)
使用參數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>
是要載入的另一種配置的名稱(重新映射),或一種
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_sleep不是可以傳送到LMS的實際按鈕,而是啟動深度睡眠模式的鉤子(請參閱睡眠)。
您創建了這樣的字串,使用它填充新的NVS參數,其中任何名稱以下16(?)字元。您可以盡可能多地擁有這樣的配置。然後用預設配置的名稱設定配置參數“ 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還支援發送「原始」按鈕代碼的可能性。有點複雜,所以請忍受我。按鈕可以透過SqueeSeSp32處理,並對應到「函數」之類的播放/暫停,也可以將其作為純(RAW)程式碼和Press/Release/Release/Longpress的完整邏輯傳送到LMS,由LMS處理,您不喜歡t對此有任何控制權。
「原始」模式的好處是,您可以建立一個與動臂盡可能近的播放器(例如),但是當您擁有一個時,您不能使用重新映射函數,longpress或shift locics進行自己的映射有限的按鈕集。在“原始”模式下,您真正需要定義的只是GPIO和按鈕之間的映射。就LMS而言,這些JSON有效載荷中的任何其他選擇都無關緊要。現在,當您使用BT或AirPlay時,上述完整的JSON結構將完全適用,因此Shift,Longpress,重新映射選項仍然可行。
請注意,使用非“ RAW”模式時,請使用LMS的CLI(命令列介面),並且必須在沒有密碼的情況下可用
沒有好選擇,這是您的選擇。使用NVS參數“ LMS_CTRLS_RAW”來變更該選項
請注意,GPIO 36和39僅輸入,不能使用中斷。將它們用於按鈕時,啟動了100ms的輪詢,這很昂貴。長新聞可能不太好
ESP32的有線乙太網路都有各種選項的支持,但是SqueeSeSp32僅支援具有這樣的RMII介面的微晶片LAN8720,或像Tavicom DM9051這樣的RMII介面或Spi-Ethernet Bridges或這樣的W5500。
注意:目前不支援Lyrat v4.3(例如Lyrat v4.3),可以在某些板上找到觸控按鈕。
通用輸入輸出介面 | RMII訊號 | 筆記 |
---|---|---|
GPIO21 | TX_EN | emac_tx_en |
GPIO19 | TX0 | emac_txd0 |
GPIO22 | TX1 | emac_txd1 |
GPIO25 | 接收0 | emac_rxd0 |
GPIO26 | 接收1 | emac_rxd1 |
GPIO27 | CRS_DV | emac_rx_drv |
GPIO0 | 參考時鐘 | 50MHz時鐘 |
model=lan8720,mdc=<gpio>,mdio=<gpio>[,rst=<gpio>]
連接LAN8720的重置PIN是可選的,但建議避免GPIO0(50MHz輸入時脈)將ESP32鎖定在啟動時下載模式。
音訊編解碼器需要ESP32的APLL,因此我們需要一個提供一個LAN8720