0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么用Python开发OpenHarmony设备程序-GPIO外设控制

OpenAtom OpenHarmony 来源:OpenAtom OpenHarmony 作者:唐佐林 2021-11-18 10:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

(以下内容来自嘉宾分享,不代表 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

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    57

    文章

    4856

    浏览量

    89554
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1093

    浏览量

    51178
  • OpenHarmony
    +关注

    关注

    31

    文章

    3926

    浏览量

    20702

原文标题:使用Python开发OpenHarmony设备程序-GPIO外设控制

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    触觉智能RK3576开发OpenHarmony开源鸿蒙系统USB控制传输功能示例

    本文介绍OpenHarmony开源鸿蒙系统的USB控制传输功能实现及相关代码示例,基于触觉智能RK3576开发板PurplePiOH2演示。OpenHarmony的USB通信介绍实现
    的头像 发表于 09-30 16:31 1212次阅读
    触觉智能RK3576<b class='flag-5'>开发</b>板<b class='flag-5'>OpenHarmony</b>开源鸿蒙系统USB<b class='flag-5'>控制</b>传输功能示例

    技能+1!如何在树莓派上使用C++控制GPIO

    和PiGPIO等库,C++可用于编程控制树莓派的GPIO引脚。它提供了更好的性能和控制能力,非常适合对速度和精度要求较高的硬件项目。在树莓派社区中,关于“Python
    的头像 发表于 08-06 15:33 3571次阅读
    技能+1!如何在树莓派上使用C++<b class='flag-5'>控制</b><b class='flag-5'>GPIO</b>?

    【BPI-CanMV-K230D-Zero开发板体验】+灯效控制Python编程

    ,在学习Python编程的基础上通过GPIO来实现LED灯的控制。 在开发板上,仅有的2个可供GPIO
    发表于 06-27 17:33

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制UART外设

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的UART接口,进行UART编程开发。例程将创建一个任务,通过配置UART引脚,实现UART读写操作。例程源代码:https
    的头像 发表于 04-22 14:22 785次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口<b class='flag-5'>控制</b>UART<b class='flag-5'>外设</b>

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO中断

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的GPIO中断模式,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO
    的头像 发表于 04-21 10:39 889次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口<b class='flag-5'>控制</b><b class='flag-5'>GPIO</b>中断

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO外设

    1、案例简介 本案例主要是如何在小凌派-RK2206开发板上使用IOT库的GPIO接口,进行GPIO编程开发。 例程将创建一个任务,通过配置GPIO
    发表于 04-11 15:45

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO外设

    1、案例简介本案例主要是如何在小凌派-RK2206开发板上使用IOT库的GPIO接口,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO
    的头像 发表于 04-11 15:36 1612次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口<b class='flag-5'>控制</b><b class='flag-5'>GPIO</b><b class='flag-5'>外设</b>

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制ADC外设

    (unsigned int id); 描述: 初始化ADC设备。 参数: 参数 类型 描述 id unsigned int ADC通道 ADC通道有7个,对应以下7个引脚: id GPIO 0
    发表于 04-10 16:20

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制ADC外设

    1、案例简介本案例主要讲解如何在小凌派-RK2206开发板上使用IoT库的ADC接口,进行ADC编程开发。例程内容为创建一个任务,读取按键的ADC值,并打印到串口。例程源代码:https
    的头像 发表于 04-10 16:00 705次阅读
    基于小凌派RK2206<b class='flag-5'>开发</b>板:<b class='flag-5'>OpenHarmony</b>如何使用IoT接口<b class='flag-5'>控制</b>ADC<b class='flag-5'>外设</b>

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制PWM外设

    /rk2206/samples/b16_iot_pwm 2、基础知识 PWM在日常设备中非常常见,以下我们将演示IoT库的PWM接口如何进行PWM控制。 2.1、头文件 base
    发表于 04-09 09:37

    零基础入门:如何在树莓派上编写和运行Python程序

    是一种非常有用的编程语言,其语法易于阅读,允许程序员使用比汇编、C或Java等语言更少的代码行。Python编程语言最初实际上是作为Linux的脚本语言而开发的。Py
    的头像 发表于 03-25 09:27 1515次阅读
    零基础入门:如何在树莓派上编写和运行<b class='flag-5'>Python</b><b class='flag-5'>程序</b>?

    【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发GPIO基础知识

    【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发GPIO基础知识
    的头像 发表于 03-06 11:23 1004次阅读
    【北京迅为】iTOP-RK3568<b class='flag-5'>OpenHarmony</b>系统南向驱动<b class='flag-5'>开发</b><b class='flag-5'>GPIO</b>基础知识

    GPIO使用教程 GPIO接口应用

    GPIO(General-Purpose Input/Output,通用输入/输出)接口是电子设备中的一个重要组成部分,主要用于控制和读取设备的数字信号。它通过简单的高(1)或低(0)
    的头像 发表于 01-31 10:10 5159次阅读

    迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-接口函数

    (LED)的高低电平,从而控制 LED 灯的开关。 参数:gpioGPIO 号),mode(LED 模式,开或关)。 流程:设置 GPIO 为输出方向,根据 mode 设置
    发表于 01-20 10:36

    GPIO模块与其他外设的连接方法

    在嵌入式系统设计中,GPIO模块是实现设备与外部世界交互的关键接口。它们提供了一种灵活的方式来控制和监测外部设备GPIO模块的基本概念
    的头像 发表于 01-09 09:48 1480次阅读