(以下内容来自嘉宾分享,不代表 OpenHarmony 项目群工作委员会观点)
唐佐林
Python SIG Leader、狄泰软件训练营创始人
软件架构师、视觉算法工程师
之前,我将 MicroPython 的解释器给“挖”了出来,然后做了适配,成功运行于 OpenHarmony 设备(Hi3861)之上(详见前一篇帖子:《用Python开发OpenHarmony设备程序-初体验》。
为了实现最初的梦想:通过 Python 降低 OpenHarmony 设备开发的门槛。最近我又开始创作起来,大刀阔斧的在之前工作的基础上做了 Python SDK 的设计和开发。终于,现在可以直接用 Python 来控制 OpenHarmony 开发板外设了。
OK!我们进入正题,直接上 Python 代码学习!
import gpio # 导入 gpio 模块
import os # 导入 os 模块
led = 7 # GPIO_7 连接了一个 LED 灯
gpio.gpio_init() # 初始化系统 GPIO 环境
func = gpio.query_func_value(led, 'gpio') # 查找 GPIO_7 目标功能编号
# 'gpio' 指基本输入输出功能
gpio.set_func(led, func) # 设置 GPIO_7 为基本输入输出
gpio.set_dir(led, gpio.dir_out) # 设置 GPIO_7 作为输出使用
gpio.set_output(led, 1) # 设置 GPIO_7 输出高电平
# 即:点亮 GPIO_7 上的 LED 灯
while True:
os.sleep(1) # 休眠 1 秒
gpio.gpio_deinit() # 清理 GPIO 环境
在这里给大家做一点点概念上的科普,帮助大家更好的理解代码。GPIO(General Purpose Input/Output)即:通用型输入输出的简称,其物理表现形式为:可接收或输出电信号的引脚,使用者可根据需要将其作为输入(GPI)或输出(GPO)使用。并且, 一般情况下,开发板上都有多个 GPIO 引脚供使用。当 GPIO 作为输出使用时,输出的电信号为高电平(1)或者低电平(0),因此,只要在电路上稍加设计就可以接入外设(如:LED灯,电动机,等),并通过程序控制外设的状态。有了这些概念之后,上面的示例的代码理解起来就简单了!无非就是将 LED 灯(一种外设)接入第 7 号 GPIO 引脚,并通过程序设置第 7 号引脚输出高电平,点亮 LED 灯。
如果只是单纯的通过代码点亮一个 LED 灯,是真的不难,但也是真的挺无聊。所以,再给大家一个稍微复杂一点的示例:通过开关控制 LED 灯的状态。
Show me the code!
import gpio
import os
led = 7
button = 11 # GPIO_11 接入了一个按键
led_on = False # 标识 LED 灯的状态
# 按键回调函数
def button_callback(arg) :
cur_tick = os.get_tick() # 获取系统当前 tick 用于实现按键防抖
if cur_tick - arg[0] > 20: # 当时间流失量大于 20 tick 时
# 改变 LED 灯的状态
global led_on
if led_on : # 当前状态为“打开”,则关闭 LED 灯
gpio.set_output(led, 0)
led_on = False
print('LED is OFF!')
else : # 当前状态为“关闭”,则打开 LED 灯
gpio.set_output(led, 1)
led_on = True
print('LED is ON!')
arg[0] = cur_tick # 记录当前 tick 为下次按键触发做准备
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) # 设置 GPIO_11 为基本输入输出
gpio.set_dir(button, gpio.dir_in) # 设置 GPIO_11 作为输入使用
gpio.set_pull(button, gpio.pull_up) # 设置 GPIO_11 的初始态为高电平
gpio.set_isr_mode(button, gpio.fall_low) # 设置 GPIO_11 在从高电平到低电平
# 转换时触发中断
# 设置 btton_callback 为中断触发时会调用的函数
gpio.register_isr_func(button, button_callback, [os.get_tick()])
while True:
os.sleep(1)
gpio.gpio_deinit()
这个示例比上一个复杂了一些,然而,本质却依旧是 GPIO 外设控制。在硬件连接上,第 11 号 GPIO 引脚接入了一个按键,其目的是接收按键的信号,既然是接收信号那么显然 GPIO 基本功能应该设置为“输入”(与连接 LED 的第 7 号 GPIO 基本功能设置相反)。并且,将初始状态设置为高电平(pull up)态,当引脚电平从高电平转为低电平(按键被按下)时触发中断。最后,设置中断触发后调用的函数为 button_callback,当这个函数被调用时会通过 GPIO_7 改变外接 LED 灯的状态。
整个过程如下图所示:
相信大家已经迫不及待想要动手实战,体验一下 Python 操作外设的快感了。
操作步骤
下载附件中的 libdtpython.a 并存储到 /code/vendor/hisi/hi3861/hi3861/build/libs (详见前一篇帖子)
编写 Python 代码并使用工具 Txt2CStr.exe 转换为 C 数组(详见前一篇帖子)
将转换后的代码加入附件中的 demo 工程中编译并执行
注意事项
由于在 Python 中提供了 i2c 相关接口,因此,需要改动文件 user_config.mk。
路径:
/code/vendor/hisi/hi3861/hi3861/build/config/usr_config.mk
配置:
CONFIG_I2C_SUPPORT=y
代码已经开源,欢迎下载体验!
https://gitee.com/openharmony-sig/python
全部0条评论
快来发表一下你的评论吧 !