(以下內(nèi)容來自嘉賓分享,不代表 OpenHarmony 項目群工作委員會觀點)
唐佐林
Python SIG Leader、狄泰軟件訓(xùn)練營創(chuàng)始人
之前,我將 MicroPython 的解釋器給“挖”了出來,然后做了適配,成功運(yùn)行于 OpenHarmony 設(shè)備(Hi3861)之上(詳見前一篇帖子:《用Python開發(fā)OpenHarmony設(shè)備程序-初體驗》。
為了實現(xiàn)最初的夢想:通過 Python 降低 OpenHarmony 設(shè)備開發(fā)的門檻。最近我又開始創(chuàng)作起來,大刀闊斧的在之前工作的基礎(chǔ)上做了 Python SDK 的設(shè)計和開發(fā)。終于,現(xiàn)在可以直接用 Python 來控制 OpenHarmony 開發(fā)板外設(shè)了。
OK!我們進(jìn)入正題,直接上 Python 代碼學(xué)習(xí)!
import gpio # 導(dǎo)入 gpio 模塊
import os # 導(dǎo)入 os 模塊
led = 7 # GPIO_7 連接了一個 LED 燈
gpio.gpio_init() # 初始化系統(tǒng) GPIO 環(huán)境
func = gpio.query_func_value(led, 'gpio') # 查找 GPIO_7 目標(biāo)功能編號
# 'gpio' 指基本輸入輸出功能
gpio.set_func(led, func) # 設(shè)置 GPIO_7 為基本輸入輸出
gpio.set_dir(led, gpio.dir_out) # 設(shè)置 GPIO_7 作為輸出使用
gpio.set_output(led, 1) # 設(shè)置 GPIO_7 輸出高電平
# 即:點亮 GPIO_7 上的 LED 燈
while True:
os.sleep(1) # 休眠 1 秒
gpio.gpio_deinit()#清理GPIO環(huán)境
在這里給大家做一點點概念上的科普,幫助大家更好的理解代碼。GPIO(General Purpose Input/Output)即:通用型輸入輸出的簡稱,其物理表現(xiàn)形式為:可接收或輸出電信號的引腳,使用者可根據(jù)需要將其作為輸入(GPI)或輸出(GPO)使用。并且, 一般情況下,開發(fā)板上都有多個 GPIO 引腳供使用。當(dāng) GPIO 作為輸出使用時,輸出的電信號為高電平(1)或者低電平(0),因此,只要在電路上稍加設(shè)計就可以接入外設(shè)(如:LED燈,電動機(jī),等),并通過程序控制外設(shè)的狀態(tài)。有了這些概念之后,上面的示例的代碼理解起來就簡單了!無非就是將 LED 燈(一種外設(shè))接入第 7 號 GPIO 引腳,并通過程序設(shè)置第 7 號引腳輸出高電平,點亮 LED 燈。
如果只是單純的通過代碼點亮一個 LED 燈,是真的不難,但也是真的挺無聊。所以,再給大家一個稍微復(fù)雜一點的示例:通過開關(guān)控制 LED 燈的狀態(tài)。
Show me the code!
import gpio
import os
led = 7
button = 11 # GPIO_11 接入了一個按鍵
led_on = False # 標(biāo)識 LED 燈的狀態(tài)
# 按鍵回調(diào)函數(shù)
def button_callback(arg) :
cur_tick = os.get_tick() # 獲取系統(tǒng)當(dāng)前 tick 用于實現(xiàn)按鍵防抖
if cur_tick - arg[0] > 20: # 當(dāng)時間流失量大于 20 tick 時
# 改變 LED 燈的狀態(tài)
global led_on
if led_on : # 當(dāng)前狀態(tài)為“打開”,則關(guān)閉 LED 燈
gpio.set_output(led, 0)
led_on = False
print('LED is OFF!')
else : # 當(dāng)前狀態(tài)為“關(guān)閉”,則打開 LED 燈
gpio.set_output(led, 1)
led_on = True
print('LED is ON!')
arg[0] = cur_tick # 記錄當(dāng)前 tick 為下次按鍵觸發(fā)做準(zhǔn)備
gpio.gpio_init()
func = gpio.query_func_value(led, 'gpio')
gpio.set_func(led, func)
gpio.set_dir(led, gpio.dir_out)
gpio.set_output(led, 0)
func = gpio.query_func_value(button, 'gpio') # 查找 GPIO_11 目標(biāo)功能編號
# 'gpio' 指基本輸入輸出功能
gpio.set_func(button, func) # 設(shè)置 GPIO_11 為基本輸入輸出
gpio.set_dir(button, gpio.dir_in) # 設(shè)置 GPIO_11 作為輸入使用
gpio.set_pull(button, gpio.pull_up) # 設(shè)置 GPIO_11 的初始態(tài)為高電平
gpio.set_isr_mode(button, gpio.fall_low) # 設(shè)置 GPIO_11 在從高電平到低電平
# 轉(zhuǎn)換時觸發(fā)中斷
# 設(shè)置 btton_callback 為中斷觸發(fā)時會調(diào)用的函數(shù)
gpio.register_isr_func(button, button_callback, [os.get_tick()])
while True:
os.sleep(1)
gpio.gpio_deinit()
這個示例比上一個復(fù)雜了一些,然而,本質(zhì)卻依舊是 GPIO 外設(shè)控制。在硬件連接上,第 11 號 GPIO 引腳接入了一個按鍵,其目的是接收按鍵的信號,既然是接收信號那么顯然 GPIO 基本功能應(yīng)該設(shè)置為“輸入”(與連接 LED 的第 7 號 GPIO 基本功能設(shè)置相反)。并且,將初始狀態(tài)設(shè)置為高電平(pull up)態(tài),當(dāng)引腳電平從高電平轉(zhuǎn)為低電平(按鍵被按下)時觸發(fā)中斷。最后,設(shè)置中斷觸發(fā)后調(diào)用的函數(shù)為 button_callback,當(dāng)這個函數(shù)被調(diào)用時會通過 GPIO_7 改變外接 LED 燈的狀態(tài)。
整個過程如下圖所示:
相信大家已經(jīng)迫不及待想要動手實戰(zhàn),體驗一下 Python 操作外設(shè)的快感了。
操作步驟
下載附件中的 libdtpython.a 并存儲到 /code/vendor/hisi/hi3861/hi3861/build/libs (詳見前一篇帖子)
編寫 Python 代碼并使用工具 Txt2CStr.exe 轉(zhuǎn)換為 C 數(shù)組(詳見前一篇帖子)
將轉(zhuǎn)換后的代碼加入附件中的 demo 工程中編譯并執(zhí)行
注意事項
由于在 Python 中提供了 i2c 相關(guān)接口,因此,需要改動文件 user_config.mk。
路徑:
/code/vendor/hisi/hi3861/hi3861/build/config/usr_config.mk
配置:
CONFIG_I2C_SUPPORT=y
代碼已經(jīng)開源,歡迎下載體驗!
https://gitee.com/openharmony-sig/python
-
python
+關(guān)注
關(guān)注
56文章
4811瀏覽量
85096 -
SDK
+關(guān)注
關(guān)注
3文章
1048瀏覽量
46351 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3753瀏覽量
16708
原文標(biāo)題:使用Python開發(fā)OpenHarmony設(shè)備程序-GPIO外設(shè)控制
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
GPIO使用教程 GPIO接口應(yīng)用
迅為RK3568開發(fā)板篇OpenHarmony實操HDF驅(qū)動控制LED-接口函數(shù)
GPIO模塊與其他外設(shè)的連接方法
樹莓派gpio有什么用,樹莓派gpio接口及編程方法
基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony
![基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用<b class='flag-5'>開發(fā)</b>:Hello<b class='flag-5'>Openharmony</b>](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
Openharmony軟件評估指南-米爾瑞芯微RK3568開發(fā)板
第二屆大會回顧第25期 | OpenHarmony上的Python設(shè)備應(yīng)用開發(fā)
![第二屆大會回顧第25期 | <b class='flag-5'>OpenHarmony</b>上的<b class='flag-5'>Python</b><b class='flag-5'>設(shè)備</b>應(yīng)用<b class='flag-5'>開發(fā)</b>](https://file1.elecfans.com/web2/M00/04/4E/wKgZombNTbKAGXSVAAARd6jESHY243.jpg)
如何在Android 10設(shè)備上通過App控制GPIO
用pycharm進(jìn)行python爬蟲的步驟
esp32的twai控制器的tx和rx可以用任一gpio定義嗎?
請問esp32的twai控制器的tx和rx可以用任一gpio定義嗎?
鴻蒙OpenHarmony【LED外設(shè)控制】 (基于Hi3861開發(fā)板)
![鴻蒙<b class='flag-5'>OpenHarmony</b>【LED<b class='flag-5'>外設(shè)</b><b class='flag-5'>控制</b>】 (基于Hi3861<b class='flag-5'>開發(fā)</b>板)](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
OpenHarmony南向開發(fā)案例:【智能中控屏】
![<b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)</b>案例:【智能中控屏】](https://file1.elecfans.com/web2/M00/CB/1C/wKgZomYfgqiAMRwpAACiuTXEuS8868.jpg)
OpenHarmony內(nèi)核編程實戰(zhàn)
![<b class='flag-5'>OpenHarmony</b>內(nèi)核編程實戰(zhàn)](https://file1.elecfans.com/web2/M00/8F/50/wKgZomTMciWAD54NAABOGP2pQZY452.png)
潤開鴻龍芯交通控制器設(shè)備通過OpenHarmony兼容性測評
![潤開鴻龍芯交通<b class='flag-5'>控制</b>器<b class='flag-5'>設(shè)備</b>通過<b class='flag-5'>OpenHarmony</b>兼容性測評](https://file.elecfans.com/web1/M00/C6/9F/pIYBAF9Z2ZCASlfdAABEe46tq4Y396.png)
評論