概述
如果您的微控制器或微型計(jì)算機(jī)具有數(shù)字音頻功能,則此放大器適合您!它采用標(biāo)準(zhǔn)的I2S數(shù)字音頻輸入,不僅可以將其解碼為模擬,還可以將其直接放大為揚(yáng)聲器。完美地添加緊湊的放大聲音,需要2個(gè)分支(I2S DAC + Amp),并將它們組合為一個(gè)。
I2S(不要與I2C混淆)電路板上使用的協(xié)議,用于傳遞音頻數(shù)據(jù)。許多高端芯片和處理器以數(shù)字I2S格式管理所有音頻。然后,使用三個(gè)或四個(gè)引腳輸入或輸出數(shù)據(jù)(數(shù)據(jù)輸入,數(shù)據(jù)輸出,位時(shí)鐘和左右通道選擇)。通常,對(duì)于音頻設(shè)備,有一個(gè)DAC芯片可將I2S引入并轉(zhuǎn)換為可驅(qū)動(dòng)耳機(jī)的模擬信號(hào)。
這款小型單聲道放大器功能強(qiáng)大,令人驚訝。為4歐姆阻抗揚(yáng)聲器提供3.2瓦功率(5V電源@ 10%THD)。微型芯片內(nèi)部是D類控制器,能夠以2.7V-5.5VDC的電壓運(yùn)行。由于該放大器是D類,因此效率極高-非常適合便攜式和電池供電項(xiàng)目。它具有過熱和過流保護(hù)功能,但我們幾乎無法判斷它發(fā)燙了。
音頻輸入為I2S標(biāo)準(zhǔn),可以使用3.3V或5V邏輯數(shù)據(jù)。輸出是“橋接”的-這意味著它們直接連接到輸出,沒有接地。輸出是〜300KHz方波PWM,然后由揚(yáng)聲器線圈“平均”出-不會(huì)聽到高頻。以上所有這些都意味著您無法將輸出連接到另一個(gè)放大器,它應(yīng)該直接驅(qū)動(dòng)揚(yáng)聲器。
有一個(gè)增益引腳,可以操縱該引腳更改增益。默認(rèn)情況下,該放大器將為您提供 9dB 的增益。通過連接上拉或下拉電阻器或直接布線,可以將增益引腳設(shè)置為3dB,6dB,9dB,12dB或15dB。
ShutDown/Mode引腳可用于放置芯片處于關(guān)閉狀態(tài)或設(shè)置了哪個(gè)I2S音頻通道通過管道傳輸?shù)綋P(yáng)聲器。默認(rèn)情況下,放大器將(L + R)/2立體聲混音輸出為單聲道輸出。通過添加電阻器,您可以將其更改為左輸出或右輸出
與Raspberry Pi,Arduino Zero以及任何其他具有I2S音頻輸出的微控制器或微型計(jì)算機(jī)配合使用,效果很好
規(guī)格:
輸出功率: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)斷保護(hù)
作為經(jīng)過組裝和測(cè)試的接線板提供,帶有一小塊可選的插頭和3.5mm接線端子。如果需要的話,需要一些焊接來連接插頭和接線盒。
插腳
MAX98357A是 I2S 放大器-不使用模擬輸入,僅支持?jǐn)?shù)字音頻輸入!不要將I2S與I2C混淆,I2S是一種聲音協(xié)議,而I2C是用于少量數(shù)據(jù)。
揚(yáng)聲器輸出
該放大器僅用于驅(qū)動(dòng)動(dòng)圈式揚(yáng)聲器。揚(yáng)聲器阻抗必須為4Ω或更大。輸出信號(hào)是330KHz PWM方波,其占空比與音頻信號(hào)成比例。揚(yáng)聲器線圈的電感用作低通濾波器,以均衡高頻分量。請(qǐng)勿嘗試將其用作前置放大器。
每個(gè)通道的輸出均為“橋接”,沒有接地。這意味著對(duì)于每個(gè)通道,+和-交替極性可創(chuàng)建具有兩倍可用功率的單通道放大器。
使用3.5mm螺釘接線端子連接揚(yáng)聲器。
5V插入4Ω@ 10%THD-最大3W
5V插入4Ω@ 1%THD-最大2.5W
3.3Vinto4Ω@ 10%THD-最大1.3W
3.3Vinto4Ω@ 1%THD-1.0W最大
5V轉(zhuǎn)換為8Ω@ 10%THD-最大1.8W
5V轉(zhuǎn)換為8Ω@ 1%THD-1.4W最大
3.3Vinto8Ω@ 10%THD的最大-0.8W
3.3Vinto8Ω@ 1%THD-最大0.6W
電源引腳
這是放大器的功率和放大器的邏輯。您可以提供2.5V至5.5V的電壓。請(qǐng)注意,在5V電壓下,您最終可以在揚(yáng)聲器中輸入高達(dá)2.8W的功率,因此請(qǐng)確保您的電源可以輕松處理高達(dá)650mA的電流,并且我們建議使用至少800mA的電源規(guī)格,以便為您提供一些“房間”
如果您有3.3V邏輯設(shè)備,仍然可以從5V為放大器供電,建議您獲得最大的輸出功率!
I2S引腳
三個(gè)引腳用于接收音頻數(shù)據(jù)。這些可以是3.3-5V邏輯
LRC (左/右時(shí)鐘)-這是告訴放大器何時(shí)數(shù)據(jù)用于左聲道以及何時(shí)用于左聲道的引腳。
BCLK (位時(shí)鐘)-這是告訴放大器何時(shí)讀取數(shù)據(jù)引腳上數(shù)據(jù)的引腳。
DIN (數(shù)據(jù)輸入)-這是輸入實(shí)際數(shù)據(jù)的引腳,左右數(shù)據(jù)都在該引腳上發(fā)送,LRC引腳指示何時(shí)發(fā)送左或右信號(hào)
請(qǐng)注意,此放大器不需要 MCLK 引腳,如果您具有MCLK輸出,則可以將其斷開連接!
其他圖釘
其他設(shè)置由 GAIN 和 SD
增益
GAI N 是增益設(shè)置。您可以具有 3dB,6dB,9dB,12dB 或 15dB 的增益。
15dB 如果 GAIN 直接連接到 GAIN 和 GND
12dB 之間,則100K電阻 GND
9dB ,如果 GAIN 未連接任何東西(這是默認(rèn)設(shè)置)
如果將 GAIN 直接連接到 Vin
3dB ,則 6dB 在 GAIN 和 Vin
之間,這樣,默認(rèn)增益為9dB,但是您可以通過調(diào)整與 GAIN 引腳。請(qǐng)注意,您可能需要執(zhí)行電源重置以調(diào)整增益。
SD/MODE
此引腳用于關(guān)機(jī)模式,但也用于設(shè)置輸出哪個(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 上的內(nèi)部 100K下拉電阻復(fù)合在一起,因此您需要在SD上使用上拉電阻來平衡100K內(nèi)部下拉。
對(duì)于分線板,從 SD 到 Vin 有一個(gè)1Mohm電阻, ,以5V供電時(shí),將為您提供“立體聲平均”輸出。如果僅需要左聲道或右聲道,或者是使用非5V電源供電,則可能需要嘗試使用不同的電阻器在 SD
上獲得所需的電壓
程序集
《表class =“ build-table”》
準(zhǔn)備標(biāo)題欄:
如有必要,將條切成一定長度。如果將其插入面包板,則焊接會(huì)更容易-長按針腳
添加分線板:
將分線板放在插針上,以便短插針穿過分線墊
還有焊料!
請(qǐng)務(wù)必焊接所有引腳以確?煽康碾娊佑|。
(有關(guān)焊接的技巧,請(qǐng)務(wù)必查看我們的 優(yōu)良焊接指南 )。
您已完成!目視檢查焊點(diǎn),然后繼續(xù)進(jìn)行下一步
如果要使用接線端子來連接揚(yáng)聲器,請(qǐng)放置3.5mm的接線端子,以使嘴巴指向。
兩個(gè)引腳上的焊料都帶有大量焊料!
Raspberry Pi接線
如果您有Raspberry Pi,并且希望獲得比耳機(jī)插孔所能提供的更高質(zhì)量的音頻,則I2S是一個(gè)不錯(cuò)的選擇!您僅需使用3個(gè)引腳,并且由于它是純數(shù)字輸出,因此可以減少噪聲和干擾。當(dāng)然,您需要確保您擁有一個(gè)不錯(cuò)的5V強(qiáng)電源,因此請(qǐng)確保為您的電源要求增加500mA或更多!
此板還與沒有具有像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設(shè)置
目前,Raspbery Pi linux內(nèi)核不支持I2S界面中的單聲道音頻只能播放立體聲,因此任何單聲道音頻文件可能都需要轉(zhuǎn)換為立體聲!
2017-11-2 Raspbian PIXEL(“滿”)在音量控制方面有問題。 I2S可以運(yùn)行,但是沒有軟件卷設(shè)置,如果需要,請(qǐng)嘗試Raspbian Lite-我們會(huì)找出原因:)
快速安裝
幸運(yùn)的是,它非常容易在Raspbian上安裝對(duì)I2S DAC的支持。
這些說明完全來自Pimoroni那些可愛的人的PhatDAC說明!
從具有Internet連接的Raspberry Pi運(yùn)行以下內(nèi)容:
curl -sS https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/i2samp.sh | bash
我們添加了一個(gè)額外的helper systemd腳本,該腳本將在不使用I2S外設(shè)時(shí)播放安靜的音頻。開始播放或停止播放時(shí),這會(huì)消除彈出聲。它使用很少的CPU時(shí)間(在Pi Zero上為5%,在Pi 2或3上可忽略不計(jì))。您無需在RetroPie上使用它,因?yàn)樗肋h(yuǎn)不會(huì)發(fā)布I2S設(shè)備,但對(duì)Raspbian來說非常有用。
安裝后將需要重新啟動(dòng)。
必須重新啟動(dòng)才能啟用揚(yáng)聲器硬件!
重新啟動(dòng)后,重新登錄并再次運(yùn)行腳本。。.它將詢問您是否您想測(cè)試揚(yáng)聲器。說 y es,然后聽音頻從揚(yáng)聲器中發(fā)出。。.
如果聽起來真的很失真,則可能是音量太高。但是,為了使音量控制出現(xiàn)在Raspbian桌面或Retropie中,您必須在進(jìn)行揚(yáng)聲器測(cè)試后再次重啟,方法是 sudo reboot
您必須重新啟動(dòng)兩次*才能啟用alsamixer音量(確實(shí)如此!)
重新啟動(dòng)后,嘗試運(yùn)行 alsamixer ,然后使用箭頭鍵降低音量,50%是一個(gè)不錯(cuò)的開始。
如果您仍然遇到音頻問題,請(qǐng)嘗試重新運(yùn)行腳本,并說 N (禁用)/dev/zero playback service。
然后,您可以轉(zhuǎn)到下一頁以測(cè)試和優(yōu)化設(shè)置。如果腳本適合您,請(qǐng)?jiān)谠敿?xì)的 安裝上跳過此頁面的其余部分!
詳細(xì)安裝
如果由于某種原因,您不能只運(yùn)行腳本而又想去通過手動(dòng)安裝-這是所有步驟!
更新/etc/modprobe.d(如果存在)
登錄到Pi并進(jìn)入串行控制臺(tái)(通過控制臺(tái)電纜,電視控制臺(tái),RXVT或您擁有的設(shè)備)
使用
sudo nano /etc/modprobe.d/raspi-blacklist.conf
編輯raspi黑名單
如果文件為空,則跳過此步驟
但是,如果看到以下幾行:
blacklist i2c-bcm2708
blacklist snd-soc-pcm512x
blacklist snd-soc-wm8804
通過在每行之前放置#來更新行
通過鍵入保存》 Control-X Y 《返回》
禁用耳機(jī)音頻(如果已設(shè)置)
使用
sudo nano /etc/modules
編輯raspi模塊列表(如果已設(shè)置)為空,只需跳過此步驟
但是,如果看到以下行:
snd_bcm2835
輸入#
并使用 Control-X Y
創(chuàng)建asound.conf文件
使用
sudo nano /etc/asound.conf
編輯raspi模塊列表》
此文件應(yīng)該為空!
復(fù)制并粘貼以下內(nèi)容xt到文件中
下載:文件
復(fù)制代碼
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
通過在前面放置#禁用它。
然后添加:
dtoverlay=hifiberry-dac
dtoverlay=i2s-mmap
在下一行。保存文件。
使用 sudo reboot
重啟您的Pi Raspberry Pi測(cè)試
揚(yáng)聲器測(cè)試!
好的,您可以使用任何喜歡的軟件播放音頻,但是如果您想測(cè)試揚(yáng)聲器的輸出,可以使用以下一些快速命令來驗(yàn)證放大器和揚(yáng)聲器是否正常工作!
簡單的白噪聲揚(yáng)聲器測(cè)試
運(yùn)行speaker-test -c2會(huì)在揚(yáng)聲器之間產(chǎn)生左右交替的白噪聲。
如果您有單聲道輸出放大器,則I2S放大器會(huì)合并左右聲道,因此您會(huì)聽到連續(xù)的白噪聲
簡單的WAV揚(yáng)聲器測(cè)試
一旦您有了一些東西出來,嘗試使用揚(yáng)聲器測(cè)試(對(duì)于WAV文件,而不是MP3)播放音頻文件
speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav
聽到來自左右交替揚(yáng)聲器的音頻
簡單的MP3揚(yáng)聲器測(cè)試
如果要播放音樂流,可以嘗試
sudo apt-get install -y mpg123
mpg123 http://ice1.somafm.com/u80s-128-mp3
如果您想在命令中播放MP3,請(qǐng)查看本教程,其中涵蓋了如何進(jìn)行設(shè)置。
目前,Jessie Raspbery Pi內(nèi)核不支持單聲道音頻在I2S界面之外,您只能播放立體聲,因此任何單聲道音頻文件都可能需要轉(zhuǎn)換為立體聲!
omxplayer似乎沒有將I2S接口用于音頻-僅是HDMI-因此您將無法使用它
音量調(diào)節(jié)
許多程序,例如PyGame和Sonic Pi在應(yīng)用程序中具有音量控制。對(duì)于其他程序,您可以使用名為 alsamixer 的命令行工具來設(shè)置音量。只需輸入alsamixer,然后使用向上/向下箭頭設(shè)置音量。設(shè)置完后按Escape鍵
在Raspbian PIXEL中,您可以使用菜單項(xiàng)控件來設(shè)置音量。如果它有一個(gè)X,請(qǐng)嘗試重新啟動(dòng)Pi(安裝后必須重新啟動(dòng)兩次,以使PIXEL識(shí)別音量控制
Pi I2S調(diào)整
此頁面已棄用,我們的安裝程序已執(zhí)行這些步驟為您服務(wù),但我們會(huì)將其保留在此處供存檔使用!
減少爆音
對(duì)于遵循我們?cè)及惭b說明并進(jìn)行簡單alsa配置的用戶,他們可能會(huì)發(fā)現(xiàn)播放新音頻時(shí)會(huì)彈出I2S音頻。
解決方法是使用軟件混頻器向I2S設(shè)備輸出固定的采樣率,以使位時(shí)鐘不變。我使用ALSA,因此我配置了 dmixer ,并且不再有任何彈出聲或點(diǎn)擊聲。請(qǐng)注意,默認(rèn)情況下,RaspPi I2S驅(qū)動(dòng)程序不支持 dmixer ,您必須按照提供的這些說明進(jìn)行添加。繼續(xù)逐步了解如何啟用它!
步驟1
首先通過修改/boot/config.txt 來添加dtoverlay=i2s-mmap
運(yùn)行 sudo nano/boot/config.txt ,然后將文本添加到底部,如下所示:
保存并退出。
然后將/etc/asound.conf 更改為:
下載:文件
復(fù)制代碼
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
}
通過運(yùn)行sudo nano /etc/asound.conf
,這將創(chuàng)建一個(gè)稱為Speakerbonnet的PCM設(shè)備,該設(shè)備已連接到硬件I2S設(shè)備。然后,我們制作一個(gè)名為type dmix的新“ dmix”設(shè)備(pcm.dmixer)。我們?yōu)樗峁┝宋ㄒ坏倪M(jìn)程間通信密鑰(ipc_key 1024)和可在世界范圍內(nèi)讀取的(ipc_perm 0666權(quán)限)混合器將控制硬件pcm設(shè)備Speakerbonnet(pcm“ speakerbonnet”)并具有一個(gè)緩沖區(qū)設(shè)置好它的好又快。設(shè)置了通信緩沖區(qū),因此沒有延遲(period_time 0,period_size 1024和buffer_size 8192正常工作)。默認(rèn)的混合速率是44.1khz立體聲(rate 44100 channels 2)
最后,我們?cè)O(shè)置了一個(gè)控制接口,但最終效果最好是僅將硬件設(shè)備放在此處-ctl.dmixer { type hw card 0 }
保存并退出。然后重新啟動(dòng)Pi以啟用混音器。另外,雖然它會(huì)極大地減少彈出聲,但有時(shí)還是會(huì)偶爾碰到一次-特別是在第一次播放音頻時(shí)!
添加軟件音量控制
此處使用的基本I2S芯片組未內(nèi)置軟件控制。因此我們必須“欺騙” Pi來創(chuàng)建軟件音量控件。幸運(yùn)的是,一旦您知道如何做就不難了。
在〜/.asoundrc 中使用nano ~/.asoundrc創(chuàng)建一個(gè)新的音頻配置文件,并在其中放置以下文本:
下載:文件
復(fù)制代碼
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”
}
這假定您將調(diào)音臺(tái)設(shè)置為不彈出!
保存并退出
現(xiàn)在,這就是竅門,您必須重新啟動(dòng),然后通過alsa播放一些音頻,然后重新啟動(dòng)以使alsamixer正確同步:
speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav
然后然后您可以鍵入 alsamixer 以使用“經(jīng)典” alsa控制音量混合界面
只需按向上和向下箭頭設(shè)置音量,然后按ESC退出
使用PyGame播放音頻
您可以使用 mpg123 進(jìn)行基本測(cè)試,但要?jiǎng)討B(tài)更改音量或有一個(gè)互動(dòng)程序。為了獲得更強(qiáng)大的音頻播放,我們建議使用PyGame播放各種音頻格式(包括MP3。
安裝PyGame
首先安裝pygame支持,您需要在具有網(wǎng)絡(luò)訪問權(quán)限的Pi上打開控制臺(tái)并運(yùn)行:
下載:文件
復(fù)制代碼
sudo apt-get install python-pygame sudo apt-get install python-pygame
下一步,將該pygame示例zip下載到您的Pi
點(diǎn)擊下載PyGame示例代碼和示例mp3
在命令行上運(yùn)行
wget https://cdn-learn.adafruit.com/assets/assets/000/041/506/original/pygame_example.zip
unzip pygame_example.zip
運(yùn)行演示
在zip內(nèi)的示例是 pygam, eMP3.py
此示例將播放腳本文件夾中的所有MP3。為了演示您也可以在pygame中調(diào)整音量,第二個(gè)參數(shù)是要播放的音量。使用介于0.0和1.0之間的命令行參數(shù)指定要播放的音量
例如,以下是如何以75%的音量播放:
下載:文件
復(fù)制代碼
python pygameMP3.py 0.75 python pygameMP3.py 0.75
如果您有自己的mp3,請(qǐng)使用以下代碼!
下載:文件
復(fù)制代碼
‘’‘ 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接線和測(cè)試
基于ATmega328P的經(jīng)典Arduino(如UNO和Metro 328)沒有I2S接口,因此不能 》與他們一起使用此突破
但是基于零速,Metro M0和Feather M0的新型基于ATSAMD21的板可以! (注意,Gemma M0和Trinket M0沒有可用的I2S引腳)。甚至新的基于ATSAMD51的板卡(例如Metro M4和Feather M4)也可以。
要在M0或M4板上使用I2S,您需要安裝Adafruit Zero I2S庫?赏ㄟ^庫管理器使用。您可以搜索(見下文),然后單擊安裝按鈕。
接線
接線連接與CircuitPython所用的相同。因此,請(qǐng)轉(zhuǎn)到 CircuitPython接線和測(cè)試頁面,了解如何為您的特定電路板接線。
基本測(cè)試
要進(jìn)行測(cè)試,請(qǐng)嘗試運(yùn)行下面的演示。它隨庫安裝一起提供,因此您可以通過以下方式找到它:
文件-》示例-》 Adafruit零I2S庫-》基本
請(qǐng)確保更改此行:
下載:文件
復(fù)制代碼
Adafruit_ZeroI2S i2s(0, 1, 9, 2); Adafruit_ZeroI2S i2s(0, 1, 9, 2);
,以匹配用于設(shè)置的引腳。如果已按照本指南中的說明進(jìn)行接線,則可以通過將默認(rèn)線路更改為以下方式來嘗試使用默認(rèn)引腳:
下載:文件
復(fù)制代碼
Adafruit_ZeroI2S i2s; Adafruit_ZeroI2S i2s;
下載:Project Zip 或 basic.ino | 查看Github
復(fù)制代碼
Temporarily unable to load content:
Temporarily unable to load content:
DMA測(cè)試
上面的基本測(cè)試是通過循環(huán)使用i2s.write()函數(shù)直接創(chuàng)建輸出的。另一種方法是使用DMA生成輸出。使用這種方法,您可以進(jìn)行一些初始設(shè)置來配置DMA引擎以進(jìn)行回放。然后,它可以在后臺(tái)生成輸出,從而允許您在代碼中執(zhí)行其他操作。
要采用這種方法,您將需要安裝Zero DMA庫。您可以通過庫管理器來做到這一點(diǎn):
然后您可以使用在零I2S庫中找到的DMA示例:
文件-》示例-》 Adafruit零I2S庫-》 dma
下載:Project Zip 或 dma.ino | 在Github上查看
復(fù)制代碼
#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接線和測(cè)試
CircuitPython 3.0及更高版本內(nèi)置了I2S,這意味著您可以在支持的M0和M4 Express CircuitPython板上輕松使用此突破口!支持的板是Feather M0 Express,F(xiàn)eather M4 Express,Metro M0 Express,Metro M4 Express和ItsyBitsy M0 Express。
請(qǐng)注意,飾品M0,Gemma M0和ItsyBitsy M4不支持I2S(最后一個(gè)不是錯(cuò)字!)
M0板具有多個(gè)可用的I2S引腳組合。我們將為每塊板演示單個(gè)引腳組合。
接線
以下接線圖顯示了如何將MAX98357分支連接到CircuitPython板上。您將使用電壓輸入,接地,位時(shí)鐘,左/右時(shí)鐘和數(shù)據(jù)引腳。
VIN 是 red 線。
GND 是黑色導(dǎo)線。
BCLK 是藍(lán)色導(dǎo)線。
LRC 是黃色導(dǎo)線。
DIN 是《綠色電線。
對(duì)于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 。
對(duì)于Feather M4 Express:
將分支上的 VIN 連接到板上的 3V 。
連接 分支上的GND到板上的 Gind 。
將分支上的 BCLK連接到《。
將分組中的 LRC 連接到板上的 D10 。
將分組中的 DIN 連接到板上的 D11 。
對(duì)于Metro M4 Express:
在分支上連接 VIN 》連接到板上的 3.3 。
將分支中的 GND 連接到板上的 GND strong》。
在分支上將 BCLK 連接到板上的 D3 。
在分支上將 LRC連接連接到板上的 D9 。
將分支中的 DIN 連接到板上的 D8 。
代碼示例
我們有兩個(gè)CircuitPython代碼示例。前者在分組討論中通過揚(yáng)聲器播放生成的音調(diào)。第二個(gè)播放波形文件。讓我們看一下!
音調(diào)生成
第一個(gè)示例生成一個(gè)正弦波的一個(gè)周期,然后循環(huán)生成一個(gè)音調(diào)。您可以通過更改關(guān)聯(lián)的變量來更改音量和音調(diào)的Hz。在循環(huán)內(nèi),我們播放音調(diào)一秒鐘,然后將其停一秒鐘。
下載:Project Zip 或 CircuitPython_I2S_Tone.py | 在Github上查看
復(fù)制代碼
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)
對(duì)于羽毛M0 Express,ItsyBitsy M0 Express 和 Metro M0 Express ,
對(duì)于羽毛M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)。
對(duì)于 Metro M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D3, board.D3, board.D8)。
現(xiàn)在您將聽到440Hz音調(diào)的一秒鐘和一秒鐘的聲音。沉默
您可以嘗試更改音調(diào)的Hz以產(chǎn)生不同的音調(diào)。嘗試更改time.sleep()中的秒數(shù)以產(chǎn)生更長或更短的音調(diào)。
波形文件
第二個(gè)示例播放波形文件。我們以可讀格式打開文件。然后在循環(huán)中,我們播放文件,并告訴代碼繼續(xù)播放文件,直到完成為止。您可以使用任何受支持的wave文件。我們已經(jīng)在代碼中包含了wave文件。
StreetChicken.wav
下載:Project Zip 或 CircuitPython_I2S_Wave.py | 在Github上查看
復(fù)制代碼
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
代碼中的對(duì)象設(shè)置與上面相同。
對(duì)于 Feather M0 Express,ItsyBitsy M0 Express 和 Metro M0 Express ,無需更改即可運(yùn)行代碼。
對(duì)于 Feather M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D1, board.D10, board.D11)。
對(duì)于 Metro M4 Express ,注釋掉audio = audiobusio.I2SOut(board.D1, board.D0, board.D9)并取消注釋# audio = audiobusio.I2SOut(board.D3, board.D3, board.D8)
現(xiàn)在,您將聽到wave文件播放并循環(huán)播放。
此示例可以做很多事情。嘗試播放其他波形文件,或者包括while audio.playing: pass而不是包含time.sleep(),以使其播放指定的秒數(shù)。查閱CircuitPython Essentials指南中的pause和resume功能的“音頻輸出”頁面。
我的I2S在哪里?
我們之前提到過,支持的M0板具有多個(gè)I2S引腳組合供您使用。 M4板有一種選擇。無論哪種方式,如果您想知道可用的選項(xiàng),請(qǐng)將以下代碼復(fù)制到 code.py ,連接到串行控制臺(tái)和檢查輸出。
這些是ItsyBitsy M0 Express的結(jié)果。
下載:Project Zip 或 I2S_Test_Script.py | 在Github上查看
復(fù)制代碼
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音頻常見問題解答
嘿,在Raspbian Pixel桌面中,揚(yáng)聲器圖標(biāo)已X化!
播放一些音頻后,嘗試重新啟動(dòng)一次。另外,請(qǐng)確保您具有我們最新的alsa配置(請(qǐng)檢查Raspberry Pi安裝頁面上的詳細(xì)安裝頁面中的/etc/asound.conf!
。如果它仍然不起作用,您仍然可以更改音量,只需在終端命令提示符下使用 alsamixer 。
即使啟用了dmixer,當(dāng)Pi首次啟動(dòng)或當(dāng)它第一次開始播放音頻時(shí)
是的,這是Raspbian Linux的已知東西是的Linux!我們沒有修復(fù)程序,如果可以讓您感覺更好,我的高檔Windows開發(fā)計(jì)算機(jī)會(huì)對(duì)臺(tái)式機(jī)揚(yáng)聲器執(zhí)行相同的操作。
i2s設(shè)置腳本中的“/dev/zero play”選項(xiàng)(我們于2018年10月添加了該選項(xiàng)),但您仍然可能會(huì)得到一個(gè)初始彈出音
我的DAC上的音頻聽起來真的很差/失真
請(qǐng)確保降低了音量。默認(rèn)值為100%,太高了!使用 alsamixer 將音量降低到50%左右
可以與我最喜歡的軟件一起使用嗎?
它將與任何支持alsa音頻的一起使用。有成千上萬個(gè)linux程序,所以我們不能保證它們都能正常工作,但這是我們確定能做到的!
PyGame -請(qǐng)參閱播放音頻的頁面以PyGame為例的代碼?梢栽趐ygame
mpg123 -命令行mp3音頻播放中控制音量。使用alsamixer控制音量
播放-用于在命令行上播放wav文件
Sonic Pi -已在像素桌面。使用Sonic Pi設(shè)置面板更改音量-似乎并不在乎您設(shè)置的全局音量!
Scratch 2 -已在Pixel桌面上進(jìn)行了測(cè)試。效果很好,但可能會(huì)有所延遲,并且在您第一次播放音頻時(shí)會(huì)發(fā)出爆裂的聲音。您可以使用alsamixer設(shè)置音量,也可以通過應(yīng)用程序使用將音量設(shè)置為nn%塊
從頭開始1 設(shè)置音量-無效,有些
RetroPie/Emulation Station 不能在Scratch 1上設(shè)置?-音頻在游戲中有效(我們測(cè)試了NES和MAME libretro),但在“主屏幕”中不起作用‘(選擇要玩的游戲界面)
下載
MAX98357數(shù)據(jù)表
帶有EagleCAD PCB文件的GitHub
Adafruit Fritzing庫中的Fritzing對(duì)象
示意圖
單擊以進(jìn)行簽名
制造打印
英寸尺寸
|