(以下內(nèi)容來自嘉賓分享,不代表 OpenHarmony 項目群工作委員會觀點)
唐佐林
Python SIG Leader、狄泰軟件訓(xùn)練營創(chuàng)始人
之前,我將 MicroPython 的解釋器給“挖”了出來,然后做了適配,成功運行于 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!我們進入正題,直接上 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 目標功能編號
# '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 引腳供使用。當 GPIO 作為輸出使用時,輸出的電信號為高電平(1)或者低電平(0),因此,只要在電路上稍加設(shè)計就可以接入外設(shè)(如:LED燈,電動機,等),并通過程序控制外設(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 # 標識 LED 燈的狀態(tài)
# 按鍵回調(diào)函數(shù)
def button_callback(arg) :
cur_tick = os.get_tick() # 獲取系統(tǒng)當前 tick 用于實現(xiàn)按鍵防抖
if cur_tick - arg[0] > 20: # 當時間流失量大于 20 tick 時
# 改變 LED 燈的狀態(tài)
global led_on
if led_on : # 當前狀態(tài)為“打開”,則關(guān)閉 LED 燈
gpio.set_output(led, 0)
led_on = False
print('LED is OFF!')
else : # 當前狀態(tài)為“關(guān)閉”,則打開 LED 燈
gpio.set_output(led, 1)
led_on = True
print('LED is ON!')
arg[0] = cur_tick # 記錄當前 tick 為下次按鍵觸發(fā)做準備
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 目標功能編號
# '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),當引腳電平從高電平轉(zhuǎn)為低電平(按鍵被按下)時觸發(fā)中斷。最后,設(shè)置中斷觸發(fā)后調(diào)用的函數(shù)為 button_callback,當這個函數(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文章
4807瀏覽量
84975 -
SDK
+關(guān)注
關(guān)注
3文章
1045瀏覽量
46183 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3744瀏覽量
16502
原文標題:使用Python開發(fā)OpenHarmony設(shè)備程序-GPIO外設(shè)控制
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論