日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

树莓派蜂鸣器python代码_[原创]初玩树莓派B 5控制蜂鸣器演奏乐曲

發布時間:2023/12/10 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派蜂鸣器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控制蜂鸣器演奏乐曲的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。