通過前面兩篇貼子的介紹,相信大家已經(jīng)掌握如何使用 Python 操作 GPIO 和 I2C 了。
那么今天我們可以更進(jìn)一步,通過 Python 中的 GPIO 和 PWM 接口使蜂鳴器發(fā)聲。
當(dāng)然,如果只是實(shí)現(xiàn)這個(gè)功能就太無聊了,所以我們可以擴(kuò)展一下,做個(gè)稍微有意思一些的東西。
嗯。。。想想做點(diǎn)啥呢?!翻箱倒柜一番之后,我找到了下面這塊擴(kuò)展板。
這是小熊派鴻蒙開發(fā)套件中的“智慧安防”擴(kuò)展板,板子上搭配了一個(gè)紅外傳感器和一個(gè)蜂鳴器。
基于這個(gè)板子,可以開發(fā)一個(gè)簡(jiǎn)單的安防案例:當(dāng)紅外傳感器有感應(yīng)(有人靠近)時(shí),觸發(fā)蜂鳴器發(fā)出警告(發(fā)聲)。
在開始之前需要先介紹一個(gè)新概念:脈沖寬度調(diào)制(Pulse Width Modulation),即:PWM。
這是一個(gè)屬于硬件電路層面的概念,對(duì)于物聯(lián)網(wǎng)開發(fā)來說不需要特別深入的對(duì)它進(jìn)行研究,只需要掌握基本原理后應(yīng)用到開發(fā)中即可。
簡(jiǎn)單的說,PWM 就是利用數(shù)字信號(hào)輸出模擬信號(hào)的一種技術(shù)。眾所周知,現(xiàn)代計(jì)算機(jī)系統(tǒng)是數(shù)字驅(qū)動(dòng)的,即:所有計(jì)算機(jī)部件在高低電平的交替驅(qū)動(dòng)下工作。
如果所有的外設(shè)都是數(shù)字的,那么事情就很簡(jiǎn)單了,直接 GPIO 連接就可以通信。
然而,有些外設(shè)就不是數(shù)字的,而是模擬的,需要接收模擬信號(hào)(如:正弦波信號(hào)),所以需要借助處理器使用 PWM 技術(shù)實(shí)現(xiàn)模擬信號(hào)。
基本原理如下:
根據(jù)電工電子學(xué)老師的說法,如果需要產(chǎn)生這樣的一個(gè)正弦波,可以用多個(gè)方波代替,其效果是相同的。
圖 a) 中的正弦波可以用一個(gè)個(gè)幅值相同但是寬度不同的方波代替,如圖 b) ,只要這些方波與 t 軸圍起來的面積和原始正弦波與 t 軸圍起來的面積相同即可。
有了上面的原理之后,接下來需要討論的就是:如何調(diào)節(jié)出等效的方波?
為了解決這個(gè)問題,需要了解占空比的概念!占空比指在一個(gè)周期內(nèi),信號(hào)處于高電平的時(shí)間占據(jù)整個(gè)信號(hào)周期的百分比。
在上圖中一個(gè)周期是 4ms ,而高電平在一個(gè)周期中的持續(xù)時(shí)間是 1ms,所以占空比為 25% 。
掌握了這些理論性的東西之后,就可以考慮如何實(shí)操的問題了:怎么實(shí)現(xiàn) PWM 信號(hào)(方波信號(hào))輸出?
很幸運(yùn),Hi3861中自帶了 PWM 模塊,所以在代碼層面只需要調(diào)用相關(guān) API 接口向 PWM 模塊設(shè)置必要參數(shù),就可以輸出需要的連續(xù) PWM 信號(hào)(方波信號(hào))。
上面表格中的接口功能可謂一目了然,幾乎可以做到“開箱即用”,唯一需要做解釋的就是 start(port,duty,freq)這個(gè)函數(shù)。
port 表示 PWM 信號(hào)的輸出通道編號(hào),freq 用于控制 PWM 信號(hào)的輸出頻率,duty 用于指定占空比,占空比的值為 duty 和 freq 的比值。
Ok!有了這些鋪墊,可以上代碼了!
Snippet 1部分的代碼先對(duì) GPIO_7 進(jìn)行初始化和功能設(shè)置,目的是接收 is1 也就是紅外傳感器的感應(yīng)信號(hào),當(dāng) Hi3861 接收到這個(gè)紅外感應(yīng)信號(hào)就會(huì)觸發(fā)回調(diào) is1_callback() 。
Snippet 2 部分的代碼復(fù)用 GPIO_8 使其連接 PWM 模塊,目的是對(duì) PWM 進(jìn)行參數(shù)設(shè)置。
這里可以更進(jìn)一步的給大家科普一下 GPIO 和 PWM 的關(guān)系:在理論上可以直接用 GPIO 產(chǎn)生需要的方波信號(hào),但現(xiàn)實(shí)中并不會(huì)這么做!
原因很簡(jiǎn)單,這么做會(huì)耗費(fèi)大量的處理器資源,并且產(chǎn)生的方波信號(hào)頻率有限。
所以,一般都會(huì)引入獨(dú)立的 PWM 模塊,處理器通過 GPIO 與這個(gè)模塊連接在一起,從而能夠?qū)ζ溥M(jìn)行參數(shù)設(shè)置。之后,具體產(chǎn)生方波的工作就由 PWM 模塊完成了。
接下來,看看回調(diào)函數(shù) is1_callback() 的實(shí)現(xiàn)。
代碼很簡(jiǎn)單,核心部分就是對(duì)變量 pwm_on 進(jìn)行標(biāo)記,即:當(dāng)接收到紅外感應(yīng)信號(hào)的時(shí)候?qū)?pwm_on 賦值為 True。
然后呢?然后在別處進(jìn)行處理!
腳本文件的最后,可以看到處理 pwm_on 為 True 的代碼,即:當(dāng) pwm_on 為 True 時(shí),調(diào)用 start() 函數(shù)促使 1 號(hào) PWM 通道產(chǎn)生方波信號(hào)。
而 1 號(hào) PWM 通道連接的是一個(gè)蜂鳴器,產(chǎn)生方波信號(hào)的最終結(jié)果就是使得蜂鳴器發(fā)聲。
整體流程如下:
最終效果如下:
可以看到,當(dāng)我靠近開發(fā)板時(shí),紅外感應(yīng)器立即發(fā)送感應(yīng)信號(hào),進(jìn)而觸發(fā)蜂鳴器發(fā)聲。
WOW!一個(gè)簡(jiǎn)單的安防系統(tǒng)就這么完成了!
PS:最新版 Python 引擎庫能夠支持幾乎所有鴻蒙的外設(shè)接口,以及基礎(chǔ)浮點(diǎn)運(yùn)算。
感興趣的同學(xué)可下載附件中的代碼和文件自行編程嘗試。
Enjoy It!
代碼開源地址:
https://gitee.com/delphi-tang/python-for-hos
編輯:jq
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5093瀏覽量
97800 -
GPIO
+關(guān)注
關(guān)注
16文章
1215瀏覽量
52221 -
紅外感應(yīng)器
+關(guān)注
關(guān)注
0文章
11瀏覽量
8406
原文標(biāo)題:用鴻蒙開發(fā)板做一個(gè)報(bào)警器,超簡(jiǎn)單
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論