树莓派蜂鸣器python代码_[原创]初玩树莓派B 5控制蜂鸣器演奏乐曲
初玩樹莓派 B? ?5控制蜂鳴器演奏樂曲
bbs.pediy.com
步進電機以及無源蜂鳴器這些都需要脈沖信號才能夠驅動,這次嘗試用GPIO的PWM接口驅動無源蜂鳴器彈奏一曲《一閃一閃亮晶晶》。
1無源蜂鳴器和有源蜂鳴器
主要是當初我自己也沒有意識到蜂鳴器還區分有源和無源的,買到手接上電源,就是不出聲,這才發現我買的蜂鳴器是無源的蜂鳴器。
無源蜂鳴器:
1無源內部沒有震蕩源,直流信號無法讓它鳴叫。必須用去震蕩的電流驅動它,2K-5KHZ的方波PWM (Pulse Width Modulation脈沖寬度調制)。 5KHZ的電流方波是啥意思?那就是每秒震動5K次,每一個完整的周期占用200us的時間,高點平占一部分時間,低電平占一部分時間。
2 聲音頻率可控,可以做出不同的音效。
有源蜂鳴器:
1內部帶震蕩電路,一通電就鳴叫,所以可以跟前面LED一樣,給個高電平就能響,編程比無源的方便。
無源的比有源的便宜,無源的2毛,有源的4毛。我買的無源蜂鳴器,該蜂鳴器阻抗42歐姆 ,可以用3V 和5V的來驅動。樹莓派高電平恰好是3.3V。
在這之前我根本不懂還區分有源和無源蜂鳴器,才有后續的曲折和摸索。
這種蜂鳴器正負極有很明顯的標記 + -。
2 PWM和輸出模式
單純和上次一樣操作設置GPIO口的高低是沒法實現輸出PWM的。好在樹莓派的某些PIN口有這種模式,那就是PIN12口。可以通過控制PIN12口的PWM模式來實現。就理解為方波把。由于pygpio暫不支持操作硬件的PWM。這里我們用wiringpi庫。
wiringPi中的pinMode (1,PWM_OUT),可以設置模式。PIN12是wiringpi的1號。
圖中t(pwm)就是一個周期的時間長度。對于2K頻率來說,那么周期就是1S/2K=500us。圖中的D叫做占空比。指的是高電平的時間占用整個周期時間的百分比。第一個周期D=50%,那么就是高電平低電平的時間各占一半。接下來的D為33%,那就是通電時間為33%,剩余的不通電時間占用67%。
占空比的確會影響頻率,但是我沒有具體去探究會如何影響頻率。我測試的時候使用的占空比是50%,也就是高低電平各占用一半的時間。
由于可以參考的例子是在太少了。只能自己翻芯片手冊查找相關資料。具體的相關資料在BCM2835芯片手冊的第九章(具體翻閱手冊查看,真是最好的辦法)。閱讀這一章以后我得出的關鍵點有如下幾點:
1 PWM的頻率是受時鐘管理器控制的,(樹莓派的基礎時鐘頻率是19.2MHZ)。
2 PWM的輸出占空比模式有兩種,一種是平衡模式,一種是MS模式。
先看占空比中的平衡模式和MS模式,假設我們希望輸出的占空比為 N/M。
平衡模式是指的按照某一種算法計算何時發送低電平,何時發送高電平,該算法力求任意一段時間占空比都最接近N/M,下圖是(4/8的時候的幾種發送方式),很顯然good的算法任意取得一段時間都更加接近4/8。
M/S模式就是整個S周期內,先發送M時間的高電平,剩余的S-M時間為低電平。
因此如果是4/8的占空比。
M/S模式8個時間長度內發送的就是 11110000 (周期為8個時間長度)。? ?而平衡模式則是 10101010(可以說最小周期為2個時間長度,大的周期為 8個時間長度)。
可能看不懂沒關系。用圖來解釋更有說服力。
假設我們需要的頻率為5KHZ,那么周期時間就是1s/5000hz=200us。設定占空比為 0.5 也就是高低電平各占一半,那么需要高電平占100us,低電平占100us。
如果是平衡模式。一個大周期內(200us)波形圖看起來如下:
也就是這個大周期內,任意取一段時間占空比都接近0.5,其實實際頻率比5K要大幾倍。
如果是MS模式。則看起來如下:
顯然這個才是我們需要的標準的5K頻率。因為這個模式最小頻率就是200us了。
wiringPi中的pwmSetMode (PWM_MODE_MS) 可以設置為ms模式。
前面說到樹莓派基礎時鐘頻率是19.2MHZ。pwm也受這個基礎頻率的控制,也就是最小的基礎周期是1/19200000 S。這個周期太小了,我們控制蜂鳴器需要2-5K的頻率。我們先將基礎頻率調大一些。通過pwmsetClock(int clock)可以將時鐘基礎頻率設置為 19.2M/clock的大小。然后我們再基于這個頻率通過pwmsetRasnge(int range)設置最終的頻率,range的范圍是2-4095。
通過pwmsetClock(clock)以及pwmsetRasnge(range)將最終的頻率控制在 19.2MHz/clock/range的大小。
這里我設置clock為32 將時鐘基礎頻率設置為19.2MHZ/32=600khz。
這樣我們只要設置range從300到120就能得到2k-5k的頻率。
那如何設置占空比呢?還有一個函數pwmWrite(value)。value指定了range指定的時間內發送高電平的基礎周期個數(以時鐘基礎頻率計算)。因此value/range就是占空比。pwmWrite(range/2)就能得到50%的占空比。range/5 就得到20%占空比。如果設置value為0,那么就是這段時期內一直是低電平,沒有任何高電平,蜂鳴器就不發聲了。
驗證一下如下圖。
50% (range/2)
20% (range/5)
因此我們可以初始化里面這么寫
void init()
{
if (wiringPiSetup () == -1)
exit (1) ;
//設置針腳為pwm輸出模式
pinMode (1, PWM_OUTPUT) ;
//設置pwm 信號模式為ms模式
pwmSetMode(PWM_MODE_MS);
//設置時鐘基礎頻率為19.2M/32=600KHZ
pwmSetClock(32);
}
為了后續能彈奏不同頻率的音階。封裝一個beep函數以及beep的持續時間。
void beep(int freq,int t_ms)
{
int range;
if(freq<2000||freq>5000)
{
printf("invalid freq");
return;
}
//設置range為 600KHZ/freq。也就是由range個1/600KHZ組成了freq頻率的周期。
range=600000/freq。
pwmSetRange(range);
//設置占空比為50%。
pwmWrite(1,range/2);
if(t_ms>0)
{
delay(t_ms);
}
}
通過delay來控制延時。
通過 pwmWrite(1,0)來關閉輸出。
剩下的就是查找 一閃一閃亮晶晶的簡譜。對應設定好頻率和持續時間。隨后循環播放出來就可以了。
這里就只截圖,具體代碼下載pwm.c查看。
接線圖如下。BCM標號1(PIN12 )接無源蜂鳴器的正極。負極接GND,為了接線方便。我買了擴展版和排線哦。(第一次錯買了樹莓派2的40 PIN,第二次賣家給我發錯貨了。第三次才買到,也是坎坷)。
編譯執行
gcc -o pwm pwm.c -lwiringpi
sudo ./pwm
就可以聽到播放曲譜了。
建議不要多聽。因為2K-5K的頻率對于人的耳朵實在是有點高了,聽多了刺耳心慌。
學會了pwm就可以控制一些需要脈沖波控制的外部設備了。
有人會說,設置GPIO為輸出模式。
PinWrite(1);
sleep(100us);
pinWrite(0);
sleep(100us);
這樣不是也行嗎?
的確這樣是可以的,但是CPU占用的資源很高。使用python的話時間控制更是不精準,因此既然有硬件的PWM模塊我們還是使用一下這個功能把。
其實我沒想本節這么復雜的。以為蜂鳴器接上電源就會響。不過省了兩毛錢的同時還讓我學到了更多的東西。有時候網上查不到的一些東西,就需要自己認認真真查看相關資料測試。還有就是硬件比軟件麻煩多了。
下一節是人體感應器。感應到人體以后配合蜂鳴器報警。
上傳的附件:
fb.png
(24.77kb,4次下載)
beep.png
(192.63kb,4次下載)
pwm.png
(20.49kb,10次下載)
balance.png
(14.79kb,2次下載)
msmode.png
(6.40kb,3次下載)
pic_ms.png
(3.04kb,2次下載)
pic_bal.png
(1.89kb,2次下載)
50perc.png
(1.03kb,2次下載)
20perc.png
(1.81kb,2次下載)
notation2.png
(94.92kb,4次下載)
notation1.png
(16.81kb,4次下載)
main.png
(22.99kb,9次下載)
result.png
(540.95kb,7次下載)
pwm.c.txt
(1.53kb,152次下載)
總結
以上是生活随笔為你收集整理的树莓派蜂鸣器python代码_[原创]初玩树莓派B 5控制蜂鸣器演奏乐曲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关刀机器人_小学机器人活动总结
- 下一篇: 线程八大核心+java并发核心知识体系精