一蜒蕾、介紹
?? 蜂鳴器是音頻信號裝置薇芝,蜂鳴器可分為有源蜂鳴器和無源蜂鳴器茫死。有源蜂鳴器直接接上額定電源就可以連續(xù)發(fā)聲;而無源蜂鳴器則和電磁揚聲器一樣狈癞,需要接在音頻輸出電路中才能周期性地振動發(fā)聲茄靠。
二、組件
★Raspberry Pi 3主板*1
★樹莓派電源*1
★40P軟排線*1
★有源蜂鳴器模塊*1
★無源蜂鳴器模塊*1
★雙色LED模塊*1
★面包板*1
★跳線若干
三蝶桶、實驗原理
??有源蜂鳴器內(nèi)置振蕩源慨绳,所以通電時會發(fā)出聲音。但無源蜂鳴器沒有這種內(nèi)置振蕩源真竖,所以如果使用直流信號脐雪,他不會發(fā)出轟鳴聲;相反恢共,你需要使用頻率在2k到5k之間的方波來驅(qū)動它战秋。由于有內(nèi)置振蕩電路,所以有源蜂鳴器通常比無源蜂鳴器昂貴讨韭。
??將兩個蜂鳴器的引腳朝上获询,你可以看到帶有綠色電路板的引腳是一個無源蜂鳴器。而另一個帶有黑色塑料外殼拐袜,而不是電路板的蜂鳴器是有源蜂鳴器吉嚣。
四、實驗步驟
有源蜂鳴器:
??第1步:連接電路蹬铺。這里要注意的是:蜂鳴器的電源是使用的3.3V尝哆,而不是前面實驗所使用的5V,若使用5V電源甜攀,蜂鳴器會異常秋泄。
樹莓派 | T型轉(zhuǎn)接板 | 有源蜂鳴器 |
---|---|---|
GPIO 0(序號11) | GPIO 17 | SIG(I/O) |
3.3V | 3.3V | VCC |
GND | GND | GND |
??第2步:編程。通過改變輸入到蜂鳴器的信號電平规阀,低電平是響恒序,高電平是停止響來控制蜂鳴器。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
Buzzer = 11 # pin11
def setup(pin):
global BuzzerPin
BuzzerPin = pin
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(BuzzerPin, GPIO.OUT)
GPIO.output(BuzzerPin, GPIO.HIGH)
def on():
GPIO.output(BuzzerPin, GPIO.LOW)
#低電平是響
def off():
GPIO.output(BuzzerPin, GPIO.HIGH)
#高電平是停止響
def beep(x): #響3秒后停止3秒
on()
time.sleep(x)
off()
time.sleep(x)
def loop():
while True:
beep(3)
def destroy():
GPIO.output(BuzzerPin, GPIO.HIGH)
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup(Buzzer)
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destroy()
無源蜂鳴器:
??第1步:連接電路谁撼。這里要注意的是:蜂鳴器的電源是使用的3.3V歧胁,而不是前面實驗所使用的5V,若使用5V電源厉碟,蜂鳴器會異常喊巍。
樹莓派 | T型轉(zhuǎn)接板 | 無源蜂鳴器 |
---|---|---|
GPIO 0(序號11) | GPIO 17 | SIG(I/O) |
3.3V | 3.3V | VCC |
GND | GND | GND |
??第2步:編程前先介紹本次編程需要的幾個知識點:
??使用無源蜂鳴器,只要輸出不同頻率的PWM波箍鼓,即可發(fā)出不同的音符崭参。不同的音符組合起來就是一個曲子了。
樂譜簡析:
音階
??音階是音樂必不可少的要素款咖,主要由聲音的頻率決定何暮。通過給蜂鳴器不同頻率的音頻脈沖奄喂,可以產(chǎn)生不同的音階,而要產(chǎn)生某頻率的音頻脈沖海洼,最簡單的辦法是以該音頻的頻率除以2的值跨新,函數(shù)ChangeFrequency(Frequency)使用該值為參數(shù)改變蜂鳴器輸入方波信號的頻率,蜂鳴器上就可發(fā)出該頻率的聲音贰军。
??若想改變音階玻蝌,只需要改變頻率即可蟹肘。下表為各音調(diào)音符頻率對照表词疼,據(jù)此可產(chǎn)生不同音階的音符×备梗“#”表示半音贰盗,用于上升或下降半個音,乘以2就提升該聲音一個8度音階阳欲,減半則降一個8度舵盈。
- 節(jié)拍
??若要構(gòu)成音樂,光有音階是不夠的球化,還需要節(jié)拍秽晚,也就是音符持續(xù)時間的長短,一般用拍數(shù)表示筒愚。至于1拍是多少秒赴蝇,沒有嚴(yán)格的規(guī)定,只要節(jié)拍適宜巢掺,聲音悅耳即可句伶。假如某首歌曲的節(jié)奏是每分鐘120拍,那么1拍為0.5 s陆淀,1/4拍為0.125 s考余,以此類推可得到其他節(jié)拍對應(yīng)的時長。這樣轧苫,利用不同的頻率楚堤,加上與拍數(shù)對應(yīng)的延時,就構(gòu)成了樂曲含懊。
??第3步:開始編程钾军。按照蜂鳴器音階頻率對照表,定義C調(diào)低绢要、中吏恭、高各音符,對應(yīng)的頻率的列表重罪。CL表示C調(diào)低音符列表樱哼。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
Buzzer = 11
CL = [0, 131, 147, 165, 175, 196, 211, 248]
# C調(diào)低音符的頻率列表哀九,第一位為0是占位用,后面不使用
#除0外搅幅,依次是1do阅束、2re、3mi茄唐、4fa息裸、5sol、6la沪编、7si
CM = [0, 262, 294, 330, 350, 393, 441, 495]
# Frequency of Middle C notes
CH = [0, 525, 589, 661, 700, 786, 882, 990]
# Frequency of High C notes
??第4步:利用上面定義的頻率的列表呼盆,定義歌曲的音符和節(jié)拍列表。
song_0 = [ CL[1], CL[2], CL[3], CL[4], CL[5], CL[6], CL[7],
CM[1], CM[2], CM[3], CM[4], CM[5], CM[6], CM[7],
CH[1], CH[2], CH[3], CH[4], CH[5], CH[6], CH[7] ]
# song_0表示從低音do依次到高音si的音符列表
beat_0 = [ 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2 ]
# song_0的節(jié)拍蚁廓, 2表示2個1/8節(jié)拍访圃。一個1/8節(jié)拍為0.5秒延遲。
song_1 = [ CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6],
CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3],
CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5] ]
# Notes of song1
beat_1 = [ 1, 1, 3, 1, 1, 3, 1, 1,
1, 1, 1, 1, 1, 1, 3, 1,
1, 3, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1,
1, 1, 3 ]
# Beats of song 1, 1 means 1/8 beats
song_2 = [ CM[1], CM[1], CM[1], CL[5], CM[3], CM[3], CM[3], CM[1],
CM[1], CM[3], CM[5], CM[5], CM[4], CM[3], CM[2], CM[2],
CM[3], CM[4], CM[4], CM[3], CM[2], CM[3], CM[1], CM[1],
CM[3], CM[2], CL[5], CL[7], CM[2], CM[1] ]
# Notes of song2
beat_2 = [ 1, 1, 2, 2, 1, 1, 2, 2,
1, 1, 2, 2, 1, 1, 3, 1,
1, 2, 2, 1, 1, 2, 2, 1,
1, 2, 2, 1, 1, 3 ]
# Beats of song 2, 1 means 1/8 beats,0.5 second
??第5步:定義初始化設(shè)置函數(shù)setup()相嵌。
def setup():
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(Buzzer, GPIO.OUT) # Set pins' mode is output
global Buzz # Assign a global variable to replace GPIO.PWM
Buzz = GPIO.PWM(Buzzer, 440) # 440 is initial frequency.
Buzz.start(50) # Start Buzzer pin with 50% duty ration
??第6步:定義循環(huán)函數(shù)loop()腿时,主要有三部分,分別播放3首曲子饭宾。
def loop():
while True:
#--------------------------------------------
print '\n\n Playing Low C notes...'
for i in range(0, 7): # Play song 0的C調(diào)低音音符
Buzz.ChangeFrequency(song_0[i])
# 根據(jù)歌曲的音符改變頻率
print i #打印i的值
time.sleep(beat_0[i] * 0.5)
# 根據(jù)節(jié)拍列表每個音符延遲1秒批糟,2 beats*0.5s=1s
print '\n\n Playing Middle C notes...'
for i in range(7, 14): # Play song 0
Buzz.ChangeFrequency(song_0[i]) # Change the frequency along the song note
print i
time.sleep(beat_0[i] * 0.5) # delay a note for beat * 0.5s
print '\n\n Playing High C notes...'
for i in range(14, 21): # Play song 0
Buzz.ChangeFrequency(song_0[i]) # Change the frequency along the song note
print i
time.sleep(beat_0[i] * 0.5) # delay a note for beat * 0.5s
Buzz.ChangeFrequency(0.5) #一首曲子結(jié)束,間隔3秒
time.sleep(3)
#--------------------------------------------
print '\n Playing song 1...'
for i in range(0, len(song_1)): # Play song 1
Buzz.ChangeFrequency(song_1[i]) # Change the frequency along the song note
time.sleep(beat_1[i] * 0.5) # delay a note for beat * 0.5s
Buzz.ChangeFrequency(0.5) #一首曲子結(jié)束看铆,間隔3秒
time.sleep(3)
#--------------------------------------------
print '\n\n Playing song 2...'
for i in range(0, len(song_2)): # Play song 1
Buzz.ChangeFrequency(song_2[i]) # Change the frequency along the song note
time.sleep(beat_2[i] * 0.5) # delay a note for beat * 0.5s
Buzz.ChangeFrequency(0.5)
time.sleep(3)
??第7步徽鼎。
def destory():
Buzz.stop() # Stop the buzzer
GPIO.output(Buzzer, 1) # Set Buzzer pin to High
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destory()