树莓派基础实验9:蜂鸣器实验
一、介紹
?? 蜂鳴器是音頻信號裝置,蜂鳴器可分為有源蜂鳴器和無源蜂鳴器。有源蜂鳴器直接接上額定電源就可以連續發聲;而無源蜂鳴器則和電磁揚聲器一樣,需要接在音頻輸出電路中才能周期性地振動發聲。
二、組件
★Raspberry Pi 3主板*1
★樹莓派電源*1
★40P軟排線*1
★有源蜂鳴器模塊*1
★無源蜂鳴器模塊*1
★雙色LED模塊*1
★面包板*1
★跳線若干
三、實驗原理
??有源蜂鳴器內置振蕩源,所以通電時會發出聲音。但無源蜂鳴器沒有這種內置振蕩源,所以如果使用直流信號,他不會發出轟鳴聲;相反,你需要使用頻率在2k到5k之間的方波來驅動它。由于有內置振蕩電路,所以有源蜂鳴器通常比無源蜂鳴器昂貴。
??將兩個蜂鳴器的引腳朝上,你可以看到帶有綠色電路板的引腳是一個無源蜂鳴器。而另一個帶有黑色塑料外殼,而不是電路板的蜂鳴器是有源蜂鳴器。
四、實驗步驟
有源蜂鳴器:
??第1步:連接電路。這里要注意的是:蜂鳴器的電源是使用的3.3V,而不是前面實驗所使用的5V,若使用5V電源,蜂鳴器會異常。
| 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 timeBuzzer = 11 # pin11def setup(pin):global BuzzerPinBuzzerPin = pinGPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical locationGPIO.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 resourceif __name__ == '__main__': # Program start from heresetup(Buzzer)try:loop()except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.destroy()無源蜂鳴器:
??第1步:連接電路。這里要注意的是:蜂鳴器的電源是使用的3.3V,而不是前面實驗所使用的5V,若使用5V電源,蜂鳴器會異常。
| GPIO 0(序號11) | GPIO 17 | SIG(I/O) |
| 3.3V | 3.3V | VCC |
| GND | GND | GND |
??第2步:編程前先介紹本次編程需要的幾個知識點:
??使用無源蜂鳴器,只要輸出不同頻率的PWM波,即可發出不同的音符。不同的音符組合起來就是一個曲子了。
樂譜簡析:
- 音階
??音階是音樂必不可少的要素,主要由聲音的頻率決定。通過給蜂鳴器不同頻率的音頻脈沖,可以產生不同的音階,而要產生某頻率的音頻脈沖,最簡單的辦法是以該音頻的頻率除以2的值,函數ChangeFrequency(Frequency)使用該值為參數改變蜂鳴器輸入方波信號的頻率,蜂鳴器上就可發出該頻率的聲音。
??若想改變音階,只需要改變頻率即可。下表為各音調音符頻率對照表,據此可產生不同音階的音符。“#”表示半音,用于上升或下降半個音,乘以2就提升該聲音一個8度音階,減半則降一個8度。
- 節拍
??若要構成音樂,光有音階是不夠的,還需要節拍,也就是音符持續時間的長短,一般用拍數表示。至于1拍是多少秒,沒有嚴格的規定,只要節拍適宜,聲音悅耳即可。假如某首歌曲的節奏是每分鐘120拍,那么1拍為0.5 s,1/4拍為0.125 s,以此類推可得到其他節拍對應的時長。這樣,利用不同的頻率,加上與拍數對應的延時,就構成了樂曲。
??第3步:開始編程。 按照蜂鳴器音階頻率對照表,定義C調低、中、高各音符,對應的頻率的列表。CL表示C調低音符列表。
#!/usr/bin/env python import RPi.GPIO as GPIO import timeBuzzer = 11CL = [0, 131, 147, 165, 175, 196, 211, 248] # C調低音符的頻率列表,第一位為0是占位用,后面不使用#除0外,依次是1do、2re、3mi、4fa、5sol、6la、7si CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequency of Middle C notesCH = [0, 525, 589, 661, 700, 786, 882, 990] # Frequency of High C notes??第4步: 利用上面定義的頻率的列表,定義歌曲的音符和節拍列表。
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的節拍, 2表示2個1/8節拍。一個1/8節拍為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步: 定義初始化設置函數setup()。
def setup():GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical locationGPIO.setup(Buzzer, GPIO.OUT) # Set pins' mode is outputglobal 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步: 定義循環函數loop(),主要有三部分,分別播放3首曲子。
def loop():while True:#--------------------------------------------print '\n\n Playing Low C notes...'for i in range(0, 7): # Play song 0的C調低音音符Buzz.ChangeFrequency(song_0[i])# 根據歌曲的音符改變頻率print i #打印i的值time.sleep(beat_0[i] * 0.5) # 根據節拍列表每個音符延遲1秒,2 beats*0.5s=1sprint '\n\n Playing Middle C notes...'for i in range(7, 14): # Play song 0Buzz.ChangeFrequency(song_0[i]) # Change the frequency along the song noteprint itime.sleep(beat_0[i] * 0.5) # delay a note for beat * 0.5sprint '\n\n Playing High C notes...'for i in range(14, 21): # Play song 0Buzz.ChangeFrequency(song_0[i]) # Change the frequency along the song noteprint itime.sleep(beat_0[i] * 0.5) # delay a note for beat * 0.5sBuzz.ChangeFrequency(0.5) #一首曲子結束,間隔3秒time.sleep(3)#-------------------------------------------- print '\n Playing song 1...'for i in range(0, len(song_1)): # Play song 1Buzz.ChangeFrequency(song_1[i]) # Change the frequency along the song notetime.sleep(beat_1[i] * 0.5) # delay a note for beat * 0.5sBuzz.ChangeFrequency(0.5) #一首曲子結束,間隔3秒time.sleep(3) #--------------------------------------------print '\n\n Playing song 2...'for i in range(0, len(song_2)): # Play song 1Buzz.ChangeFrequency(song_2[i]) # Change the frequency along the song notetime.sleep(beat_2[i] * 0.5) # delay a note for beat * 0.5sBuzz.ChangeFrequency(0.5)time.sleep(3)??第7步。
def destory():Buzz.stop() # Stop the buzzerGPIO.output(Buzzer, 1) # Set Buzzer pin to HighGPIO.cleanup() # Release resourceif __name__ == '__main__': # Program start from heresetup()try:loop()except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.destory()總結
以上是生活随笔為你收集整理的树莓派基础实验9:蜂鸣器实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg 推流
- 下一篇: scipy库中的leastsq函数