前言
本片我們使用PWM輸出不同頻率占空比的信號來驅(qū)動喇叭,實現(xiàn)MIDI音樂播放器的Demo。
PWM驅(qū)動喇叭原理
PWM驅(qū)動喇叭有兩種方法
一種是PWM-ADC方法,即控制PWM占空比實現(xiàn)不同電壓等級的輸出,來模擬DAC的輸出;
一種是控制PWM頻率,直接播放數(shù)字MIDI音樂即不同頻率代表不同的音調(diào)。
我們這里采用第二種方式來實現(xiàn)音樂播放。
以國際標準音A-la-440HZ為準:
do的頻率為261.6HZ,
re的頻率為293.6HZ,
mi的頻率為329.6HZ,
fa的頻率為349.2HZ,
sol的頻率為392HZ,
la的頻率為440HZ,
si的頻率為493.8HZ。
我們升一個八度則
Do頻率為261.6x2=523.2Hz,其他的類推。
控制PWM頻率就可以輸出上述音調(diào),控制PWM占空比則可對應(yīng)聲音的大小,播放時間長度則可對應(yīng)音節(jié)時長。
以兩只老虎為例
播放音樂需要三個參數(shù)
頻率:beepfrep對應(yīng)音調(diào)
聲音大小: beepduty 占空比
播放時間: beeptime 對應(yīng)節(jié)拍
簡譜中可以看到
2/4拍子 4分音符一拍 每小節(jié)2拍
一分鐘76拍。
于是可以定義音調(diào)和上述參數(shù)如下
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍數(shù)76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節(jié)2拍
NOTE_4 = (60/METERS) #先定一拍對應(yīng)的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個下劃線
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
代碼
完整代碼如下
import time
from machine import Pin, PWM
pwm = PWM(Pin(21))
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍數(shù)76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節(jié)2拍
NOTE_4 = (60/METERS) #先定一拍對應(yīng)的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個下劃線
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
while(1):
for i in range(len(beepfrep)):
pwm.freq(beepfrep[i])
pwm.duty_u16(beepduty[i])
time.sleep(beeptime[i])
測試
接上喇叭,這里使用了功放
PWM使用P21
運行程序
可以聽到演奏的效果,詳細見視頻。
-
播放器
+關(guān)注
關(guān)注
5文章
411瀏覽量
37933 -
編程
+關(guān)注
關(guān)注
88文章
3683瀏覽量
94899 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5545瀏覽量
102546 -
代碼
+關(guān)注
關(guān)注
30文章
4889瀏覽量
70289 -
單板計算機
+關(guān)注
關(guān)注
0文章
84瀏覽量
15904 -
編譯
+關(guān)注
關(guān)注
0文章
676瀏覽量
33770 -
MIDI
+關(guān)注
關(guān)注
0文章
78瀏覽量
16045 -
ESP32
+關(guān)注
關(guān)注
20文章
1008瀏覽量
18867
發(fā)布評論請先 登錄
FireBeetle 2 ESP32-S3開發(fā)板測評

【FireBeetle 2 ESP32-S3開發(fā)板測評】Arduino IDE快速開發(fā)體驗

【FireBeetle 2 ESP32-S3開發(fā)板測評】MicroPython開發(fā)體驗


【FireBeetle 2 ESP32-S3開發(fā)板體驗】使用PyCharm開發(fā)MicroPython體驗
【FireBeetle 2 ESP32-S3開發(fā)板體驗】1、資料獲取、環(huán)境、固件燒寫、點燈。
【FireBeetle 2 ESP32-S3開發(fā)板體驗】時間顯示 基于ssd1306 I2C 調(diào)用開源庫 事半功倍
【FireBeetle 2 ESP32-S3開發(fā)板體驗】測評1_搭建開發(fā)環(huán)境
【FireBeetle 2 ESP32-S3開發(fā)板體驗】001:開箱+搭建Arduino開發(fā)環(huán)境
【FireBeetle 2 ESP32-S3開發(fā)板體驗】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS
合宙ESP32-S3開發(fā)板特性解讀
新品上市 | 合宙ESP32-S3開發(fā)板

Banana Pi 開源硬件基于ESP32-S3開發(fā)的物聯(lián)網(wǎng)開發(fā)板系列

評論