Python與硬件學習筆記:蜂鳴器(轉)


相信大家對蜂鳴器都不會陌生,很多產品和方案中都會用到蜂鳴器,大部分都是使用蜂鳴器來做提示或報警,比如按鍵按下、開始工作、工作結束或是故障等等。這里對單片機在蜂鳴器驅動上的應用作一下描述。

蜂鳴器的介紹、原理及其驅動方式

(一)蜂鳴器的介紹

1.蜂鳴器的作用:蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用於計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。

2.蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。

3.蜂鳴器的電路圖形符號蜂鳴器在電路中用字母“H”或“HA”(舊標准用“FM”、“LB”、“JD”等)表示。

(二)蜂鳴器的結構原理

1.壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振盪器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極管。多諧振盪器由晶體管或集成電路構成。當接通電源后(1.5~15V直流工作電壓),多諧振盪器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極經極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。

2.電磁式蜂鳴器 電磁式蜂鳴器由振盪器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振盪器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。

(三)驅動方式

       慣用驅動蜂鳴器的方式有兩種:一種是PWM 輸出口直接驅動,另一種是利用I/O定時翻轉電平產生驅動波形對蜂鳴器進行驅動。

PWM 輸出口直接驅動是利用PWM輸出口本身可以輸出一定的方波來直接驅動蜂鳴器。在單片機的軟件設置中有幾個系統寄存器是用來設置PWM口的輸出的,可以設置占空比、周期等等,通過設置這些寄存器產生符合蜂鳴器要求的頻率的波形之后,只要打開PWM輸出,PWM輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅動蜂鳴器了。比如頻率為2000Hz的蜂鳴器的驅動,可以知道周期為500μs,這樣只需要把PWM的周期設置為500μs,占空比電平設置為250μs,就能產生一個頻率為2000Hz的方波,通過這個方波再利用三極管就可以去驅動這個蜂鳴器了。

        而利用I/O 定時翻轉電平來產生驅動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉電平產生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅動蜂鳴器了。比如為2500Hz的蜂鳴器的驅動,可以知道周期為400μs,這樣只需要驅動蜂鳴器的I/O口每200μs翻轉一次電平就可以產生一個頻率為2500Hz,占空比為1/2duty的方波,再通過三極管放大就可以驅動這個蜂鳴器了。

有源蜂鳴器與無源蜂鳴器有什么區別

      這里的“源”不是指電源。而是指震盪源。 也就是說,有源蜂鳴器內部帶震盪源,所以只要一通電就會叫。而無源內部不帶震盪源,所以如果用直流信號無法令其鳴叫。必須用2K~5K的方波去驅動它。因此有源蜂鳴器往往比無源的貴,就是因為里面多個震盪電路。無源蜂鳴器的優點是:便宜、聲音頻率可控,可以做出“多來米發索拉西”的效果、在一些特例中,可以和LE復用一個控制口。有源蜂鳴器的優點是:程序控制方便 。

模塊使用

       在此我們利用蜂鳴器實現一個簡單的整點報時功能,在這里我們選用有源蜂鳴器,只要通電就會發聲,這樣程序控制簡單,無源蜂鳴器的控制發聲,需要利用PWM進行輸出,PWM控制輸出可參見溫度傳感器DS18B20。

1、所需材料:

     • 有源蜂鳴器一個

     • 樹莓派

     •  杜邦線數根

2、引腳連接說明:

 

有源蜂鳴器 樹莓派
- GND
+ 5v
S GPIO 7

 

3、程序編寫:

為了使蜂鳴器鳴叫的程序模塊化,將這一部分代碼放到獨立的 libbeep.py 文件中,代碼如下:

[python]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. import RPi.GPIO as GPIO  
  2. import time  
  3.    
  4. PIN_NO = #GPIO編號,可自定義  
  5.    
  6. GPIO.setmode(GPIO.BOARD)  
  7. GPIO.setup(PIN_NO, GPIO.OUT)  
  8.    
  9. #嗶1次,時長作為參數傳遞  
  10. def beep(seconds):  
  11.         GPIO.output(PIN_NO, GPIO.HIGH)  
  12.         time.sleep(seconds)  
  13.         GPIO.output(PIN_NO, GPIO.LOW)  
  14.    
  15. #嗶N次,時長、間隔時長、重復次數作為參數傳遞  
  16. def beepAction(secs, sleepsecs, times):  
  17.         for i in range(times):  
  18.             beep(secs)  
  19.             time.sleep(sleepsecs)  
  20.    
  21. #beepAction(0.02,0.02,30)  

在 alarm.py 中實現整點報時,代碼如下:

[python]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. import RPi.GPIO as GPIO  
  2. import time  
  3. import libbeep  
  4. while True:  
  5.         t = time.localtime() #讀取系統時間  
  6.         h = t.tm_hour  
  7.         m = t.tm_min  
  8.         s = t.tm_sec  
  9.         w = time.strftime('%w',t)#函數接收以時間元組,並返回以可讀字符串表示的當地時間,%w一年中的星期數(00-53)星期一為星期的開始  
  10.         print h,m,s,w  
  11.         time.sleep(0.3)  
  12.         if m == and s == 0:  
  13.             if h>22 or h<8:#為了晚上22點之后,上午8點之前不被打擾  
  14.                 print "continued"  
  15.                 continue  
  16.             if h>12:  
  17.                 h = h-12  
  18.             libbeep.beepAction (0.3,0.5,h)  
  19.             time.sleep(1)  
  20.    
  21.         if m == 30 and s == 0:  
  22.             if h>22 or h<8:  
  23.              print "continued"  
  24.                 continue  
  25.             libbeep.beepAction (0.05,0.05,2)  
  26.             time.sleep(1)  

 

為了方便測試,我們可以把系統時間調整接近整點的時刻,在運行腳本,等待整點,感受自己制作的整點報時

使用此命令更改系統時間: sudo date -s"10:59:57 2015-04-03"

執行腳本:    sudo Python alarm.py

最后等待鈴聲響起!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM