胡華玉 李嘉明
關(guān)鍵詞:音樂播放;ESP32;無源蜂鳴器;OLED;云端下載
中圖分類號:TP37 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2023)21-0103-03
0 引言
音樂在人們的生活中扮演著重要的角色,聽音樂有助于提高創(chuàng)造力、舒緩壓力等,音樂播放器廣泛應(yīng)用于人們?nèi)粘5纳a(chǎn)生活中[1]。在音樂播放器的設(shè)計上,很多音樂芯片模塊價格比較昂貴,對于只需播放純音樂的應(yīng)用場合,可通過單片機(jī)搭配無源蜂鳴器實現(xiàn)播放音樂的功能,單片機(jī)引腳輸出PWM(PulseWidth Modulation) 波,用于控制蜂鳴器發(fā)聲[2]。PWM 又叫脈沖寬度調(diào)制,是通過對一系列脈沖的寬度進(jìn)行調(diào)制,等效出所需要的波形,對模擬信號電平進(jìn)行數(shù)字編碼。然而,基于單片機(jī)PWM模式的音樂播放系統(tǒng)[3-4]大多都沒有接入互聯(lián)網(wǎng),只能播放本地音樂,受制于單片機(jī)較小的存儲空間,可播放的音樂數(shù)量并不多,新音樂往往需要通過重新編程寫入的方式實現(xiàn),靈活性較差。
針對上述問題,結(jié)合嵌入式技術(shù)、信息通信技術(shù)、云計算技術(shù),設(shè)計一款基于ESP32的音樂播放系統(tǒng)。該系統(tǒng)通過更改ESP32芯片上的通用I/O引腳輸出的PWM信號頻率,驅(qū)動無源蜂鳴器發(fā)出不同音調(diào)的響聲。系統(tǒng)上電啟動時會嘗試連接代碼中所設(shè)置Wi-Fi 信號,若Wi-Fi 連接失敗,則只能播放本地音樂,若Wi-Fi連接成功,則可以通過相關(guān)按鍵的設(shè)置,下載存儲在云端的音樂樂譜,音樂的播放、暫停、上一首、下一首、單曲循環(huán)等常見功能同樣是通過相關(guān)按鍵的設(shè)置實現(xiàn)。此外,連接ESP32的OLED顯示屏?xí)崟r顯示當(dāng)前正在播放的歌曲名稱、Wi-Fi連接的狀態(tài),或是設(shè)置模式下的選項菜單。
1 基本工作原理
采用無源蜂鳴器播放的音樂是通過實時調(diào)節(jié)音調(diào)和節(jié)拍,使其發(fā)出特定的聲音,而音色是沒有區(qū)別的。音調(diào)反映的是聲音的高低程度,頻率越大音調(diào)越高,二者具體的對應(yīng)關(guān)系見表1[5]。節(jié)拍則表示的是一個音符唱的時間,即無源蜂鳴器發(fā)出對應(yīng)音調(diào)的持續(xù)時間,ESP32可通過Micropython固件庫中封裝的延遲函數(shù)來控制這種音調(diào)對應(yīng)的頻率維持多久,從而實現(xiàn)節(jié)拍的控制。在運行程序之前,需要將待播放的音樂轉(zhuǎn)換成數(shù)據(jù)類型為列表的數(shù)據(jù)存放到ESP32的軟件程序中,然后便可根據(jù)列表中給定的頻率值和播放時長,依次逐個播放音符。在運行程序的過程中,音樂暫停功能是通過ESP32 引腳停止輸出PWM 波實現(xiàn)的,此時會有相關(guān)的變量記錄目前播放到哪首歌曲的哪個音符,繼續(xù)播放音樂將會從剛剛暫停處,ESP32 重新輸出相應(yīng)的PWM波接著往下播放,播放上一首或下一首是通過改變列表中的索引實現(xiàn)不同音樂間的切換。
2 系統(tǒng)硬件設(shè)計
2.1 ESP32芯片
ESP32芯片是樂鑫信息科技(上海)股份有限公司推出的一款集成Wi-Fi功能的微控制器,擁有40nm 工藝、雙核32 位MCU、2.4GHz 雙模Wi-Fi 和藍(lán)牙芯片、主頻高達(dá)240 MHz,其引腳電路圖如圖1 所示。ESP32性能穩(wěn)定,工作溫度范圍達(dá)到-40℃ ~ +125℃,內(nèi)部集成了自校準(zhǔn)電路,能夠動態(tài)調(diào)整電壓,并且適應(yīng)外部條件的變化。本系統(tǒng)選用ESP32作為系統(tǒng)的主控芯片和通信芯片。ESP32芯片具有下列特點:
1) 兩個或一個可以單獨控制的 CPU 內(nèi)核,時鐘頻率可調(diào),范圍從 80 MHz 到 240 MHz。
2) +19.5 dBm 天線端輸出功率,確保良好的覆蓋范圍。
3) 傳統(tǒng)藍(lán)牙支持 L2CAP、SDP、GAP、SMP、AVDTP、AVCTP、A2DP (SNK) 和 AVRCP (CT) 協(xié)議。
4) 低功耗藍(lán)牙 (Bluetooth LE) 支持 L2CAP、GAP、GATT、SMP和 GATT 之上的 BluFi,SPP-like 協(xié)議等。
5) 睡眠電流小于 5 μA,適用于電池供電的可穿戴電子設(shè)備。
6) Wi-Fi協(xié)議:支持802.11 b/g/n等協(xié)議,速度高達(dá)150Mbps。
7) 豐富的外設(shè)接口:GPIO、ADC、 SPI、UART、I2S、I2C等。
2.2 OLED顯示屏
OLED(Organic Light-Emitting Diode) 有機(jī)發(fā)光二極管又稱為有機(jī)激光顯示,不同于LCD,OLED具有自發(fā)光的特性,所以不需要添加背光源,當(dāng)有電流通過時,屏幕上的有機(jī)材料便會發(fā)光,具有體積小、功耗低等優(yōu)勢。本系統(tǒng)選用的OLED顯示屏是僅支持I2C接口,供電電壓為直流3.3V,尺寸為0.96寸,分辨率為128×64,即水平方向上128個像素點,豎直方向上64 個像素點。OLED顯示屏的第1和第2引腳分別連接ESP32 開發(fā)板的3.3V 和GND,第3 和第4 個引腳與ESP32芯片的I2C接口連接,接收并顯示ESP32發(fā)送的信息,其電路原理圖如圖2所示。
2.3 按鍵模塊
按鍵模塊用于人機(jī)交互,用戶可通過按鍵實現(xiàn)音樂播放系統(tǒng)功能的設(shè)置,按鍵電路圖如圖3所示,觸電一端接地,另一端連接ESP32 的通用輸入輸出口。ESP32與按鍵相連的幾個I/O口都設(shè)置為輸入引腳,并開啟內(nèi)部的上拉電阻,當(dāng)按鍵未按下時,ESP32檢測到這幾個I/O口的電平為高電平,當(dāng)按鍵按下時,按鍵的兩個觸電導(dǎo)通,相應(yīng)的I/O口接地,檢測到的電平由高電平轉(zhuǎn)換成低電平,觸發(fā)特定的信號,執(zhí)行相對應(yīng)的程序。圖3中的按鍵S1較為特殊,所連接的不是通用I/O口,而是重啟引腳,當(dāng)S1按下時,整個系統(tǒng)將會軟重啟,重新運行程序。
2.4 蜂鳴器模塊
蜂鳴器分為源蜂鳴器和無源蜂鳴器。有源蜂鳴器自帶振蕩源,接通電壓時鳴響,振蕩頻率固定,通常作為報警器使用。無源蜂鳴器無內(nèi)部振蕩源,需要添加振蕩信號,頻率可以改變,因而可以發(fā)出不同音調(diào)的響聲。本系統(tǒng)采用無源蜂鳴器,電路原理圖如圖4 所示,ESP32輸出PWM波的引腳連接限流電阻R5后接入三極管Q1的基極,改變PWM的頻率,即能改變無源蜂鳴器發(fā)出的響聲。
3 系統(tǒng)軟件設(shè)計
3.1 OLED軟件設(shè)計
導(dǎo)入OLED顯示屏專用的模塊ssd1306.py,通過ssd1306.py中提供的庫函數(shù),可以方便地顯示數(shù)字、英文字符、點、直線、矩形等。如果需要顯示中文字符,則需要添加中文顯示的庫函數(shù),以及待顯示中文字符對應(yīng)的點陣數(shù)據(jù)。
首先,利用PCtoLCD2002字模提取軟件將OLED 顯示的圖形轉(zhuǎn)換為點陣數(shù)據(jù)。PCtoLCD2002的字符模式界面如圖5所示,將字寬和字高均設(shè)置為16,則每個中文字符占據(jù)的寬度為16像素,高度也為16像素。設(shè)置好分隔符、換行符、字體等信息之后,在圖5 的文本框中輸入需要轉(zhuǎn)換的文字,接著,點擊“生成字?!眻D標(biāo)按鈕,生成中文字體對應(yīng)的字節(jié)點陣數(shù)據(jù)。
添加的中文庫函數(shù)如圖6所示。該函數(shù)封裝在類里面,所以第一個參數(shù)為self,參數(shù)ch_str傳入待顯示的中文字符串,參數(shù)x_axis、y_axis分別是水平方向、豎直方向上的偏移,用于確定待顯示的字符在OLED屏上顯示的位置,參數(shù)fonts是數(shù)據(jù)類型是字典,包含待顯示中文字符的utf-8編碼與其字節(jié)點陣數(shù)據(jù)的對應(yīng)關(guān)系。
3.2 系統(tǒng)主程序設(shè)計
系統(tǒng)主程序的程序流程圖如圖7所示。系統(tǒng)上電運行后,ESP32導(dǎo)入相關(guān)的模塊并進(jìn)行初始化操作,隨后根據(jù)程序中預(yù)設(shè)的賬號和密碼連接Wi-Fi網(wǎng)絡(luò)。若Wi-Fi連接成功,則程序中點亮ESP32核心板上的LED指示燈,OLED屏顯示“Network OK”;若Wi-Fi連接失敗,則在10秒內(nèi)嘗試重新連接,時間的間隔通過Micropython集成的utime模塊中的time函數(shù)實現(xiàn),time 函數(shù)會返回一個秒級的計數(shù)值,即每經(jīng)過1秒,time() 函數(shù)返回的值增大1,剛開始連接Wi-Fi時調(diào)用time 函數(shù),得到計時的初始值,將其存放到自定義變量start_time中,在進(jìn)行重連的過程中,utime.time()減去start_time 的值即是連接Wi-Fi 經(jīng)過的時間,單位是秒,10秒后如果還是連接不成功,則OLED屏上顯示連接超時的提示信息“Network timeout”。無論Wi-Fi 是否連接成功,并開啟外部中斷,始終監(jiān)聽按鍵S2是否有被按下,若被按下,則轉(zhuǎn)去執(zhí)行對應(yīng)的回調(diào)函數(shù),回調(diào)函數(shù)執(zhí)行完后再返回主程序繼續(xù)運行。ESP32 會載入本地音樂的數(shù)據(jù),Micropython固件庫中的ma?chine模塊內(nèi)含有PWM模塊,使用PWM模塊創(chuàng)建pwm 對象,調(diào)用pwm 對象封裝好的freq 函數(shù)可調(diào)整輸出PWM的頻率值,對應(yīng)的持續(xù)時間采用time模塊的延時函數(shù)sleep()實現(xiàn),具體的頻率值和延時的時長從本地音樂數(shù)據(jù)中有序提取。當(dāng)音樂播放完結(jié)束之后,會更改一個全局變量的值,自動播放下一首,直至遍歷完所有的本地音樂數(shù)據(jù)。
3.3 外部中斷程序設(shè)計
從開啟外部中斷的那句代碼開始,程序運行過程中會響應(yīng)按鍵S2按下的信號,當(dāng)S2按下時,會自動調(diào)用設(shè)定的回調(diào)函數(shù)。進(jìn)入回調(diào)后,OLED屏清空之前顯示的內(nèi)容,顯示相關(guān)的功能菜單,如下一首、開始播放、暫停播放、云端下載等,通過按鍵S3可以在功能菜單上不同功能間進(jìn)行切換,按鍵S4按下則會去執(zhí)行對應(yīng)的功能,并退出設(shè)置模式,結(jié)束回調(diào)函數(shù)并回到主程序。云端下載的功能是在Wi-Fi連接成功,并且成功接入互聯(lián)網(wǎng)的前提下才能生效,使用云端下載時,ESP32使用urequests模塊的get方法獲取云服務(wù)中存放的音樂,得到返回結(jié)果后調(diào)用相關(guān)的數(shù)據(jù)類型轉(zhuǎn)換的函數(shù),從返回的json格式數(shù)據(jù)中提取出音樂的id、音樂播放的頻率值、音樂的名稱、音樂的中文字符對應(yīng)的點陣數(shù)據(jù)等,并將其替換本地音樂數(shù)據(jù)。
4 結(jié)束語
本文設(shè)計的基于ESP32的音樂播放系統(tǒng),通過輸出變化的PWM波,驅(qū)動無源蜂鳴器播放音樂,OLED 屏幕實時顯示播放的音樂名稱或者設(shè)置功能的菜單內(nèi)容,支持從云服務(wù)器上下載音樂,具有成本低、功耗低、靈活易用的特點。