設為主頁(yè)  加入收藏
 
·I2S數字功放IC/內置DSP音頻算法功放芯片  ·馬達驅動(dòng)IC  ·2.1聲道單芯片D類(lèi)功放IC  ·內置DC/DC升壓模塊的D類(lèi)功放IC  ·鋰電充電管理IC/快充IC  ·無(wú)線(xiàn)遙控方案  ·直流無(wú)刷電機驅動(dòng)芯片
當前位置:首頁(yè)->技術(shù)分享
MAX98357 I2S D類(lèi)單聲道放大器的使用教程
文章來(lái)源:39度創(chuàng )意研究所 更新時(shí)間:2020/7/3 10:17:00
在線(xiàn)咨詢(xún):
給我發(fā)消息
張代明 3003290139
給我發(fā)消息
小鄢 2850985542
給我發(fā)消息
李湘寧 2850985550
13713728695
 
概述

Adafruit MAX98357 I2S D類(lèi)單聲道放大器的使用教程

如果您的微控制器或微型計算機具有數字音頻功能,則此放大器適合您!它采用標準的I2S數字音頻輸入,不僅可以將其解碼為模擬,還可以將其直接放大為揚聲器。完美地添加緊湊的放大聲音,需要2個(gè)分支(I2S DAC + Amp),并將它們組合為一個(gè)。

I2S(不要與I2C混淆)電路板上使用的協(xié)議,用于傳遞音頻數據。許多高端芯片和處理器以數字I2S格式管理所有音頻。然后,使用三個(gè)或四個(gè)引腳輸入或輸出數據(數據輸入,數據輸出,位時(shí)鐘和左右通道選擇)。通常,對于音頻設備,有一個(gè)DAC芯片可將I2S引入并轉換為可驅動(dòng)耳機的模擬信號。

這款小型單聲道放大器功能強大,令人驚訝。為4歐姆阻抗揚聲器提供3.2瓦功率(5V電源@ 10%THD)。微型芯片內部是D類(lèi)控制器,能夠以2.7V-5.5VDC的電壓運行。由于該放大器是D類(lèi),因此效率極高-非常適合便攜式和電池供電項目。它具有過(guò)熱和過(guò)流保護功能,但我們幾乎無(wú)法判斷它發(fā)燙了。

音頻輸入為I2S標準,可以使用3.3V或5V邏輯數據。輸出是“橋接”的-這意味著(zhù)它們直接連接到輸出,沒(méi)有接地。輸出是〜300KHz方波PWM,然后由揚聲器線(xiàn)圈“平均”出-不會(huì )聽(tīng)到高頻。以上所有這些都意味著(zhù)您無(wú)法將輸出連接到另一個(gè)放大器,它應該直接驅動(dòng)揚聲器。

有一個(gè)增益引腳,可以操縱該引腳更改增益。默認情況下,該放大器將為您提供 9dB 的增益。通過(guò)連接上拉或下拉電阻器或直接布線(xiàn),可以將增益引腳設置為3dB,6dB,9dB,12dB或15dB。

ShutDown/Mode引腳可用于放置芯片處于關(guān)閉狀態(tài)或設置了哪個(gè)I2S音頻通道通過(guò)管道傳輸到揚聲器。默認情況下,放大器將(L + R)/2立體聲混音輸出為單聲道輸出。通過(guò)添加電阻器,您可以將其更改為左輸出或右輸出

與Raspberry Pi,Arduino Zero以及任何其他具有I2S音頻輸出的微控制器或微型計算機配合使用,效果很好

規格:

輸出功率:4Ω時(shí)為3.2W,10%THD,8Ω時(shí)為1.8W,10%THD,電源為5V

PSRR:在1KHz時(shí),典型值為77 dB(典型值)

I2S采樣率從8kHz到96kHz

不需要MCLK

Click + Pop減少

五種引腳可選增益:3dB,6dB,9dB,12dB,15dB

出色的雜音抑制功能

熱關(guān)斷保護

作為經(jīng)過(guò)組裝和測試接線(xiàn)板提供,帶有一小塊可選的插頭和3.5mm接線(xiàn)端子。如果需要的話(huà),需要一些焊接來(lái)連接插頭和接線(xiàn)盒。

插腳

MAX98357A是 I2S 放大器-不使用模擬輸入,僅支持數字音頻輸入!不要將I2S與I2C混淆,I2S是一種聲音協(xié)議,而I2C是用于少量數據。

揚聲器輸出

該放大器僅用于驅動(dòng)動(dòng)圈式揚聲器。揚聲器阻抗必須為4Ω或更大。輸出信號是330KHz PWM方波,其占空比與音頻信號成比例。揚聲器線(xiàn)圈的電感用作低通濾波器,以均衡高頻分量。請勿嘗試將其用作前置放大器。

每個(gè)通道的輸出均為“橋接”,沒(méi)有接地。這意味著(zhù)對于每個(gè)通道,+和-交替極性可創(chuàng )建具有兩倍可用功率的單通道放大器。

使用3.5mm螺釘接線(xiàn)端子連接揚聲器。

5V插入4Ω@ 10%THD-最大3W

5V插入4Ω@ 1%THD-最大2.5W

3.3Vinto4Ω@ 10%THD-最大1.3W

3.3Vinto4Ω@ 1%THD-1.0W最大

5V轉換為8Ω@ 10%THD-最大1.8W

5V轉換為8Ω@ 1%THD-1.4W最大

3.3Vinto8Ω@ 10%THD的最大-0.8W

3.3Vinto8Ω@ 1%THD-最大0.6W

電源引腳

這是放大器的功率和放大器的邏輯。您可以提供2.5V至5.5V的電壓。請注意,在5V電壓下,您最終可以在揚聲器中輸入高達2.8W的功率,因此請確保您的電源可以輕松處理高達650mA的電流,并且我們建議使用至少800mA的電源規格,以便為您提供一些“房間”

如果您有3.3V邏輯設備,仍然可以從5V為放大器供電,建議您獲得最大的輸出功率!

I2S引腳

三個(gè)引腳用于接收音頻數據。這些可以是3.3-5V邏輯

LRC (左/右時(shí)鐘)-這是告訴放大器何時(shí)數據用于左聲道以及何時(shí)用于左聲道的引腳。

BCLK (位時(shí)鐘)-這是告訴放大器何時(shí)讀取數據引腳上數據的引腳。

DIN (數據輸入)-這是輸入實(shí)際數據的引腳,左右數據都在該引腳上發(fā)送,LRC引腳指示何時(shí)發(fā)送左或右信號

請注意,此放大器不需要 MCLK 引腳,如果您具有MCLK輸出,則可以將其斷開(kāi)連接!

其他圖釘

其他設置由 GAIN 和 SD

增益

GAI N 是增益設置。您可以具有 3dB,6dB,9dB,12dB 或 15dB 的增益。

15dB 如果 GAIN 直接連接到 GAIN 和 GND

12dB 之間,則100K電阻 GND

9dB ,如果 GAIN 未連接任何東西(這是默認設置)

如果將 GAIN 直接連接到 Vin

3dB ,則 6dB 在 GAIN 和 Vin

之間,這樣,默認增益為9dB,但是您可以通過(guò)調整與 GAIN 引腳。請注意,您可能需要執行電源重置以調整增益。

SD/MODE

此引腳用于關(guān)機模式,但也用于設置輸出哪個(gè)通道。這有點(diǎn)令人困惑,但本質(zhì)上是:

如果 SD 直接接地(電壓低于0.16V),則放大器關(guān)閉 》

如果 SD 上的電壓在0.16V至0.77V之間,則輸出為(Left + Right)/2,即立體聲平均值。

如果 SD 上的電壓介于0.77V和1.4V之間,則輸出僅是右聲道

如果 SD 上的電壓更高大于1.4V,則輸出為左聲道。

這與 SD 上的內部 100K下拉電阻復合在一起,因此您需要在SD上使用上拉電阻來(lái)平衡100K內部下拉。

對于分線(xiàn)板,從 SD 到 Vin 有一個(gè)1Mohm電阻, ,以5V供電時(shí),將為您提供“立體聲平均”輸出。如果僅需要左聲道或右聲道,或者是使用非5V電源供電,則可能需要嘗試使用不同的電阻器在 SD

上獲得所需的電壓

程序集

《表class =“ build-table”》

準備標題欄:

如有必要,將條切成一定長(cháng)度。如果將其插入面包板,則焊接會(huì )更容易-長(cháng)按針腳

添加分線(xiàn)板:

將分線(xiàn)板放在插針上,以便短插針穿過(guò)分線(xiàn)墊

還有焊料!

請務(wù)必焊接所有引腳以確?煽康碾娊佑|。

(有關(guān)焊接的技巧,請務(wù)必查看我們的 優(yōu)良焊接指南 )。

您已完成!目視檢查焊點(diǎn),然后繼續進(jìn)行下一步

如果要使用接線(xiàn)端子來(lái)連接揚聲器,請放置3.5mm的接線(xiàn)端子,以使嘴巴指向。

兩個(gè)引腳上的焊料都帶有大量焊料!

Raspberry Pi接線(xiàn)

如果您有Raspberry Pi,并且希望獲得比耳機插孔所能提供的更高質(zhì)量的音頻,則I2S是一個(gè)不錯的選擇!您僅需使用3個(gè)引腳,并且由于它是純數字輸出,因此可以減少噪聲和干擾。當然,您需要確保您擁有一個(gè)不錯的5V強電源,因此請確保為您的電源要求增加500mA或更多!

此板還與沒(méi)有具有像Pi Zero這樣的音頻

該技術(shù)將適用于任何帶有2x20連接器的Raspberry Pi。帶有2x13連接器的較早的Pi 1很難像這樣拔出I2S引腳

連接:

Amp Vin 至Raspbery Pi 5V

放大器GND 至Raspbery Pi GND

放大器DIN 至Raspbery Pi #21

放大器BCLK 至Raspbery Pi #18

Amp LRCLK 到Raspbery Pi #19

Raspberry Pi設置

目前,Raspbery Pi linux內核不支持I2S界面中的單聲道音頻只能播放立體聲,因此任何單聲道音頻文件可能都需要轉換為立體聲!

2017-11-2 Raspbian PIXEL(“滿(mǎn)”)在音量控制方面有問(wèn)題。 I2S可以運行,但是沒(méi)有軟件卷設置,如果需要,請嘗試Raspbian Lite-我們會(huì )找出原因:)

快速安裝

幸運的是,它非常容易在Raspbian上安裝對I2S DAC的支持。

這些說(shuō)明完全來(lái)自Pimoroni那些可愛(ài)的人的PhatDAC說(shuō)明!

從具有Internet連接的Raspberry Pi運行以下內容:

curl -sS https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/i2samp.sh | bash

我們添加了一個(gè)額外的helper systemd腳本,該腳本將在不使用I2S外設時(shí)播放安靜的音頻。開(kāi)始播放或停止播放時(shí),這會(huì )消除彈出聲。它使用很少的CPU時(shí)間(在Pi Zero上為5%,在Pi 2或3上可忽略不計)。您無(wú)需在RetroPie上使用它,因為它永遠不會(huì )發(fā)布I2S設備,但對Raspbian來(lái)說(shuō)非常有用。

安裝后將需要重新啟動(dòng)。

必須重新啟動(dòng)才能啟用揚聲器硬件!

重新啟動(dòng)后,重新登錄并再次運行腳本。。.它將詢(xún)問(wèn)您是否您想測試揚聲器。說(shuō) y es,然后聽(tīng)音頻從揚聲器中發(fā)出。。.

如果聽(tīng)起來(lái)真的很失真,則可能是音量太高。但是,為了使音量控制出現在Raspbian桌面或Retropie中,您必須在進(jìn)行揚聲器測試后再次重啟,方法是 sudo reboot

您必須重新啟動(dòng)兩次*才能啟用alsamixer音量(確實(shí)如此。

重新啟動(dòng)后,嘗試運行 alsamixer ,然后使用箭頭鍵降低音量,50%是一個(gè)不錯的開(kāi)始。

如果您仍然遇到音頻問(wèn)題,請嘗試重新運行腳本,并說(shuō) N (禁用)/dev/zero playback service。

然后,您可以轉到下一頁(yè)以測試和優(yōu)化設置。如果腳本適合您,請在詳細的 安裝上跳過(guò)此頁(yè)面的其余部分!

詳細安裝

如果由于某種原因,您不能只運行腳本而又想去通過(guò)手動(dòng)安裝-這是所有步驟!

更新/etc/modprobe.d(如果存在)

登錄到Pi并進(jìn)入串行控制臺(通過(guò)控制臺電纜,電視控制臺,RXVT或您擁有的設備)

使用

sudo nano /etc/modprobe.d/raspi-blacklist.conf

編輯raspi黑名單

如果文件為空,則跳過(guò)此步驟

但是,如果看到以下幾行:

blacklist i2c-bcm2708

blacklist snd-soc-pcm512x

blacklist snd-soc-wm8804

通過(guò)在每行之前放置#來(lái)更新行

通過(guò)鍵入保存》 Control-X Y 《返回》

禁用耳機音頻(如果已設置)

使用

sudo nano /etc/modules

編輯raspi模塊列表(如果已設置)為空,只需跳過(guò)此步驟

但是,如果看到以下行:

snd_bcm2835

輸入#

并使用 Control-X Y

創(chuàng )建asound.conf文件

使用

sudo nano /etc/asound.conf

編輯raspi模塊列表》

此文件應該為空!

復制并粘貼以下內容xt到文件中

下載:文件

復制代碼

pcm.speakerbonnet {

type hw card 0

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

}

pcm.softvol {

type softvol

slave.pcm “dmixer”

control.name “PCM”

control.card 0

}

ctl.softvol {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “softvol”

} pcm.speakerbonnet {

type hw card 0

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

}

pcm.softvol {

type softvol

slave.pcm “dmixer”

control.name “PCM”

control.card 0

}

ctl.softvol {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “softvol”

}

照常保存文件

添加設備樹(shù)覆蓋

使用

sudo nano /boot/config.txt

編輯您的Pi配置文件,然后向下滾動(dòng)至底部。如果您看到一行顯示:dtparam=audio=on

通過(guò)在前面放置#禁用它。

然后添加:

dtoverlay=hifiberry-dac

dtoverlay=i2s-mmap

在下一行。保存文件。

使用 sudo reboot

重啟您的Pi Raspberry Pi測試

揚聲器測試!

好的,您可以使用任何喜歡的軟件播放音頻,但是如果您想測試揚聲器的輸出,可以使用以下一些快速命令來(lái)驗證放大器和揚聲器是否正常工作!

簡(jiǎn)單的白噪聲揚聲器測試

運行speaker-test -c2會(huì )在揚聲器之間產(chǎn)生左右交替的白噪聲。

如果您有單聲道輸出放大器,則I2S放大器會(huì )合并左右聲道,因此您會(huì )聽(tīng)到連續的白噪聲

簡(jiǎn)單的WAV揚聲器測試

一旦您有了一些東西出來(lái),嘗試使用揚聲器測試(對于WAV文件,而不是MP3)播放音頻文件

speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

聽(tīng)到來(lái)自左右交替揚聲器的音頻

簡(jiǎn)單的MP3揚聲器測試

如果要播放音樂(lè )流,可以嘗試

sudo apt-get install -y mpg123

mpg123 http://ice1.somafm.com/u80s-128-mp3

如果您想在命令中播放MP3,請查看本教程,其中涵蓋了如何進(jìn)行設置。

目前,Jessie Raspbery Pi內核不支持單聲道音頻在I2S界面之外,您只能播放立體聲,因此任何單聲道音頻文件都可能需要轉換為立體聲!

omxplayer似乎沒(méi)有將I2S接口用于音頻-僅是HDMI-因此您將無(wú)法使用它

音量調節

許多程序,例如PyGame和Sonic Pi在應用程序中具有音量控制。對于其他程序,您可以使用名為 alsamixer 的命令行工具來(lái)設置音量。只需輸入alsamixer,然后使用向上/向下箭頭設置音量。設置完后按Escape鍵

在Raspbian PIXEL中,您可以使用菜單項控件來(lái)設置音量。如果它有一個(gè)X,請嘗試重新啟動(dòng)Pi(安裝后必須重新啟動(dòng)兩次,以使PIXEL識別音量控制

Pi I2S調整

此頁(yè)面已棄用,我們的安裝程序已執行這些步驟為您服務(wù),但我們會(huì )將其保留在此處供存檔使用!

減少爆音

對于遵循我們原始安裝說(shuō)明并進(jìn)行簡(jiǎn)單alsa配置的用戶(hù),他們可能會(huì )發(fā)現播放新音頻時(shí)會(huì )彈出I2S音頻。

解決方法是使用軟件混頻器向I2S設備輸出固定的采樣率,以使位時(shí)鐘不變。我使用ALSA,因此我配置了 dmixer ,并且不再有任何彈出聲或點(diǎn)擊聲。請注意,默認情況下,RaspPi I2S驅動(dòng)程序不支持 dmixer ,您必須按照提供的這些說(shuō)明進(jìn)行添加。繼續逐步了解如何啟用它!

步驟1

首先通過(guò)修改/boot/config.txt 來(lái)添加dtoverlay=i2s-mmap

運行 sudo nano/boot/config.txt ,然后將文本添加到底部,如下所示:

保存并退出。

然后將/etc/asound.conf 更改為:

下載:文件

復制代碼

pcm.speakerbonnet {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “dmixer”

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

} pcm.speakerbonnet {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “dmixer”

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

}

通過(guò)運行sudo nano /etc/asound.conf

,這將創(chuàng )建一個(gè)稱(chēng)為Speakerbonnet的PCM設備,該設備已連接到硬件I2S設備。然后,我們制作一個(gè)名為type dmix的新“ dmix”設備(pcm.dmixer)。我們?yōu)樗峁┝宋ㄒ坏倪M(jìn)程間通信密鑰(ipc_key 1024)和可在世界范圍內讀取的(ipc_perm 0666權限)混合器將控制硬件pcm設備Speakerbonnet(pcm“ speakerbonnet”)并具有一個(gè)緩沖區設置好它的好又快。設置了通信緩沖區,因此沒(méi)有延遲(period_time 0,period_size 1024和buffer_size 8192正常工作)。默認的混合速率是44.1khz立體聲(rate 44100 channels 2)

最后,我們設置了一個(gè)控制接口,但最終效果最好是僅將硬件設備放在此處-ctl.dmixer { type hw card 0 }

保存并退出。然后重新啟動(dòng)Pi以啟用混音器。另外,雖然它會(huì )極大地減少彈出聲,但有時(shí)還是會(huì )偶爾碰到一次-特別是在第一次播放音頻時(shí)!

添加軟件音量控制

此處使用的基本I2S芯片組未內置軟件控制。因此我們必須“欺騙” Pi來(lái)創(chuàng )建軟件音量控件。幸運的是,一旦您知道如何做就不難了。

在〜/.asoundrc 中使用nano ~/.asoundrc創(chuàng )建一個(gè)新的音頻配置文件,并在其中放置以下文本:

下載:文件

復制代碼

pcm.speakerbonnet {

type hw card 0

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

}

pcm.softvol {

type softvol

slave.pcm “dmixer”

control.name “PCM”

control.card 0

}

ctl.softvol {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “softvol”

} pcm.speakerbonnet {

type hw card 0

}

pcm.dmixer {

type dmix

ipc_key 1024

ipc_perm 0666

slave {

pcm “speakerbonnet”

period_time 0

period_size 1024

buffer_size 8192

rate 44100

channels 2

}

}

ctl.dmixer {

type hw card 0

}

pcm.softvol {

type softvol

slave.pcm “dmixer”

control.name “PCM”

control.card 0

}

ctl.softvol {

type hw card 0

}

pcm.!default {

type plug

slave.pcm “softvol”

}

這假定您將調音臺設置為不彈出!

保存并退出

現在,這就是竅門(mén),您必須重新啟動(dòng),然后通過(guò)alsa播放一些音頻,然后重新啟動(dòng)以使alsamixer正確同步:

speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

然后然后您可以鍵入 alsamixer 以使用“經(jīng)典” alsa控制音量混合界面

只需按向上和向下箭頭設置音量,然后按ESC退出

使用PyGame播放音頻

您可以使用 mpg123 進(jìn)行基本測試,但要動(dòng)態(tài)更改音量或有一個(gè)互動(dòng)程序。為了獲得更強大的音頻播放,我們建議使用PyGame播放各種音頻格式(包括MP3。

安裝PyGame

首先安裝pygame支持,您需要在具有網(wǎng)絡(luò )訪(fǎng)問(wèn)權限的Pi上打開(kāi)控制臺并運行:

下載:文件

復制代碼

sudo apt-get install python-pygame sudo apt-get install python-pygame

下一步,將該pygame示例zip下載到您的Pi

點(diǎn)擊下載PyGame示例代碼和示例mp3

在命令行上運行

wget https://cdn-learn.adafruit.com/assets/assets/000/041/506/original/pygame_example.zip

unzip pygame_example.zip

運行演示

在zip內的示例是 pygam, eMP3.py

此示例將播放腳本文件夾中的所有MP3。為了演示您也可以在pygame中調整音量,第二個(gè)參數是要播放的音量。使用介于0.0和1.0之間的命令行參數指定要播放的音量

例如,以下是如何以75%的音量播放:

下載:文件

復制代碼

python pygameMP3.py 0.75 python pygameMP3.py 0.75

如果您有自己的mp3,請使用以下代碼!

下載:文件

復制代碼

‘’‘ pg_midi_sound101.py

play midi music files (also mp3 files) using pygame

tested with Python273/331 and pygame192 by vegaseat

’‘’

#code modified by James DeVito from here: https://www.daniweb.com/programming/software-development/code/454835/let-pygame-play-your-midi-or-mp3-files

#!/usr/bin/python

import sys

import pygame as pg

import os

import time

def play_music(music_file):

‘’‘

stream music with mixer.music module in blocking manner

this will stream the sound from disk while playing

’‘’

clock = pg.time.Clock()

try:

pg.mixer.music.load(music_file)

print(“Music file {} loaded!”.format(music_file))

except pygame.error:

print(“File {} not found! {}”.format(music_file, pg.get_error()))

return

pg.mixer.music.play()

# If you want to fade in the audio.。。

# for x in range(0,100):

# pg.mixer.music.set_volume(float(x)/100.0)

# time.sleep(.0075)

# # check if playback has finished

while pg.mixer.music.get_busy():

clock.tick(30)

freq = 44100 # audio CD quality

bitsize = -16 # unsigned 16 bit

channels = 2 # 1 is mono, 2 is stereo

buffer = 2048 # number of samples (experiment to get right sound)

pg.mixer.init(freq, bitsize, channels, buffer)

if len(sys.argv) 》 1:

try:

user_volume = float(sys.argv[1])

except ValueError:

print “Volume argument invalid. Please use a float (0.0 - 1.0)”

pg.mixer.music.fadeout(1000)

pg.mixer.music.stop()

raise SystemExit

print(“Playing at volume: ” + str(user_volume)+ “ ”)

pg.mixer.music.set_volume(user_volume)

mp3s = []

for file in os.listdir(“!保

if file.endswith(“.mp3”):

mp3s.append(file)

print mp3s

for x in mp3s:

try:

play_music(x)

time.sleep(.25)

except KeyboardInterrupt:

# if user hits Ctrl/C then exit

# (works only in console mode)

pg.mixer.music.fadeout(1000)

pg.mixer.music.stop()

raise SystemExit

else:

print(“Please specify volume as a float! (0.0 - 1.0)”) ‘’‘ pg_midi_sound101.py

play midi music files (also mp3 files) using pygame

tested with Python273/331 and pygame192 by vegaseat

’‘’

#code modified by James DeVito from here: https://www.daniweb.com/programming/software-development/code/454835/let-pygame-play-your-midi-or-mp3-files

#!/usr/bin/python

import sys

import pygame as pg

import os

import time

def play_music(music_file):

‘’‘

stream music with mixer.music module in blocking manner

this will stream the sound from disk while playing

’‘’

clock = pg.time.Clock()

try:

pg.mixer.music.load(music_file)

print(“Music file {} loaded!”.format(music_file))

except pygame.error:

print(“File {} not found! {}”.format(music_file, pg.get_error()))

return

pg.mixer.music.play()

# If you want to fade in the audio.。。

# for x in range(0,100):

# pg.mixer.music.set_volume(float(x)/100.0)

# time.sleep(.0075)

# # check if playback has finished

while pg.mixer.music.get_busy():

clock.tick(30)

freq = 44100 # audio CD quality

bitsize = -16 # unsigned 16 bit

channels = 2 # 1 is mono, 2 is stereo

buffer = 2048 # number of samples (experiment to get right sound)

pg.mixer.init(freq, bitsize, channels, buffer)

if len(sys.argv) 》 1:

try:

user_volume = float(sys.argv[1])

except ValueError:

print “Volume argument invalid. Please use a float (0.0 - 1.0)”

pg.mixer.music.fadeout(1000)

pg.mixer.music.stop()

raise SystemExit

print(“Playing at volume: ” + str(user_volume)+ “ ”)

pg.mixer.music.set_volume(user_volume)

mp3s = []

for file in os.listdir(“!保

if file.endswith(“.mp3”):

mp3s.append(file)

print mp3s

for x in mp3s:

try:

play_music(x)

time.sleep(.25)

except KeyboardInterrupt:

# if user hits Ctrl/C then exit

# (works only in console mode)

pg.mixer.music.fadeout(1000)

pg.mixer.music.stop()

raise SystemExit

else:

print(“Please specify volume as a float! (0.0 - 1.0)”)

Arduino接線(xiàn)和測試

基于A(yíng)Tmega328P的經(jīng)典Arduino(如UNO和Metro 328)沒(méi)有I2S接口,因此不能 》與他們一起使用此突破

但是基于零速,Metro M0和Feather M0的新型基于A(yíng)TSAMD21的板可以! (注意,Gemma M0和Trinket M0沒(méi)有可用的I2S引腳)。甚至新的基于A(yíng)TSAMD51的板卡(例如Metro M4和Feather M4)也可以。

要在M0或M4板上使用I2S,您需要安裝Adafruit Zero I2S庫?赏ㄟ^(guò)庫管理器使用。您可以搜索(見(jiàn)下文),然后單擊安裝按鈕。

接線(xiàn)

接線(xiàn)連接與CircuitPython所用的相同。因此,請轉到 CircuitPython接線(xiàn)和測試頁(yè)面,了解如何為您的特定電路板接線(xiàn)。

基本測試

要進(jìn)行測試,請嘗試運行下面的演示。它隨庫安裝一起提供,因此您可以通過(guò)以下方式找到它:

文件-》示例-》 Adafruit零I2S庫-》基本

請確保更改此行:

下載:文件

復制代碼

Adafruit_ZeroI2S i2s(0, 1, 9, 2); Adafruit_ZeroI2S i2s(0, 1, 9, 2);

,以匹配用于設置的引腳。如果已按照本指南中的說(shuō)明進(jìn)行接線(xiàn),則可以通過(guò)將默認線(xiàn)路更改為以下方式來(lái)嘗試使用默認引腳:

下載:文件

復制代碼

Adafruit_ZeroI2S i2s; Adafruit_ZeroI2S i2s;

下載:Project Zip 或 basic.ino | 查看Github

復制代碼

Temporarily unable to load content:

Temporarily unable to load content:

DMA測試

上面的基本測試是通過(guò)循環(huán)使用i2s.write()函數直接創(chuàng )建輸出的。另一種方法是使用DMA生成輸出。使用這種方法,您可以進(jìn)行一些初始設置來(lái)配置DMA引擎以進(jìn)行回放。然后,它可以在后臺生成輸出,從而允許您在代碼中執行其他操作。

要采用這種方法,您將需要安裝Zero DMA庫。您可以通過(guò)庫管理器來(lái)做到這一點(diǎn):

然后您可以使用在零I2S庫中找到的DMA示例:

文件-》示例-》 Adafruit零I2S庫-》 dma

下載:Project Zip 或 dma.ino | 在Github上查看

復制代碼

#include

#include

#include “utility/dma.h”

#include

/* max volume for 32 bit data */

#define VOLUME ( (1UL 《《 31) - 1)

/* create a buffer for both the left and right channel data */

#define BUFSIZE 256

int data[BUFSIZE];

Adafruit_ZeroDMA myDMA;

ZeroDMAstatus stat; // DMA status codes returned by some functions

Adafruit_ZeroI2S i2s;

void dma_callback(Adafruit_ZeroDMA *dma) {

/* we don‘t need to do anything here */

}

void setup()

{

Serial.begin(115200);

//while(!Serial); // Wait for Serial monitor before continuing

Serial.println(“I2S output via DMA”);

int *ptr = data;

/*the I2S module will be expecting data interleaved LRLR*/

for(int i=0; i /* create a sine wave on the left channel */

*ptr++ = sin( (2*PI / (BUFSIZE/2) ) * i) * VOLUME;

/* create a cosine wave on the right channel */

*ptr++ = cos( (2*PI / (BUFSIZE/2) ) * i) * VOLUME;

}

Serial.println(“Configuring DMA trigger”);

myDMA.setTrigger(I2S_DMAC_ID_TX_0);

myDMA.setAction(DMA_TRIGGER_ACTON_BEAT);

Serial.print(“Allocating DMA channel.。!保;

stat = myDMA.allocate();

myDMA.printStatus(stat);

Serial.println(“Setting up transfer”);

myDMA.addDescriptor(

data, // move data from here

#if defined(__SAMD51__)

(void *)(&I2S-》TXDATA.reg), // to here (M4)

#else

(void *)(&I2S-》DATA[0].reg), // to here (M0+)

#endif

BUFSIZE, // this many.。。

DMA_BEAT_SIZE_WORD, // bytes/hword/words

true, // increment source addr?

false);

myDMA.loop(true);

Serial.println(“Adding callback”);

myDMA.setCallback(dma_callback);

/* begin I2S on the default pins. 24 bit depth at

* 44100 samples per second

*/

i2s.begin(I2S_32_BIT, 44100);

i2s.enableTx();

stat = myDMA.startJob();

}

void loop()

{

Serial.println(“do other things here while your DMA runs in the background.”);

delay(2000);

}

#include

#include

#include “utility/dma.h”

#include

/* max volume for 32 bit data */

#define VOLUME ( (1UL 《《 31) - 1)

/* create a buffer for both the left and right channel data */

#define BUFSIZE 256

int data[BUFSIZE];

Adafruit_ZeroDMA myDMA;

ZeroDMAstatus stat; // DMA status codes returned by some functions

Adafruit_ZeroI2S i2s;

void dma_callback(Adafruit_ZeroDMA *dma) {

/* we don’t need to do anything here */

}

void setup()

{

Serial.begin(115200);

//while(!Serial); // Wait for Serial monitor before continuing

Serial.println(“I2S output via DMA”);

int *ptr = data;

/*the I2S module will be expecting data interleaved LRLR*/

for(int i=0; i /* create a sine wave on the left channel */

*ptr++ = sin( (2*PI / (BUFSIZE/2) ) * i) * VOLUME;

/* create a cosine wave on the right channel */

*ptr++ = cos( (2*PI / (BUFSIZE/2) ) * i) * VOLUME;

}

Serial.println(“Configuring DMA trigger”);

myDMA.setTrigger(I2S_DMAC_ID_TX_0);

myDMA.setAction(DMA_TRIGGER_ACTON_BEAT);

Serial.print(“Allocating DMA channel.。!保;

stat = myDMA.allocate();

myDMA.printStatus(stat);

Serial.println(“Setting up transfer”);

myDMA.addDescriptor(

data, // move data from here

#if defined(__SAMD51__)

(void *)(&I2S-》TXDATA.reg), // to here (M4)

#else

(void *)(&I2S-》DATA[0].reg), // to here (M0+)

#endif

BUFSIZE, // this many.。。

DMA_BEAT_SIZE_WORD, // bytes/hword/words

true, // increment source addr?

false);

myDMA.loop(true);

Serial.println(“Adding callback”);

myDMA.setCallback(dma_callback);

/* begin I2S on the default pins. 24 bit depth at

* 44100 samples per second

*/

i2s.begin(I2S_32_BIT, 44100);

i2s.enableTx();

stat = myDMA.startJob();

}

void loop()

{

Serial.println(“do other things here while your DMA runs in the background.”);

delay(2000);

}

CircuitPython接線(xiàn)和測試

CircuitPython 3.0及更高版本內置了I2S,這意味著(zhù)您可以在支持的M0和M4 Express CircuitPython板上輕松使用此突破口!支持的板是Feather M0 Express,Feather M4 Express,Metro M0 Express,Metro M4 Express和ItsyBitsy M0 Express。

請注意,飾品M0,Gemma M0和ItsyBitsy M4不支持I2S(最后一個(gè)不是錯字。

M0板具有多個(gè)可用的I2S引腳組合。我們將為每塊板演示單個(gè)引腳組合。

接線(xiàn)

以下接線(xiàn)圖顯示了如何將MAX98357分支連接到CircuitPython板上。您將使用電壓輸入,接地,位時(shí)鐘,左/右時(shí)鐘和數據引腳。

VIN 是 red 線(xiàn)。

GND 是黑色導線(xiàn)。

BCLK 是藍色導線(xiàn)。

LRC 是黃色導線(xiàn)。

DIN 是《綠色電線(xiàn)。

對于Feather M0 Express,ItyBitsy M0 Express和Metro M0 Express:

在突破口上連接 VIN 到板上的 3V/3.3 。

將 分支上的 GND連接到主板上的 G/GND。板。

在分支上連接 BCLK 連接到板上的 D1/TX 。

將分支中的 LRC 連接到板上的 D0/RX strong》。

將分組中的 DIN 連接到板上的 D9 。

對于Feather M4 Express:

將分支上的 VIN 連接到板上的 3V 。

連接 分支上的GND到板上的 Gind 。

將分支上的 BCLK連接到《。

將分組中的 LRC 連接到板上的 D10 。

將分組中的 DIN 連接到板上的 D11 。

對于Metro M4 Express:

在分支上連接 VIN 》連接到板上的 3.3 。

將分支中的 GND 連接到板上的 GND strong》。

在分支上將 BCLK 連接到板上的 D3 。

在分支上將 LRC連接連接到板上的 D9 。

將分支中的 DIN 連接到板上的 D8 。

代碼示例

我們有兩個(gè)CircuitPython代碼示例。前者在分組討論中通過(guò)揚聲器播放生成的音調。第二個(gè)播放波形文件。讓我們看一下!

音調生成

第一個(gè)示例生成一個(gè)正弦波的一個(gè)周期,然后循環(huán)生成一個(gè)音調。您可以通過(guò)更改關(guān)聯(lián)的變量來(lái)更改音量和音調的Hz。在循環(huán)內,我們播放音調一秒鐘,然后將其停一秒鐘。

下載:Project Zip 或 CircuitPython_I2S_Tone.py | 在Github上查看

復制代碼

import time

import array

import math

import audioio

import board

import audiobusio

sample_rate = 8000

tone_volume = .1 # Increase or decrease this to adjust the volume of the tone.

frequency = 440 # Set this to the Hz of the tone you want to generate.

length = sample_rate // frequency # One freqency period

sine_wave = array.array(“H”, [0] * length)

for i in range(length):

sine_wave[i] = int((math.sin(math.pi * 2 * frequency * i / sample_rate) *

tone_volume + 1) * (2 ** 15 - 1))

# For Feather M0 Express, ItsyBitsy M0 Express, Metro M0 Express

audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)

# For Feather M4 Express

# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)

# For Metro M4 Express

# audio = audiobusio.I2SOut(board.D3, board.D9, board.D8)

sine_wave_sample = audioio.RawSample(sine_wave, sample_rate=sample_rate)

while True:

audio.play(sine_wave_sample, loop=True)

time.sleep(1)

audio.stop()

time.sleep(1)

import time

import array

import math

import audioio

import board

import audiobusio

sample_rate = 8000

tone_volume = .1 # Increase or decrease this to adjust the volume of the tone.

frequency = 440 # Set this to the Hz of the tone you want to generate.

length = sample_rate // frequency # One freqency period

sine_wave = array.array(“H”, [0] * length)

for i in range(length):

sine_wave[i] = int((math.sin(math.pi * 2 * frequency * i / sample_rate) *

tone_volume + 1) * (2 ** 15 - 1))

# For Feather M0 Express, ItsyBitsy M0 Express, Metro M0 Express

audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)

# For Feather M4 Express

# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)

# For Metro M4 Express

# audio = audiobusio.I2SOut(board.D3, board.D9, board.D8)

sine_wave_sample = audioio.RawSample(sine_wave, sample_rate=sample_rate)

while True:

audio.play(sine_wave_sample, loop=True)

time.sleep(1)

audio.stop()

time.sleep(1)

對于羽毛M0 Express,ItsyBitsy M0 Express 和 Metro M0 Express ,

對于羽毛M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)。

對于 Metro M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D3, board.D3, board.D8)。

現在您將聽(tīng)到440Hz音調的一秒鐘和一秒鐘的聲音。沉默

您可以嘗試更改音調的Hz以產(chǎn)生不同的音調。嘗試更改time.sleep()中的秒數以產(chǎn)生更長(cháng)或更短的音調。

波形文件

第二個(gè)示例播放波形文件。我們以可讀格式打開(kāi)文件。然后在循環(huán)中,我們播放文件,并告訴代碼繼續播放文件,直到完成為止。您可以使用任何受支持的wave文件。我們已經(jīng)在代碼中包含了wave文件。

StreetChicken.wav

下載:Project Zip 或 CircuitPython_I2S_Wave.py | 在Github上查看

復制代碼

import audioio

import board

import audiobusio

wave_file = open(“StreetChicken.wav”, “rb”)

wave = audioio.WaveFile(wave_file)

# For Feather M0 Express, ItsyBitsy M0 Express, Metro M0 Express

audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)

# For Feather M4 Express

# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)

# For Metro M4 Express

# audio = audiobusio.I2SOut(board.D3, board.D9, board.D8)

while True:

audio.play(wave)

while audio.playing:

pass

import audioio

import board

import audiobusio

wave_file = open(“StreetChicken.wav”, “rb”)

wave = audioio.WaveFile(wave_file)

# For Feather M0 Express, ItsyBitsy M0 Express, Metro M0 Express

audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)

# For Feather M4 Express

# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)

# For Metro M4 Express

# audio = audiobusio.I2SOut(board.D3, board.D9, board.D8)

while True:

audio.play(wave)

while audio.playing:

pass

代碼中的對象設置與上面相同。

對于 Feather M0 Express,ItsyBitsy M0 Express 和 Metro M0 Express ,無(wú)需更改即可運行代碼。

對于 Feather M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)。

對于 Metro M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D3, board.D3, board.D8)

現在,您將聽(tīng)到wave文件播放并循環(huán)播放。

此示例可以做很多事情。嘗試播放其他波形文件,或者包括while audio.playing: pass而不是包含time.sleep(),以使其播放指定的秒數。查閱CircuitPython Essentials指南中的pause和resume功能的“音頻輸出”頁(yè)面。

我的I2S在哪里?

我們之前提到過(guò),支持的M0板具有多個(gè)I2S引腳組合供您使用。 M4板有一種選擇。無(wú)論哪種方式,如果您想知道可用的選項,請將以下代碼復制到 code.py ,連接到串行控制臺和檢查輸出。

這些是ItsyBitsy M0 Express的結果。

下載:Project Zip 或 I2S_Test_Script.py | 在Github上查看

復制代碼

import board

import audiobusio

from microcontroller import Pin

def is_hardware_i2s(bit_clock, word_select, data):

try:

p = audiobusio.I2SOut(bit_clock, word_select, data)

p.deinit()

return True

except ValueError:

return False

def get_unique_pins():

exclude = [‘NEOPIXEL’, ‘APA102_MOSI’, ‘APA102_SCK’]

pins = [pin for pin in [

getattr(board, p) for p in dir(board) if p not in exclude]

if isinstance(pin, Pin)]

unique = []

for p in pins:

if p not in unique:

unique.append(p)

return unique

for bit_clock_pin in get_unique_pins():

for word_select_pin in get_unique_pins():

for data_pin in get_unique_pins():

if bit_clock_pin is word_select_pin or bit_clock_pin is data_pin or word_select_pin\

is data_pin:

continue

else:

if is_hardware_i2s(bit_clock_pin, word_select_pin, data_pin):

print(“Bit clock pin:”, bit_clock_pin, “ Word select pin:”, word_select_pin,

“ Data pin:”, data_pin)

else:

pass

import board

import audiobusio

from microcontroller import Pin

def is_hardware_i2s(bit_clock, word_select, data):

try:

p = audiobusio.I2SOut(bit_clock, word_select, data)

p.deinit()

return True

except ValueError:

return False

def get_unique_pins():

exclude = [‘NEOPIXEL’, ‘APA102_MOSI’, ‘APA102_SCK’]

pins = [pin for pin in [

getattr(board, p) for p in dir(board) if p not in exclude]

if isinstance(pin, Pin)]

unique = []

for p in pins:

if p not in unique:

unique.append(p)

return unique

for bit_clock_pin in get_unique_pins():

for word_select_pin in get_unique_pins():

for data_pin in get_unique_pins():

if bit_clock_pin is word_select_pin or bit_clock_pin is data_pin or word_select_pin\

is data_pin:

continue

else:

if is_hardware_i2s(bit_clock_pin, word_select_pin, data_pin):

print(“Bit clock pin:”, bit_clock_pin, “ Word select pin:”, word_select_pin,

“ Data pin:”, data_pin)

else:

pass

I2S音頻常見(jiàn)問(wèn)題解答

嘿,在Raspbian Pixel桌面中,揚聲器圖標已X化!

播放一些音頻后,嘗試重新啟動(dòng)一次。另外,請確保您具有我們最新的alsa配置(請檢查Raspberry Pi安裝頁(yè)面上的詳細安裝頁(yè)面中的/etc/asound.conf!

。如果它仍然不起作用,您仍然可以更改音量,只需在終端命令提示符下使用 alsamixer 。

即使啟用了dmixer,當Pi首次啟動(dòng)或當它第一次開(kāi)始播放音頻時(shí)

是的,這是Raspbian Linux的已知東西是的Linux!我們沒(méi)有修復程序,如果可以讓您感覺(jué)更好,我的高檔Windows開(kāi)發(fā)計算機會(huì )對臺式機揚聲器執行相同的操作。

i2s設置腳本中的“/dev/zero play”選項(我們于2018年10月添加了該選項),但您仍然可能會(huì )得到一個(gè)初始彈出音

我的DAC上的音頻聽(tīng)起來(lái)真的很差/失真

請確保降低了音量。默認值為100%,太高了!使用 alsamixer 將音量降低到50%左右

可以與我最喜歡的軟件一起使用嗎?

它將與任何支持alsa音頻的一起使用。有成千上萬(wàn)個(gè)linux程序,所以我們不能保證它們都能正常工作,但這是我們確定能做到的!

PyGame -請參閱播放音頻的頁(yè)面以PyGame為例的代碼?梢栽趐ygame

mpg123 -命令行mp3音頻播放中控制音量。使用alsamixer控制音量

播放-用于在命令行上播放wav文件

Sonic Pi -已在像素桌面。使用Sonic Pi設置面板更改音量-似乎并不在乎您設置的全局音量!

Scratch 2 -已在Pixel桌面上進(jìn)行了測試。效果很好,但可能會(huì )有所延遲,并且在您第一次播放音頻時(shí)會(huì )發(fā)出爆裂的聲音。您可以使用alsamixer設置音量,也可以通過(guò)應用程序使用將音量設置為nn%塊

從頭開(kāi)始1 設置音量-無(wú)效,有些

RetroPie/Emulation Station 不能在Scratch 1上設置?-音頻在游戲中有效(我們測試了NES和MAME libretro),但在“主屏幕”中不起作用‘(選擇要玩的游戲界面)

下載

MAX98357數據表

帶有EagleCAD PCB文件的GitHub

Adafruit Fritzing庫中的Fritzing對象

示意圖

單擊以進(jìn)行簽名

制造打印

英寸尺寸

 
 
 
    您可能對以下產(chǎn)品感興趣  
產(chǎn)品型號 功能介紹 兼容型號 封裝形式 工作電壓 備注
HT566 2×20W (VDD=14.5V, RL=4Ω, THD+N=1%) QFN-28 4.5V-16V I2S數字輸入20W立體聲無(wú)電感閉環(huán)D類(lèi)音頻功放IC
 
 
    相關(guān)產(chǎn)品  
 
 
·藍牙音箱的音頻功放/升壓/充電管
·單節鋰電內置升壓音頻功放IC選型
·HT7179 12V升24V內置
·5V USB輸入、三節鋰電升壓型
·網(wǎng)絡(luò )主播聲卡專(zhuān)用耳機放大IC-H
 
M12269 河北發(fā)電機組 HT366 ACM8629 HT338 

業(yè)務(wù)洽談:手機:13713728695(微信同號)   QQ:3003207580  EMAIL:panbo@szczkjgs.com   聯(lián)系人:潘波

地址:深圳市寶安西鄉航城大道航城創(chuàng )新創(chuàng )業(yè)園A5棟307/309

版權所有:深圳市永阜康科技有限公司  備案號:粵ICP備17113496號

在线亚洲人成电影_中文有码国产精品欧美激情_免费大片一级a一级久久三_av天堂东京热无码专区