這是一款基于ESP32的對講機(jī)。它使用UDP廣播或ESP-NOW傳輸音頻。
硬件部件
Adafruit I2S 3W D類放大器突破-MAX98357A × 1個(gè)
I2S MEMS麥克風(fēng)突破無聊× 1個(gè)
通用4ohm或8ohm揚(yáng)聲器 × 1個(gè)
通用ESP32開發(fā)板× 1個(gè)
按鈕開關(guān)(可選)× 1個(gè)
描述
我們使用ESP32制作了一個(gè)Walkie-Talkie。音頻數(shù)據(jù)通過UDP廣播或ESP-NOW傳輸。因此,對講機(jī)甚至可以在沒有WiFi網(wǎng)絡(luò)的情況下工作!我以I2S麥克風(fēng)和I2S放大器為基礎(chǔ)-只需稍作改動(dòng),它就可以與模擬麥克風(fēng)和頭戴式耳機(jī)同樣工作。
細(xì)節(jié)
下方錄像帶,概述了該項(xiàng)目詳情。
您可以在以下位置訪問Fusion360項(xiàng)目:https ://a360.co/2PXgAUS-因此,如果需要,可以隨時(shí)打印自己的版本。
對于視頻中的麥克風(fēng),我使用的是我自己的ICS-43434麥克風(fēng)板,但它可以與INMP441麥克風(fēng)板同樣良好地工作。
這兩個(gè)都是直接與ESP32交互的I2S麥克風(fēng)。
I2S 3W放大器板來自Adafruit,并為揚(yáng)聲器供電。這也直接與ESP32交互。對于ESP32開發(fā)板,我使用的是TinyPICO,但是可以使用任何通用開發(fā)板,因?yàn)槲覀冊诖隧?xiàng)目中未使用任何特殊功能。
我使用的是定制PCB-(由PCBWay的優(yōu)秀人才制作),與往常一樣,他們做得很好,而且我對這些板的外觀感到非常滿意。我有很多音頻項(xiàng)目,能夠?qū)⑺袞|西連接在一起而不用擔(dān)心電線到處都是很好,這真是太好了。我所做的僅有的一點(diǎn)遺漏是不會(huì)斷開其余的GPIO引腳-因此,我認(rèn)為我將盡快開發(fā)該板的版本2。
這是指向EasyEDA上的原理圖和PCB 的鏈接,如果需要,可以直接從PCBWay訂購該板的鏈接。
話雖如此,您實(shí)際上不需要PCB,您可以輕松地將所有東西連接到面包板上,而這正是我制作原型時(shí)所做的。
原理圖非常簡單-麥克風(fēng)和揚(yáng)聲器都使用I2S板,這使它們與ESP32的接線非常簡單。
當(dāng)然,您可以修改代碼以將內(nèi)置ADC用于輸入,將內(nèi)置DAC用于輸出。如果要使用模擬麥克風(fēng)板和耳機(jī)插孔進(jìn)行輸出,則非常方便。
我在板上添加了一些額外的電路,以為麥克風(fēng)創(chuàng)建干凈的電源。如果您觀看了我以前的一些視頻,那么您會(huì)想起來,使用WiFi時(shí),我們在麥克風(fēng)上會(huì)聽到很多噪音。
為解決此噪聲問題,我們通過從電池直接饋電為麥克風(fēng)創(chuàng)建干凈的3.3v電源,我們使用LC濾波器對其進(jìn)行濾波,然后將其傳遞至低壓降穩(wěn)壓器。這為我們提供了一個(gè)非常好的,干凈的麥克風(fēng)電源,從而消除了很多噪音問題。
所有的代碼都在GitHub上-它應(yīng)該是不言自明的,但是我將在這里給出高層次的概述。
這個(gè)項(xiàng)目的主要挑戰(zhàn)是如何將音頻從一個(gè)對講機(jī)廣播到所有其他對講機(jī)。
我已經(jīng)以兩種不同的方式實(shí)現(xiàn)了這一點(diǎn)。您可以使用簡單的哈希定義輕松地在代碼之間切換。
第一種方法是使用UDP廣播。UDP廣播是一種非常簡單的機(jī)制。您將UDP數(shù)據(jù)包發(fā)送到一個(gè)特殊的IP地址,并且您的路由器將該數(shù)據(jù)包廣播到網(wǎng)絡(luò)上的所有其他設(shè)備。
我們可以安全地在UDP數(shù)據(jù)包中發(fā)送多達(dá)1436個(gè)字節(jié),因此,如果我們以16KHz采樣并使用大約90ms音頻數(shù)據(jù)的8位采樣。因此,我們需要每秒發(fā)送大約11個(gè)數(shù)據(jù)包。這完全在ESP32的功能范圍內(nèi)。
使用廣播UDP的最大優(yōu)點(diǎn)是,我們不需要了解對等方,我們只需廣播一條消息,任何正在監(jiān)聽它的人都會(huì)收到它。我們也不需要所有都連接到的集中式服務(wù)器。所有繁重的工作都由路由器完成。
但是,我們應(yīng)該意識到UDP的一些缺點(diǎn):
UDP數(shù)據(jù)包的傳遞僅是最大的努力-無法保證有人會(huì)收到您發(fā)送的數(shù)據(jù)包。
也無法保證數(shù)據(jù)包的順序-有人可能會(huì)完全隨機(jī)地接收您發(fā)送的數(shù)據(jù)包。
對于這個(gè)項(xiàng)目,我選擇忽略這兩個(gè)問題。對于廣播數(shù)據(jù)包,我們通常會(huì)停留在同一網(wǎng)絡(luò)中,因此我們可能不會(huì)丟失太多數(shù)據(jù)包,并且我們的數(shù)據(jù)包也可能會(huì)以正確的順序出現(xiàn)。如果他們不這樣做,那么我們只會(huì)在音頻上產(chǎn)生一點(diǎn)噪音和失真。
UDP廣播的另一個(gè)主要優(yōu)點(diǎn)是您可以在臺(tái)式計(jì)算機(jī)或電話上接收數(shù)據(jù)包-因此創(chuàng)建不基于ESP32的其他客戶端非常容易。
我實(shí)現(xiàn)傳輸?shù)牡诙N方法是使用ESP-NOW。ESP-NOW是Esppresif開發(fā)的協(xié)議,它使多個(gè)ESP設(shè)備無需WiFi即可相互通信。
這給我們提供了一個(gè)比UDP選項(xiàng)更大的優(yōu)勢,因?yàn)槲覀儾恍枰猈iFi網(wǎng)絡(luò)就可以使Walkie-Talkie正常工作。ESP-NOW的缺點(diǎn)是它具有250字節(jié)的小得多的數(shù)據(jù)包大小。這意味著我們需要每秒發(fā)送64次數(shù)據(jù)包。我們還具有與UDP相同的缺點(diǎn)-盡最大努力發(fā)送數(shù)據(jù)包,并且不能保證數(shù)據(jù)包將以什么順序到達(dá)。
但是,在我的測試中,它的表現(xiàn)還算不錯(cuò)。運(yùn)輸問題解決后,我們只需要掛接所有物品即可。我們有I2S輸入-它從麥克風(fēng)讀取樣本并將它們傳遞到我們的運(yùn)輸工具。一旦傳輸積累了足夠的數(shù)據(jù)以填充數(shù)據(jù)包,它將通過UDP或ESP-NOW發(fā)送數(shù)據(jù)。
另一方面,我們有相同的傳輸監(jiān)聽數(shù)據(jù)包。每次接收到數(shù)據(jù)包時(shí),它都會(huì)通過我們的I2S輸出將數(shù)據(jù)排隊(duì)等待播放。I2S輸出只是將采樣輸出到I2S放大器。
為了允許數(shù)據(jù)包花費(fèi)更長的時(shí)間到達(dá),我們在傳輸和I2S輸出之間有一個(gè)緩沖區(qū)。在開始播放樣本之前,我們花了少量時(shí)間-這給了我們一些空閑時(shí)間以允許數(shù)據(jù)包抖動(dòng)。確實(shí)要付出一些音頻延遲的代價(jià)-考慮到所有因素,音頻在制作后大約半秒鐘就會(huì)播放。
總而言之,盡管該項(xiàng)目可行。質(zhì)量并不令人驚奇,但是對于一個(gè)業(yè)余項(xiàng)目來說肯定足夠了。
與往常一樣,代碼全部在GitHub上。讓我知道您在評論中的想法。如果您有任何改進(jìn),請打開請求。
可以看一下的一些想法:
壓縮音頻以減少帶寬。
自動(dòng)增益控制
消除回聲
如上分享可能還有很多不完善,請隨時(shí)留言交流~
附:
源代碼:https://github.com/atomic14/esp32-walkie-talkie
原理圖:
責(zé)任編輯:pj
-
放大器
+關(guān)注
關(guān)注
143文章
13636瀏覽量
214258 -
麥克風(fēng)
+關(guān)注
關(guān)注
15文章
646瀏覽量
54959 -
對講機(jī)
+關(guān)注
關(guān)注
34文章
559瀏覽量
48728
發(fā)布評論請先 登錄
相關(guān)推薦
評論