胡華玉 李嘉明



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