樹莓派基礎(chǔ)實驗9:蜂鳴器實驗

一蜒蕾、介紹

?? 蜂鳴器是音頻信號裝置薇芝,蜂鳴器可分為有源蜂鳴器和無源蜂鳴器茫死。有源蜂鳴器直接接上額定電源就可以連續(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市性湿,隨后出現(xiàn)的幾起案子纬傲,更是在濱河造成了極大的恐慌,老刑警劉巖肤频,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹括,死亡現(xiàn)場離奇詭異,居然都是意外死亡宵荒,警方通過查閱死者的電腦和手機汁雷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來报咳,“玉大人侠讯,你說我怎么就攤上這事∈钊校” “怎么了厢漩?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岩臣。 經(jīng)常有香客問我溜嗜,道長宵膨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任炸宵,我火速辦了婚禮辟躏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘土全。我一直安慰自己捎琐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布裹匙。 她就那樣靜靜地躺著瑞凑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幻件。 梳的紋絲不亂的頭發(fā)上拨黔,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天蛔溃,我揣著相機與錄音绰沥,去河邊找鬼。 笑死贺待,一個胖子當(dāng)著我的面吹牛徽曲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麸塞,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼秃臣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哪工?” 一聲冷哼從身側(cè)響起奥此,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雁比,沒想到半個月后稚虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡偎捎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年蠢终,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴她。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寻拂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丈牢,到底是詐尸還是另有隱情祭钉,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布己沛,位于F島的核電站慌核,受9級特大地震影響帕识,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遂铡,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一肮疗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扒接,春花似錦伪货、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宗侦,卻和暖如春愚臀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾利。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工姑裂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人男旗。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓舶斧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親察皇。 傳聞我的和親對象是個殘疾皇子茴厉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348