(以下內(nèi)容來自嘉賓分享,不代表 OpenHarmony 項(xiàng)目群工作委員會(huì)觀點(diǎn))
唐佐林
Python SIG Leader、狄泰軟件訓(xùn)練營(yíng)創(chuàng)始人
之前,我將 MicroPython 的解釋器給“挖”了出來,然后做了適配,成功運(yùn)行于 OpenHarmony 設(shè)備(Hi3861)之上(詳見前一篇帖子:《用Python開發(fā)OpenHarmony設(shè)備程序-初體驗(yàn)》。
為了實(shí)現(xiàn)最初的夢(mèng)想:通過 Python 降低 OpenHarmony 設(shè)備開發(fā)的門檻。最近我又開始創(chuàng)作起來,大刀闊斧的在之前工作的基礎(chǔ)上做了 Python SDK 的設(shè)計(jì)和開發(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 連接了一個(gè) LED 燈
gpio.gpio_init() # 初始化系統(tǒng) GPIO 環(huán)境
func = gpio.query_func_value(led, 'gpio') # 查找 GPIO_7 目標(biāo)功能編號(hà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 輸出高電平
# 即:點(diǎn)亮 GPIO_7 上的 LED 燈
while True:
os.sleep(1) # 休眠 1 秒
gpio.gpio_deinit()#清理GPIO環(huán)境
在這里給大家做一點(diǎn)點(diǎn)概念上的科普,幫助大家更好的理解代碼。GPIO(General Purpose Input/Output)即:通用型輸入輸出的簡(jiǎn)稱,其物理表現(xiàn)形式為:可接收或輸出電信號(hào)的引腳,使用者可根據(jù)需要將其作為輸入(GPI)或輸出(GPO)使用。并且, 一般情況下,開發(fā)板上都有多個(gè) GPIO 引腳供使用。當(dāng) GPIO 作為輸出使用時(shí),輸出的電信號(hào)為高電平(1)或者低電平(0),因此,只要在電路上稍加設(shè)計(jì)就可以接入外設(shè)(如:LED燈,電動(dòng)機(jī),等),并通過程序控制外設(shè)的狀態(tài)。有了這些概念之后,上面的示例的代碼理解起來就簡(jiǎn)單了!無非就是將 LED 燈(一種外設(shè))接入第 7 號(hào) GPIO 引腳,并通過程序設(shè)置第 7 號(hào)引腳輸出高電平,點(diǎn)亮 LED 燈。
如果只是單純的通過代碼點(diǎn)亮一個(gè) LED 燈,是真的不難,但也是真的挺無聊。所以,再給大家一個(gè)稍微復(fù)雜一點(diǎn)的示例:通過開關(guān)控制 LED 燈的狀態(tài)。
Show me the code!
import gpio
import os
led = 7
button = 11 # GPIO_11 接入了一個(gè)按鍵
led_on = False # 標(biāo)識(shí) LED 燈的狀態(tài)
# 按鍵回調(diào)函數(shù)
def button_callback(arg) :
cur_tick = os.get_tick() # 獲取系統(tǒng)當(dāng)前 tick 用于實(shí)現(xiàn)按鍵防抖
if cur_tick - arg[0] > 20: # 當(dāng)時(shí)間流失量大于 20 tick 時(shí)
# 改變 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)功能編號(hà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)換時(shí)觸發(fā)中斷
# 設(shè)置 btton_callback 為中斷觸發(fā)時(shí)會(huì)調(diào)用的函數(shù)
gpio.register_isr_func(button, button_callback, [os.get_tick()])
while True:
os.sleep(1)
gpio.gpio_deinit()
這個(gè)示例比上一個(gè)復(fù)雜了一些,然而,本質(zhì)卻依舊是 GPIO 外設(shè)控制。在硬件連接上,第 11 號(hào) GPIO 引腳接入了一個(gè)按鍵,其目的是接收按鍵的信號(hào),既然是接收信號(hào)那么顯然 GPIO 基本功能應(yīng)該設(shè)置為“輸入”(與連接 LED 的第 7 號(hào) GPIO 基本功能設(shè)置相反)。并且,將初始狀態(tài)設(shè)置為高電平(pull up)態(tài),當(dāng)引腳電平從高電平轉(zhuǎn)為低電平(按鍵被按下)時(shí)觸發(fā)中斷。最后,設(shè)置中斷觸發(fā)后調(diào)用的函數(shù)為 button_callback,當(dāng)這個(gè)函數(shù)被調(diào)用時(shí)會(huì)通過 GPIO_7 改變外接 LED 燈的狀態(tài)。
整個(gè)過程如下圖所示:
相信大家已經(jīng)迫不及待想要?jiǎng)邮謱?shí)戰(zhàn),體驗(yàn)一下 Python 操作外設(shè)的快感了。
操作步驟
下載附件中的 libdtpython.a 并存儲(chǔ)到 /code/vendor/hisi/hi3861/hi3861/build/libs (詳見前一篇帖子)
編寫 Python 代碼并使用工具 Txt2CStr.exe 轉(zhuǎn)換為 C 數(shù)組(詳見前一篇帖子)
將轉(zhuǎn)換后的代碼加入附件中的 demo 工程中編譯并執(zhí)行
注意事項(xiàng)
由于在 Python 中提供了 i2c 相關(guān)接口,因此,需要改動(dòng)文件 user_config.mk。
路徑:
/code/vendor/hisi/hi3861/hi3861/build/config/usr_config.mk
配置:
CONFIG_I2C_SUPPORT=y
代碼已經(jīng)開源,歡迎下載體驗(yàn)!
https://gitee.com/openharmony-sig/python
-
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86182 -
SDK
+關(guān)注
關(guān)注
3文章
1065瀏覽量
47693 -
OpenHarmony
+關(guān)注
關(guān)注
27文章
3831瀏覽量
18154
原文標(biāo)題:使用Python開發(fā)OpenHarmony設(shè)備程序-GPIO外設(shè)控制
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制UART外設(shè)

基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷

基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)

基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設(shè)
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設(shè)

基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制PWM外設(shè)
零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行Python程序?

【北京迅為】iTOP-RK3568OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開發(fā)GPIO基礎(chǔ)知識(shí)

GPIO使用教程 GPIO接口應(yīng)用
迅為RK3568開發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)控制LED-接口函數(shù)
GPIO模塊與其他外設(shè)的連接方法
基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony

第二屆大會(huì)回顧第25期 | OpenHarmony上的Python設(shè)備應(yīng)用開發(fā)

評(píng)論